{
  "schema_version": "2.0.0",
  "scope": "all-active",
  "registry_version": "8be1e7e000de709a9acc0793086bc9efe90450914f6163ee083aedbcf3f81072",
  "counts": {
    "supported": 1010,
    "strict_unit_contracts": 50,
    "labelled_form_adapters": 958,
    "interactive": 2,
    "review_hold": 100,
    "planned": 1890
  },
  "execution_policy": {
    "unit_conversion": "Strict-unit adapters retain approved conversions; labelled forms require exactly the units shown.",
    "random_actions": "Only after a visitor presses Flip coin or Pick a name.",
    "chaining": "not enabled",
    "review_holds": "excluded",
    "retrieval": "Bounded shortlist, no example values provided to the model."
  },
  "tools": [
    {
      "id": "CC-001",
      "name": "Percentage of a number",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "A percentage is a fraction of 100. Multiply the base number by the percentage divided by 100.",
      "url": "/calculators/percentage-of-a-number/",
      "version": "3b5804c3dcde010eac709f602e86aaec4cf5b3dc5d8871fe8417ae7dc678b633",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Number",
          "type": "number",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Percentage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Amount",
          "type": "number",
          "unit": "same-unit",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "A percentage is a fraction of 100. Multiply the base number by the percentage divided by 100."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Amount",
          "text": "a × b ÷ 100"
        }
      ],
      "example_questions": [
        "What is 15 percent of 200?",
        "Calculate a percentage of a number"
      ],
      "retrieval_phrases": [
        "percentage of",
        "percent of"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 15
          },
          "outputs": [
            {
              "label": "Amount",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-002",
      "name": "Percentage change",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Use the original value as the denominator. A negative result means a decrease.",
      "url": "/calculators/percentage-change/",
      "version": "6fa9e73ccb03a638de2e02ab3f427d1e625240f3dc0ed1b325323bf17eada993",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Original value",
          "type": "number",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "New value",
          "type": "number",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Change (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Absolute change",
          "type": "number",
          "unit": "same-unit",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Use the original value as the denominator. A negative result means a decrease."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Change (%)",
          "text": "(b-a) ÷ a × 100"
        },
        {
          "label": "Absolute change",
          "text": "b-a"
        }
      ],
      "example_questions": [
        "What is the percentage increase from 80 to 100?",
        "How much did a value decrease in percent?"
      ],
      "retrieval_phrases": [
        "decrease in percent",
        "percentage increase",
        "percentage decrease",
        "percent increase",
        "percent decrease",
        "percentage change"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 100
          },
          "outputs": [
            {
              "label": "Change (%)",
              "value": 25
            },
            {
              "label": "Absolute change",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-003",
      "name": "Percentage difference",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Percentage difference uses the mean of the two values as its baseline, rather than treating either value as the original. Both values must not be zero.",
      "url": "/calculators/percentage-difference/",
      "version": "822dad21cac05c3ab80f5b3da4d8afa47e1b242d11fd82ba5352674a15722c41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "First value",
          "type": "number",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Second value",
          "type": "number",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Difference (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Percentage difference uses the mean of the two values as its baseline, rather than treating either value as the original. Both values must not be zero."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Difference (%)",
          "text": "abs(a-b) ÷ ((a+b) ÷ 2) × 100"
        }
      ],
      "example_questions": [
        "Find the symmetric percentage difference between two readings",
        "Percentage difference using their average"
      ],
      "retrieval_phrases": [
        "percentage difference",
        "symmetric percentage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 120
          },
          "outputs": [
            {
              "label": "Difference (%)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-004",
      "name": "Reverse percentage",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Divide the final amount by one plus the percentage change. Enter a negative rate for a decrease. A decrease of 100% cannot be reversed uniquely.",
      "url": "/calculators/reverse-percentage/",
      "version": "ba971ac4c9ea3712b25a576c13e989959c629063b7110c70cb32160b44e5d774",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Final value",
          "type": "number",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Change (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "exclusiveMinimum": -100
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Original value",
          "type": "number",
          "unit": "same-unit",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Divide the final amount by one plus the percentage change. Enter a negative rate for a decrease. A decrease of 100% cannot be reversed uniquely."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Original value",
          "text": "a ÷ (1+b ÷ 100)"
        }
      ],
      "example_questions": [
        "Find the original amount before a percentage increase",
        "Reverse a percentage change"
      ],
      "retrieval_phrases": [
        "reverse a percentage",
        "original amount",
        "reverse percentage",
        "original value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 20
          },
          "outputs": [
            {
              "label": "Original value",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-005",
      "name": "Percentage points",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Subtract percentages for percentage points. Relative percentage change instead divides that difference by the original percentage.",
      "url": "/calculators/percentage-points/",
      "version": "37092aa403616e1af1ae8eb32be336c0f6f24c58e78aca7b9394a01f6a15214d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original percentage",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New percentage",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Percentage-point change",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Relative change (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Subtract percentages for percentage points. Relative percentage change instead divides that difference by the original percentage."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Percentage-point change",
          "text": "b − a"
        },
        {
          "label": "Relative change (%)",
          "text": "(b − a) / a × 100; undefined when a = 0."
        }
      ],
      "example_questions": [
        "Use the Percentage points calculator.",
        "Help me calculate percentage points."
      ],
      "retrieval_phrases": [
        "Percentage points",
        "percentage points"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 25
          },
          "outputs": [
            {
              "label": "Percentage-point change",
              "value": 5
            },
            {
              "label": "Relative change (%)",
              "value": 25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-006",
      "name": "Discount and sale price",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Apply the discount to the original price. Taxes, shipping and other charges are not included.",
      "url": "/calculators/discount-and-sale-price/",
      "version": "40f3511e2ccaf19eca4cd8f16ced48c797bbd99f747196dbfa46720d97b5d3c1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Original price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Discount (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0,
          "maximum": 100
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sale price (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Saving (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Apply the discount to the original price. Taxes, shipping and other charges are not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sale price (£)",
          "text": "a × (1-b ÷ 100)"
        },
        {
          "label": "Saving (£)",
          "text": "a × b ÷ 100"
        }
      ],
      "example_questions": [
        "What is the sale price after a discount?",
        "How much do I save with 25 percent off?"
      ],
      "retrieval_phrases": [
        "discount",
        "sale price",
        "percent off"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 25
          },
          "outputs": [
            {
              "label": "Sale price (£)",
              "value": 60
            },
            {
              "label": "Saving (£)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-007",
      "name": "Successive discounts",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Apply discounts in sequence. Two discounts of 10% and 20% produce a 28% reduction, not 30%.",
      "url": "/calculators/successive-discounts/",
      "version": "99af3f8a992482ed514d09f075f43967e401aead692cbbee9f7e8542c8b49842",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Original price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Discounts (%), separated by commas",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "items": {
            "type": "number",
            "minimum": 0,
            "maximum": 100
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final price (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Apply discounts in sequence. Two discounts of 10% and 20% produce a 28% reduction, not 30%."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final price (£)",
          "text": "Start at a. For each percentage x in b, multiply the current price by (1 − x/100)."
        }
      ],
      "example_questions": [
        "Apply successive discounts to a price",
        "What is the final price after sequential discounts?"
      ],
      "retrieval_phrases": [
        "successive discounts",
        "sequential discounts",
        "discounts in sequence"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "10,20"
          },
          "outputs": [
            {
              "label": "Final price (£)",
              "value": 72.00000000000001
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-008",
      "name": "Tip and bill split",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "The tip applies to the entered bill. Shares are displayed rounded, so settle any penny remainder separately.",
      "url": "/calculators/tip-and-bill-split/",
      "version": "258ac06e12bdb30f441f7353e45df36f0bd488389a1c7286dadfc086116a6239",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Bill (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tip (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "People",
          "type": "integer",
          "required": true,
          "unit": "person",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Per person (£)",
          "type": "number",
          "unit": "GBP/person",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Total (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_3",
          "label": "Tip (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "The tip applies to the entered bill. Shares are displayed rounded, so settle any penny remainder separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Per person (£)",
          "text": "a × (1+b ÷ 100) ÷ c"
        },
        {
          "label": "Total (£)",
          "text": "a × (1+b ÷ 100)"
        },
        {
          "label": "Tip (£)",
          "text": "a × b ÷ 100"
        }
      ],
      "example_questions": [
        "Split a restaurant bill with a tip",
        "What should each person pay for dinner?"
      ],
      "retrieval_phrases": [
        "tip",
        "split bill",
        "split a bill",
        "split a restaurant bill",
        "each person pay",
        "bill split"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Per person (£)",
              "value": 55.00000000000001
            },
            {
              "label": "Total (£)",
              "value": 110.00000000000001
            },
            {
              "label": "Tip (£)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-009",
      "name": "Unequal bill split",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Split shared charges evenly and apply the same tip percentage to each resulting share. Enter one subtotal per person.",
      "url": "/calculators/unequal-bill-split/",
      "version": "9463324b8de215262ecd256f7d3e2bd15949083d86806e05ecacfa2b70eff1fa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Individual item totals (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Shared charges (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Tip (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Individual amounts (£)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Split shared charges evenly and apply the same tip percentage to each resulting share. Enter one subtotal per person."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Individual amounts (£)",
          "text": "For each subtotal x in a: (x + b/count(a)) × (1+c/100)."
        },
        {
          "label": "Total (£)",
          "text": "(sum(a)+b) × (1+c/100)."
        }
      ],
      "example_questions": [
        "Use the Unequal bill split calculator.",
        "Help me calculate unequal bill split."
      ],
      "retrieval_phrases": [
        "Unequal bill split",
        "unequal bill split"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,30",
            "b": 10,
            "c": 10
          },
          "outputs": [
            {
              "label": "Individual amounts (£)",
              "value": "27.500000000000004, 38.5"
            },
            {
              "label": "Total (£)",
              "value": 66
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-010",
      "name": "Unit price comparison",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Use the same quantity unit for both packs. Compare price per unit rather than pack price.",
      "url": "/calculators/unit-price-comparison/",
      "version": "e0df459a7dca6082273a5e46faf94427da6bb385a0f809f62d9a29ccb6afc196",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Pack A price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Pack A quantity",
          "type": "number",
          "required": true,
          "unit": "common-quantity",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Pack B price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Pack B quantity",
          "type": "number",
          "required": true,
          "unit": "common-quantity",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "A unit price (£)",
          "type": "number",
          "unit": "GBP/common-quantity",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "B unit price (£)",
          "type": "number",
          "unit": "GBP/common-quantity",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_3",
          "label": "Better value",
          "type": "string",
          "unit": "none",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Use the same quantity unit for both packs. Compare price per unit rather than pack price."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "A unit price (£)",
          "text": "a/b"
        },
        {
          "label": "B unit price (£)",
          "text": "c/d"
        },
        {
          "label": "Better value",
          "text": "Compare a/b and c/d. The lower unit price wins; equal ratios return Equal."
        }
      ],
      "example_questions": [
        "Which pack is better value for money?",
        "Compare price per unit for two packs"
      ],
      "retrieval_phrases": [
        "unit price",
        "price per unit",
        "better value",
        "compare packs"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6,
            "b": 3,
            "c": 9,
            "d": 5
          },
          "outputs": [
            {
              "label": "A unit price (£)",
              "value": 2
            },
            {
              "label": "B unit price (£)",
              "value": 1.8
            },
            {
              "label": "Better value",
              "value": "Pack B"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-011",
      "name": "Proportional allocation",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Each allocation equals the total multiplied by its weight divided by all weights combined. Display rounding may leave a small remainder.",
      "url": "/calculators/proportional-allocation/",
      "version": "dcc65348fd6c380a9fdf0a0cba9d7b61ae7ce6b14d0813c3039a073d589127e7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total to allocate",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Allocations",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each allocation equals the total multiplied by its weight divided by all weights combined. Display rounding may leave a small remainder."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Allocations",
          "text": "For each weight w in b: a × w/sum(b). All allocations are zero when a = 0."
        }
      ],
      "example_questions": [
        "Use the Proportional allocation calculator.",
        "Help me calculate proportional allocation."
      ],
      "retrieval_phrases": [
        "Proportional allocation",
        "proportional allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "1,2,1"
          },
          "outputs": [
            {
              "label": "Allocations",
              "value": "25, 50, 25"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-012",
      "name": "Ratio simplifier",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Divide every term by the greatest common divisor. This preserves the relative proportions.",
      "url": "/calculators/ratio-simplifier/",
      "version": "8a6bda3bb1eaa6e028347e4bfd675e4354d7b86a0995487d0a3d730ee6d5df4c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Positive integer ratio terms",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Reduced ratio",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Divide every term by the greatest common divisor. This preserves the relative proportions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Reduced ratio",
          "text": "Find the greatest common divisor of all entries in a; divide each entry by it."
        }
      ],
      "example_questions": [
        "Use the Ratio simplifier calculator.",
        "Help me calculate ratio simplifier."
      ],
      "retrieval_phrases": [
        "Ratio simplifier",
        "ratio simplifier"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "12,18,24"
          },
          "outputs": [
            {
              "label": "Reduced ratio",
              "value": "2 : 3 : 4"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-013",
      "name": "Ratio scaling",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Distribute the required total in proportion to the entered ratio.",
      "url": "/calculators/ratio-scaling/",
      "version": "47ffa1d63fea40c3df5036bd07bd7fa084c98764baed29c6ccf7adfb7486e426",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Ratio terms",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Total quantity",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Scaled quantities",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Distribute the required total in proportion to the entered ratio."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Scaled quantities",
          "text": "For each ratio part x in a: b × x/sum(a)."
        }
      ],
      "example_questions": [
        "Use the Ratio scaling calculator.",
        "Help me calculate ratio scaling."
      ],
      "retrieval_phrases": [
        "Ratio scaling",
        "ratio scaling"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": 100
          },
          "outputs": [
            {
              "label": "Scaled quantities",
              "value": "40, 60"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-014",
      "name": "Average calculator",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "The arithmetic mean is the sum divided by the number of values. Every entry has equal weight.",
      "url": "/calculators/average-calculator/",
      "version": "1cdea54384df710ee21c888a5c831c558703e9da9573a6dfa3a11e88689ee214",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Numbers",
          "type": "array",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mean",
          "type": "number",
          "unit": "same-unit",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Sum",
          "type": "number",
          "unit": "same-unit",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_3",
          "label": "Count",
          "type": "number",
          "unit": "count",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "The arithmetic mean is the sum divided by the number of values. Every entry has equal weight."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mean",
          "text": "sum(a) ÷ count(a)"
        },
        {
          "label": "Sum",
          "text": "sum(a)"
        },
        {
          "label": "Count",
          "text": "count(a)"
        }
      ],
      "example_questions": [
        "Find the arithmetic mean of my numbers",
        "Calculate an arithmetic average"
      ],
      "retrieval_phrases": [
        "arithmetic mean",
        "arithmetic average",
        "average calculator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,4,6"
          },
          "outputs": [
            {
              "label": "Mean",
              "value": 4
            },
            {
              "label": "Sum",
              "value": 12
            },
            {
              "label": "Count",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-015",
      "name": "Weighted average",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Multiply each value by its corresponding weight, add the products, then divide by the sum of the weights.",
      "url": "/calculators/weighted-average/",
      "version": "25f313e9cc0383340923280b6245409751744b09b72b79febc198edc512620c8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Values",
          "type": "array",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Weights",
          "type": "array",
          "required": true,
          "unit": "weight",
          "unit_status": "explicit",
          "items": {
            "type": "number",
            "minimum": 0
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weighted mean",
          "type": "number",
          "unit": "same-unit",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Multiply each value by its corresponding weight, add the products, then divide by the sum of the weights."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weighted mean",
          "text": "Multiply each value in a by the corresponding weight in b, add those products, then divide by sum(b)."
        }
      ],
      "example_questions": [
        "Calculate the weighted average of these values",
        "Find a weighted mean"
      ],
      "retrieval_phrases": [
        "weighted average",
        "weighted mean"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "1,3"
          },
          "outputs": [
            {
              "label": "Weighted mean",
              "value": 17.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-016",
      "name": "Rounding calculator",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Rounds using JavaScript number formatting. Binary floating-point ties can differ from exact decimal accounting rules.",
      "url": "/calculators/rounding-calculator/",
      "version": "9451adec1044f2ee9969b10880a2f31e4dce2755d323a513595d6fe15da1a9b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Number",
          "type": "number",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit"
        },
        {
          "key": "b",
          "label": "Decimal places",
          "type": "integer",
          "required": true,
          "unit": "decimal-place",
          "unit_status": "explicit",
          "minimum": 0,
          "maximum": 10
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Rounded value",
          "type": "number",
          "unit": "same-unit",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Rounds using JavaScript number formatting. Binary floating-point ties can differ from exact decimal accounting rules."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Rounded value",
          "text": "Round a to b decimal places using the browser’s number formatting, then return the numeric value. Binary floating-point rounding can differ from exact decimal rounding."
        }
      ],
      "example_questions": [
        "Round a number to decimal places",
        "Use the rounding calculator"
      ],
      "retrieval_phrases": [
        "decimal places",
        "decimal place",
        "rounding calculator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12.345,
            "b": 2
          },
          "outputs": [
            {
              "label": "Rounded value",
              "value": 12.35
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-017",
      "name": "Significant figures",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Significant figures count meaningful digits starting with the first nonzero digit.",
      "url": "/calculators/significant-figures/",
      "version": "b93045de6701f1c55cd14eec643e28678c6a6c32813a85fb5f92075e9f6e9821",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Number",
          "type": "number",
          "required": true,
          "unit": "same-unit",
          "unit_status": "explicit"
        },
        {
          "key": "b",
          "label": "Significant figures",
          "type": "integer",
          "required": true,
          "unit": "significant-figure",
          "unit_status": "explicit",
          "minimum": 1,
          "maximum": 15
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Rounded value",
          "type": "number",
          "unit": "same-unit",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Significant figures count meaningful digits starting with the first nonzero digit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Rounded value",
          "text": "Round a to b significant figures, starting at its first nonzero digit. Return a numeric value, so trailing zeros are not preserved."
        }
      ],
      "example_questions": [
        "Round a number to significant figures",
        "Show my number to three significant figures"
      ],
      "retrieval_phrases": [
        "significant figures",
        "significant figure"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12345,
            "b": 3
          },
          "outputs": [
            {
              "label": "Rounded value",
              "value": 12300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-018",
      "name": "Fraction arithmetic",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Use exact integer fractions for the selected operation. The result is reduced by its greatest common divisor.",
      "url": "/calculators/fraction-arithmetic/",
      "version": "90acad3e2774cc517efa6f0056e93c94fd6ce43409f00733296835d3d4925f8e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First numerator",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "First denominator",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Second numerator",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Second denominator",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Operation (+, -, *, /)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Reduced fraction",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use exact integer fractions for the selected operation. The result is reduced by its greatest common divisor."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Reduced fraction",
          "text": "fractionArithmetic(a,b,c,d,e)"
        }
      ],
      "example_questions": [
        "Use the Fraction arithmetic calculator.",
        "Help me calculate fraction arithmetic."
      ],
      "retrieval_phrases": [
        "Fraction arithmetic",
        "fraction arithmetic"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 2,
            "c": 1,
            "d": 3,
            "e": "+"
          },
          "outputs": [
            {
              "label": "Reduced fraction",
              "value": "5/6"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-019",
      "name": "Mixed number converter",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "For this non-negative mixed number, multiply the whole part by the denominator and add the numerator.",
      "url": "/calculators/mixed-number-converter/",
      "version": "0e8a831f526fe7eea308a732622e6ffe8386ed59798b2e34d0a75626878463c9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Whole part",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Numerator",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Denominator",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Improper fraction",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Decimal",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "For this non-negative mixed number, multiply the whole part by the denominator and add the numerator."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Improper fraction",
          "text": "reduceFraction(a × c+b,c)"
        },
        {
          "label": "Decimal",
          "text": "a+b ÷ c"
        }
      ],
      "example_questions": [
        "Use the Mixed number converter calculator.",
        "Help me calculate mixed number converter."
      ],
      "retrieval_phrases": [
        "Mixed number converter",
        "mixed number converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 1,
            "c": 3
          },
          "outputs": [
            {
              "label": "Improper fraction",
              "value": "7/3"
            },
            {
              "label": "Decimal",
              "value": 2.3333333333333335
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-020",
      "name": "Decimal to fraction",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Converts a finite decimal string exactly, including a leading minus sign. Repeating-decimal notation is not accepted.",
      "url": "/calculators/decimal-to-fraction/",
      "version": "66d3cf522feca02d3f6d3fe4b57bac9269f261e857e47a02d9409328f5780ae0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Finite decimal",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Exact fraction",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Converts a finite decimal string exactly, including a leading minus sign. Repeating-decimal notation is not accepted."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Exact fraction",
          "text": "decimalFraction(a)"
        }
      ],
      "example_questions": [
        "Use the Decimal to fraction calculator.",
        "Help me calculate decimal to fraction."
      ],
      "retrieval_phrases": [
        "Decimal to fraction",
        "decimal to fraction"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0.125"
          },
          "outputs": [
            {
              "label": "Exact fraction",
              "value": "1/8"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-021",
      "name": "Coin flipper",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Each flip uses one bit from the browser’s cryptographic random generator. Heads and tails are equally likely on each independent flip. A short sequence need not contain equal counts.",
      "url": "/calculators/coin-flipper/",
      "version": "881e4bcb6016c7a3bf98d092c0d37137a19c46917c2b136568505b6f56e8d5de",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [],
      "outputs": [],
      "assumptions": [
        "Each flip uses one bit from the browser’s cryptographic random generator. Heads and tails are equally likely on each independent flip. A short sequence need not contain equal counts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Selection method",
          "text": "Draw a uniformly distributed index from two outcomes using the browser’s cryptographic random generator: index 0 is Heads, index 1 is Tails. Update the session tally only when a flip completes."
        }
      ],
      "example_questions": [
        "Use the Coin flipper calculator.",
        "Help me calculate coin flipper."
      ],
      "retrieval_phrases": [
        "Coin flipper",
        "coin flipper"
      ],
      "examples": [],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": "coin",
      "finder_supported": true
    },
    {
      "id": "CC-022",
      "name": "Random name picker",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Selects one entry uniformly using rejection sampling over browser-generated random integers. Duplicate lines count as separate entries; remove them first if every person should have one chance.",
      "url": "/calculators/random-name-picker/",
      "version": "068d5dcab1e72e7369e66a81e3ff1f8fec3db77fc56b904876e996b7e6fea118",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "One name per line",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [],
      "assumptions": [
        "Selects one entry uniformly using rejection sampling over browser-generated random integers. Duplicate lines count as separate entries; remove them first if every person should have one chance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Selection method",
          "text": "Trim each input line and discard blank lines. Generate a random 32-bit unsigned integer; reject values at or above floor(2^32/n) × n, where n is the entry count. Take the remainder on division by n to select a zero-based line. Duplicate names remain separate entries."
        }
      ],
      "example_questions": [
        "Use the Random name picker calculator.",
        "Help me calculate random name picker."
      ],
      "retrieval_phrases": [
        "Random name picker",
        "random name picker"
      ],
      "examples": [],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": "picker",
      "finder_supported": true
    },
    {
      "id": "CC-023",
      "name": "Order of operations",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Supports numbers, parentheses and + − × ÷ ^. Uses a bounded mathematical parser, never JavaScript evaluation. Exponentiation is right-associative.",
      "url": "/calculators/order-of-operations/",
      "version": "9c327032399cfc11dccd0d4f01392c4edd0ee24b435fc9e102790f9a228aec39",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Expression",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Result",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supports numbers, parentheses and + − × ÷ ^. Uses a bounded mathematical parser, never JavaScript evaluation. Exponentiation is right-associative."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Result",
          "text": "evaluateExpression(a)"
        }
      ],
      "example_questions": [
        "Use the Order of operations calculator.",
        "Help me calculate order of operations."
      ],
      "retrieval_phrases": [
        "Order of operations",
        "order of operations"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2 + 3 * (4 - 1)"
          },
          "outputs": [
            {
              "label": "Result",
              "value": 11
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-024",
      "name": "Change-making calculator",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Uses standard GBP coin and note denominations, rounding both entered amounts to pennies.",
      "url": "/calculators/change-making-calculator/",
      "version": "69de15b0ca9bd50dd5d23f237aecbc1fb9e0f771aca79edac8860fc275b6ce68",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cash paid (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Change due (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "GBP denominations",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses standard GBP coin and note denominations, rounding both entered amounts to pennies."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Change due (£)",
          "text": "round((b-a) × 100) ÷ 100"
        },
        {
          "label": "GBP denominations",
          "text": "GBPchange(a,b)"
        }
      ],
      "example_questions": [
        "Use the Change-making calculator calculator.",
        "Help me calculate change-making calculator."
      ],
      "retrieval_phrases": [
        "Change-making calculator",
        "change making calculator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 7.35,
            "b": 10
          },
          "outputs": [
            {
              "label": "Change due (£)",
              "value": 2.65
            },
            {
              "label": "GBP denominations",
              "value": "1 × £2.00; 1 × £0.50; 1 × £0.10; 1 × £0.05"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-025",
      "name": "Expense settlement",
      "category": "Everyday arithmetic",
      "status": "available",
      "purpose": "Enter people in the same order in both lists. Total paid must equal total owed. This returns a valid settlement, not necessarily every possible solution.",
      "url": "/calculators/expense-settlement/",
      "version": "12f3385e3ac039aa9b2a009438f4ca917ef6a348987e5270a57f5d158248f43f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Amounts paid (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Amounts owed (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Settlement transfers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter people in the same order in both lists. Total paid must equal total owed. This returns a valid settlement, not necessarily every possible solution."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Settlement transfers",
          "text": "settlement(a,b)"
        }
      ],
      "example_questions": [
        "Use the Expense settlement calculator.",
        "Help me calculate expense settlement."
      ],
      "retrieval_phrases": [
        "Expense settlement",
        "expense settlement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "60,0,0",
            "b": "20,20,20"
          },
          "outputs": [
            {
              "label": "Settlement transfers",
              "value": "Person 2 → Person 1: £20.00; Person 3 → Person 1: £20.00"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-026",
      "name": "Compound interest",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Interest compounds monthly at the nominal annual rate divided by 12. Deposits arrive at month end. No fees, taxes or inflation are deducted.",
      "url": "/calculators/compound-interest/",
      "version": "837cb667031438198440dae80ecab7d1fcf0be6034759c9a56dcd11885213714",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Initial balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly deposit (£)",
          "type": "number",
          "required": true,
          "unit": "GBP/month",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual nominal rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0,
          "maximum": 100
        },
        {
          "key": "d",
          "label": "Years",
          "type": "integer",
          "required": true,
          "unit": "year",
          "unit_status": "explicit",
          "minimum": 1e-9,
          "maximum": 100
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final balance (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Contributed (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_3",
          "label": "Interest (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Interest compounds monthly at the nominal annual rate divided by 12. Deposits arrive at month end. No fees, taxes or inflation are deducted."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final balance (£)",
          "text": "Let q = c/1200 and n = 12 × d. Final balance = a × (1+q)^n + b × ((1+q)^n−1)/q. At zero interest, use a + b × n."
        },
        {
          "label": "Contributed (£)",
          "text": "a + b × 12 × d."
        },
        {
          "label": "Interest (£)",
          "text": "Final balance − contributed amount."
        }
      ],
      "example_questions": [
        "How will my savings grow with monthly deposits and compound interest?",
        "Calculate compound interest over 20 years"
      ],
      "retrieval_phrases": [
        "compound interest",
        "monthly deposits",
        "monthly savings"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 250,
            "c": 5,
            "d": 20
          },
          "outputs": [
            {
              "label": "Final balance (£)",
              "value": 129884.81998373989
            },
            {
              "label": "Contributed (£)",
              "value": 70000
            },
            {
              "label": "Interest (£)",
              "value": 59884.819983739886
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-027",
      "name": "Simple interest",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Simple interest applies only to the original principal: principal × annual rate × years.",
      "url": "/calculators/simple-interest/",
      "version": "0b03a78e3e901434d4e0a7cf901b5aaed1b3c03e7f36179c62062453281d1e03",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Years",
          "type": "number",
          "required": true,
          "unit": "year",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Interest (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Final balance (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Simple interest applies only to the original principal: principal × annual rate × years."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Interest (£)",
          "text": "a × b ÷ 100 × c"
        },
        {
          "label": "Final balance (£)",
          "text": "a × (1+b ÷ 100 × c)"
        }
      ],
      "example_questions": [
        "Calculate simple interest on my principal",
        "Interest without compounding"
      ],
      "retrieval_phrases": [
        "simple interest",
        "without compounding"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 5,
            "c": 2
          },
          "outputs": [
            {
              "label": "Interest (£)",
              "value": 100
            },
            {
              "label": "Final balance (£)",
              "value": 1100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-028",
      "name": "Savings target contribution",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Assumes monthly compounding and deposits at month end. A target already met by the projected starting balance needs no further deposit.",
      "url": "/calculators/savings-target-contribution/",
      "version": "219ff85b6c26f2ab169e0441a747196f6d67e36ad894794fe580379c3a97bdb9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Target (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0,
          "maximum": 100
        },
        {
          "key": "d",
          "label": "Years",
          "type": "integer",
          "required": true,
          "unit": "year",
          "unit_status": "explicit",
          "minimum": 1,
          "maximum": 100
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly contribution (£)",
          "type": "number",
          "unit": "GBP/month",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Assumes monthly compounding and deposits at month end. A target already met by the projected starting balance needs no further deposit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly contribution (£)",
          "text": "Let q = c/1200 and n = 12d. If q = 0, contribution = max(0, (a−b)/n). Otherwise contribution = max(0, (a − b × (1+q)^n) / (((1+q)^n−1)/q))."
        }
      ],
      "example_questions": [
        "Find the required monthly contribution for my savings target",
        "Calculate a savings target contribution"
      ],
      "retrieval_phrases": [
        "required monthly contribution",
        "savings target contribution",
        "reach my savings target"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12000,
            "b": 0,
            "c": 0,
            "d": 2
          },
          "outputs": [
            {
              "label": "Monthly contribution (£)",
              "value": 500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-029",
      "name": "Time to savings goal",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Simulates month-end deposits and monthly interest. Stops after 1,200 months and reports an unreachable or longer-horizon target.",
      "url": "/calculators/time-to-savings-goal/",
      "version": "2795f61bfbe6f6448bf31c9d73c17af2cd81f447ed348d7f73faa82c56c30bca",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starting balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly deposit (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Months to target",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Simulates month-end deposits and monthly interest. Stops after 1,200 months and reports an unreachable or longer-horizon target."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Months to target",
          "text": "monthsToGoal(a,b,c,d)"
        }
      ],
      "example_questions": [
        "Use the Time to savings goal calculator.",
        "Help me calculate time to savings goal."
      ],
      "retrieval_phrases": [
        "Time to savings goal",
        "time to savings goal"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0,
            "b": 1200,
            "c": 100,
            "d": 0
          },
          "outputs": [
            {
              "label": "Months to target",
              "value": 12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-030",
      "name": "Inflation-adjusted money",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "A constant inflation assumption compounds each year. This is a scenario, not an inflation forecast.",
      "url": "/calculators/inflation-adjusted-money/",
      "version": "0dd19c1d5daf25d47131557b1c660e6970c1f5a4cbe610a2e7d1f3085899b582",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Amount (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Inflation assumption (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Years",
          "type": "number",
          "required": true,
          "unit": "year",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Future equivalent (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Today’s purchasing power (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "A constant inflation assumption compounds each year. This is a scenario, not an inflation forecast."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Future equivalent (£)",
          "text": "a × (1+b ÷ 100)^c"
        },
        {
          "label": "Today’s purchasing power (£)",
          "text": "a ÷ (1+b ÷ 100)^c"
        }
      ],
      "example_questions": [
        "How does inflation change purchasing power?",
        "Adjust money for inflation"
      ],
      "retrieval_phrases": [
        "inflation",
        "purchasing power"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 5,
            "c": 2
          },
          "outputs": [
            {
              "label": "Future equivalent (£)",
              "value": 1102.5
            },
            {
              "label": "Today’s purchasing power (£)",
              "value": 907.0294784580499
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-031",
      "name": "Effective annual rate",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "The effective rate includes interest on interest: (1 + nominal rate / periods)^periods − 1.",
      "url": "/calculators/effective-annual-rate/",
      "version": "839b93b6604203a66f4f5c3389902f7851225b6d7fdfc39e1958fecf04f045ad",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0,
          "maximum": 100
        },
        {
          "key": "b",
          "label": "Compounds per year",
          "type": "integer",
          "required": true,
          "unit": "times/year",
          "unit_status": "explicit",
          "minimum": 1,
          "maximum": 100000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Effective annual rate (%)",
          "type": "number",
          "unit": "percent/year",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "The effective rate includes interest on interest: (1 + nominal rate / periods)^periods − 1."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Effective annual rate (%)",
          "text": "((1+a ÷ 100 ÷ b)^b-1) × 100"
        }
      ],
      "example_questions": [
        "Convert nominal interest to an effective annual rate",
        "What is the effective annual interest rate?"
      ],
      "retrieval_phrases": [
        "effective annual rate",
        "effective annual interest"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 12
          },
          "outputs": [
            {
              "label": "Effective annual rate (%)",
              "value": 12.682503013196971
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-032",
      "name": "Present value",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Discount the future amount by the periodic growth factor raised to the number of periods.",
      "url": "/calculators/present-value/",
      "version": "1a6a698efcca89157aecc171a95624a828df94bf031b86da167e76a4fb15ab75",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Future amount (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Discount rate per period (%)",
          "type": "number",
          "required": true,
          "unit": "percent/period",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Periods",
          "type": "number",
          "required": true,
          "unit": "period",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Present value (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Discount the future amount by the periodic growth factor raised to the number of periods."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Present value (£)",
          "text": "a ÷ (1+b ÷ 100)^c"
        }
      ],
      "example_questions": [
        "Find the present value of a future payment",
        "Calculate present value using a periodic discount rate"
      ],
      "retrieval_phrases": [
        "present value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1100,
            "b": 10,
            "c": 1
          },
          "outputs": [
            {
              "label": "Present value (£)",
              "value": 999.9999999999999
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-033",
      "name": "Future value of a lump sum",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "This lump sum has no additional contributions. Match the rate period to the number of periods.",
      "url": "/calculators/future-value-of-a-lump-sum/",
      "version": "1feaf5b44486bfb763ab3a8d282e7d127dd1facc4ddd125eb53205e6b8703d89",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Initial amount (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rate per period (%)",
          "type": "number",
          "required": true,
          "unit": "percent/period",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Periods",
          "type": "number",
          "required": true,
          "unit": "period",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Future value (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "This lump sum has no additional contributions. Match the rate period to the number of periods."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Future value (£)",
          "text": "a × (1+b ÷ 100)^c"
        }
      ],
      "example_questions": [
        "What will a lump sum be worth?",
        "Future value with no additional contributions"
      ],
      "retrieval_phrases": [
        "lump sum",
        "no additional contributions"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Future value (£)",
              "value": 1210.0000000000002
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-034",
      "name": "Annuity value",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "An ordinary annuity pays at each period end. The zero-rate limit is payment × number of payments.",
      "url": "/calculators/annuity-value/",
      "version": "55e0308733f7de3ec749e0387ab3ded7970fb5e2616818967cb949e73bb73406",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Payment per period (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rate per period (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Number of payments",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Future value (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Present value (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An ordinary annuity pays at each period end. The zero-rate limit is payment × number of payments."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Future value (£)",
          "text": "Let q = b/100. Future value = a × ((1+q)^c−1)/q; if q = 0, use a × c."
        },
        {
          "label": "Present value (£)",
          "text": "Let q = b/100. Present value = a × (1−(1+q)^(−c))/q; if q = 0, use a × c."
        }
      ],
      "example_questions": [
        "Use the Annuity value calculator.",
        "Help me calculate annuity value."
      ],
      "retrieval_phrases": [
        "Annuity value",
        "annuity value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 0,
            "c": 12
          },
          "outputs": [
            {
              "label": "Future value (£)",
              "value": 1200
            },
            {
              "label": "Present value (£)",
              "value": 1200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-035",
      "name": "Savings contribution growth",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "The monthly deposit increases once at each year boundary. Interest is applied monthly before each deposit.",
      "url": "/calculators/savings-contribution-growth/",
      "version": "233b61341b70f970d93018509419858fad0c3ca545dfe2e5244d0e07769988b9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Starting balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Initial monthly deposit (£)",
          "type": "number",
          "required": true,
          "unit": "GBP/month",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual deposit increase (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Annual nominal return (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Years",
          "type": "integer",
          "required": true,
          "unit": "year",
          "unit_status": "explicit",
          "minimum": 1e-9,
          "maximum": 100
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final balance (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "The monthly deposit increases once at each year boundary. Interest is applied monthly before each deposit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final balance (£)",
          "text": "growingDeposits(a,b,c,d,e)"
        }
      ],
      "example_questions": [
        "What if I increase my savings deposit each year?",
        "Savings with increasing monthly contributions"
      ],
      "retrieval_phrases": [
        "increase my savings deposit",
        "increasing monthly contributions",
        "annual deposit increase"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0,
            "b": 100,
            "c": 10,
            "d": 0,
            "e": 2
          },
          "outputs": [
            {
              "label": "Final balance (£)",
              "value": 2520
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-036",
      "name": "Savings rate",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Use income and savings measured over the same period. A figure over 100% can reflect transfers or a mismatched period.",
      "url": "/calculators/savings-rate/",
      "version": "80fd1c0b9684a61ffd21206d8c1285bf605012207c56415bde995162b60a402b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Net income (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Amount saved (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Savings rate (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Use income and savings measured over the same period. A figure over 100% can reflect transfers or a mismatched period."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Savings rate (%)",
          "text": "b ÷ a × 100"
        }
      ],
      "example_questions": [
        "Calculate my savings rate from net income and amount saved",
        "What share of my income am I saving?"
      ],
      "retrieval_phrases": [
        "savings rate",
        "share of my income"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3000,
            "b": 600
          },
          "outputs": [
            {
              "label": "Savings rate (%)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-037",
      "name": "Emergency fund target",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Multiply essential monthly expenses by the coverage period you choose. This tool does not prescribe a reserve size.",
      "url": "/calculators/emergency-fund-target/",
      "version": "a499fcf94821ebbcf19922107c35c248ba2ddc712f685276c54c6e22637a4069",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly essentials (£)",
          "type": "number",
          "required": true,
          "unit": "GBP/month",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target months",
          "type": "number",
          "required": true,
          "unit": "month",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Existing reserve (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Target reserve (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Shortfall (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Multiply essential monthly expenses by the coverage period you choose. This tool does not prescribe a reserve size."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Target reserve (£)",
          "text": "a × b"
        },
        {
          "label": "Shortfall (£)",
          "text": "max(0,a × b-c)"
        }
      ],
      "example_questions": [
        "How large is my emergency fund target?",
        "Work out an emergency reserve shortfall"
      ],
      "retrieval_phrases": [
        "emergency fund",
        "emergency reserve"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1500,
            "b": 6,
            "c": 3000
          },
          "outputs": [
            {
              "label": "Target reserve (£)",
              "value": 9000
            },
            {
              "label": "Shortfall (£)",
              "value": 6000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-038",
      "name": "Budget allocation",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Percentages need not total 100%; the unallocated result highlights a gap or overspend.",
      "url": "/calculators/budget-allocation/",
      "version": "5f1bf4672a16cdbc7ad0f55215bafe1a52b0fabdd58044df4a0c80087de9d952",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Income (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Category percentages",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Category amounts (£)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unallocated (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Percentages need not total 100%; the unallocated result highlights a gap or overspend."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Category amounts (£)",
          "text": "For each percentage x in b: a × x/100."
        },
        {
          "label": "Unallocated (£)",
          "text": "a × (1 − sum(b)/100). A negative result indicates over-allocation."
        }
      ],
      "example_questions": [
        "Use the Budget allocation calculator.",
        "Help me calculate budget allocation."
      ],
      "retrieval_phrases": [
        "Budget allocation",
        "budget allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3000,
            "b": "50,30,20"
          },
          "outputs": [
            {
              "label": "Category amounts (£)",
              "value": "1500, 900, 600"
            },
            {
              "label": "Unallocated (£)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-039",
      "name": "Subscription spending",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Enter monthly-billed and annual-billed subscriptions separately. No currency conversion is applied.",
      "url": "/calculators/subscription-spending/",
      "version": "23f0d5ef535d3f9ef5a3d6dc39361ebd94c05c9924e7800fb1f128b006faeab2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly subscription prices (£)",
          "type": "array",
          "required": true,
          "unit": "GBP/month",
          "unit_status": "explicit",
          "items": {
            "type": "number",
            "minimum": 0
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Annual subscription prices (£)",
          "type": "array",
          "required": true,
          "unit": "GBP/year",
          "unit_status": "explicit",
          "items": {
            "type": "number",
            "minimum": 0
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual total (£)",
          "type": "number",
          "unit": "GBP/year",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Monthly equivalent (£)",
          "type": "number",
          "unit": "GBP/month",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Enter monthly-billed and annual-billed subscriptions separately. No currency conversion is applied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual total (£)",
          "text": "sum(a) × 12+sum(b)"
        },
        {
          "label": "Monthly equivalent (£)",
          "text": "sum(a)+sum(b) ÷ 12"
        }
      ],
      "example_questions": [
        "How much do my subscriptions cost each year?",
        "Total my monthly and annual subscriptions"
      ],
      "retrieval_phrases": [
        "subscriptions",
        "subscription spending"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,15,5",
            "b": "120"
          },
          "outputs": [
            {
              "label": "Annual total (£)",
              "value": 480
            },
            {
              "label": "Monthly equivalent (£)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-040",
      "name": "Sinking fund planner",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Divide the remaining funding gap by the number of scheduled deposits before the deadline. No interest is assumed.",
      "url": "/calculators/sinking-fund-planner/",
      "version": "df3d8753f463a9e13f39fab6f408fa73bcc527da9ffcebc1e2d37845533f97aa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Target (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Already saved (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Remaining deposits",
          "type": "integer",
          "required": true,
          "unit": "deposit",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Deposit needed (£)",
          "type": "number",
          "unit": "GBP/deposit",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Divide the remaining funding gap by the number of scheduled deposits before the deadline. No interest is assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Deposit needed (£)",
          "text": "max(0,(a-b) ÷ c)"
        }
      ],
      "example_questions": [
        "Plan my sinking fund contributions",
        "Divide a funding gap by the remaining deposits"
      ],
      "retrieval_phrases": [
        "sinking fund",
        "remaining deposits"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1200,
            "b": 200,
            "c": 10
          },
          "outputs": [
            {
              "label": "Deposit needed (£)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-041",
      "name": "Net worth",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Use current estimated values and outstanding debts, counted once each.",
      "url": "/calculators/net-worth/",
      "version": "32857e7c34e5e965d79dfe487dfad0eed9d649098f2dddab513c0ec444c1ce43",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Assets (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "items": {
            "type": "number",
            "minimum": 0
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Liabilities (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "items": {
            "type": "number",
            "minimum": 0
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net worth (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Assets (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_3",
          "label": "Liabilities (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Use current estimated values and outstanding debts, counted once each."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net worth (£)",
          "text": "sum(a)-sum(b)"
        },
        {
          "label": "Assets (£)",
          "text": "sum(a)"
        },
        {
          "label": "Liabilities (£)",
          "text": "sum(b)"
        }
      ],
      "example_questions": [
        "Find my net worth from assets and liabilities",
        "Calculate net worth including all debts"
      ],
      "retrieval_phrases": [
        "net worth"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10000,5000",
            "b": "3000,2000"
          },
          "outputs": [
            {
              "label": "Net worth (£)",
              "value": 10000
            },
            {
              "label": "Assets (£)",
              "value": 15000
            },
            {
              "label": "Liabilities (£)",
              "value": 5000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-042",
      "name": "Cash runway",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Assumes income and expenses stay constant. A fractional month is an arithmetic estimate.",
      "url": "/calculators/cash-runway/",
      "version": "ad9ab2780565ffb4d21a95759cfa486e4a8d2edd1b96258a2bcb08c249930a73",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cash (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly income (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly expenses (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Runway (months)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Monthly net flow (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes income and expenses stay constant. A fractional month is an arithmetic estimate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Runway (months)",
          "text": "If expenses c exceed income b: a/(c−b). Otherwise report no cash burn under these assumptions."
        },
        {
          "label": "Monthly net flow (£)",
          "text": "b − c"
        }
      ],
      "example_questions": [
        "Use the Cash runway calculator.",
        "Help me calculate cash runway."
      ],
      "retrieval_phrases": [
        "Cash runway",
        "cash runway"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12000,
            "b": 2000,
            "c": 3000
          },
          "outputs": [
            {
              "label": "Runway (months)",
              "value": 12
            },
            {
              "label": "Monthly net flow (£)",
              "value": -1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-043",
      "name": "Real return",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Use the ratio of gross return and price-growth factors, rather than simply subtracting the rates.",
      "url": "/calculators/real-return/",
      "version": "f365f263a387b38c9f03329769757d1b6a125ea436a22c04904a74f3d38279c4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal return (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Inflation (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Real return (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the ratio of gross return and price-growth factors, rather than simply subtracting the rates."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Real return (%)",
          "text": "((1+a ÷ 100) ÷ (1+b ÷ 100)-1) × 100"
        }
      ],
      "example_questions": [
        "Use the Real return calculator.",
        "Help me calculate real return."
      ],
      "retrieval_phrases": [
        "Real return",
        "real return"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 5
          },
          "outputs": [
            {
              "label": "Real return (%)",
              "value": 4.761904761904767
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-044",
      "name": "Investment fee impact",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Models fees as a fixed subtraction from the annual nominal return, then compounds monthly. Real fee timing and taxes can differ.",
      "url": "/calculators/investment-fee-impact/",
      "version": "44418dd71cc1ae13c0fd4065e81ea15cf6746b0d05239fba6241452a6b1bbf6e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Initial balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly deposit (£)",
          "type": "number",
          "required": true,
          "unit": "GBP/month",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Gross annual nominal return (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Annual fee (percentage points)",
          "type": "number",
          "required": true,
          "unit": "percentage-point/year",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Years",
          "type": "integer",
          "required": true,
          "unit": "year",
          "unit_status": "explicit",
          "minimum": 1e-9,
          "maximum": 100
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Balance reduction (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Net projected balance (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Models fees as a fixed subtraction from the annual nominal return, then compounds monthly. Real fee timing and taxes can differ."
      ],
      "constraints": {
        "relations": [
          {
            "left": "d",
            "operator": "<=",
            "right": "c",
            "message": "The fee must not exceed the gross return."
          }
        ],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Balance reduction (£)",
          "text": "savingsBalance(a,b,c,e)-savingsBalance(a,b,c-d,e)"
        },
        {
          "label": "Net projected balance (£)",
          "text": "savingsBalance(a,b,c-d,e)"
        }
      ],
      "example_questions": [
        "How much do investment fees reduce my balance?",
        "Compare investment returns after fees"
      ],
      "retrieval_phrases": [
        "investment fees",
        "investment fee",
        "returns after fees"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 100,
            "c": 5,
            "d": 1,
            "e": 10
          },
          "outputs": [
            {
              "label": "Balance reduction (£)",
              "value": 2365.0156247396953
            },
            {
              "label": "Net projected balance (£)",
              "value": 29633.30729672993
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-045",
      "name": "Dividend income scenario",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Assumes a constant holding value and yield. Payouts and capital values are not guaranteed.",
      "url": "/calculators/dividend-income-scenario/",
      "version": "981be702d65412863ac6da81c5afa8df193a10f66f01010214dd0fdf21306dac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Holding value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Assumed annual yield (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Payments per year",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual income (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Income per payment (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes a constant holding value and yield. Payouts and capital values are not guaranteed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual income (£)",
          "text": "a × b ÷ 100"
        },
        {
          "label": "Income per payment (£)",
          "text": "a × b ÷ 100 ÷ c"
        }
      ],
      "example_questions": [
        "Use the Dividend income scenario calculator.",
        "Help me calculate dividend income scenario."
      ],
      "retrieval_phrases": [
        "Dividend income scenario",
        "dividend income scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 4,
            "c": 4
          },
          "outputs": [
            {
              "label": "Annual income (£)",
              "value": 400
            },
            {
              "label": "Income per payment (£)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-046",
      "name": "Portfolio allocation",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Target weights must sum to 100%. This allocates values only; it does not recommend investments.",
      "url": "/calculators/portfolio-allocation/",
      "version": "1e093cdb5b098068123ab39475850614e8adb99fe3be7c7ebe66dbbf9973eabd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Portfolio total (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target weights (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Target holdings (£)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Target weights must sum to 100%. This allocates values only; it does not recommend investments."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Target holdings (£)",
          "text": "For each target percentage x in b: a × x/100. The percentages must total 100."
        }
      ],
      "example_questions": [
        "Use the Portfolio allocation calculator.",
        "Help me calculate portfolio allocation."
      ],
      "retrieval_phrases": [
        "Portfolio allocation",
        "portfolio allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": "60,40"
          },
          "outputs": [
            {
              "label": "Target holdings (£)",
              "value": "6000, 4000"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-047",
      "name": "Currency exchange cost",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Deduct source-currency fees before conversion. Enter your actual quote; no live exchange rate is fetched.",
      "url": "/calculators/currency-exchange-cost/",
      "version": "5ea4b01966df1939ebf8fe488d865c27060d3e15918ed35df9314727bad3df45",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Source amount",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Exchange rate (target per source)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fee (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Fixed fee in source currency",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Target amount",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Source fees",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Deduct source-currency fees before conversion. Enter your actual quote; no live exchange rate is fetched."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Target amount",
          "text": "(a × (1-c ÷ 100)-d) × b"
        },
        {
          "label": "Source fees",
          "text": "a × c ÷ 100+d"
        }
      ],
      "example_questions": [
        "Use the Currency exchange cost calculator.",
        "Help me calculate currency exchange cost."
      ],
      "retrieval_phrases": [
        "Currency exchange cost",
        "currency exchange cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 1.2,
            "c": 2,
            "d": 1
          },
          "outputs": [
            {
              "label": "Target amount",
              "value": 116.39999999999999
            },
            {
              "label": "Source fees",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-048",
      "name": "Foreign purchase comparison",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "All delivery and extra charges must already be in the home currency. No tax or duty rate is inferred.",
      "url": "/calculators/foreign-purchase-comparison/",
      "version": "300461d9b01a7101e36691fdaeca8e39cb99553aa947f85351413aea83016223",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Foreign price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Exchange rate (home per foreign)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Delivery in home currency",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other entered charges",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Local price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Landed cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Saving versus local",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All delivery and extra charges must already be in the home currency. No tax or duty rate is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Landed cost",
          "text": "a × b+c+d"
        },
        {
          "label": "Saving versus local",
          "text": "e-(a × b+c+d)"
        }
      ],
      "example_questions": [
        "Use the Foreign purchase comparison calculator.",
        "Help me calculate foreign purchase comparison."
      ],
      "retrieval_phrases": [
        "Foreign purchase comparison",
        "foreign purchase comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 0.8,
            "c": 10,
            "d": 5,
            "e": 100
          },
          "outputs": [
            {
              "label": "Landed cost",
              "value": 95
            },
            {
              "label": "Saving versus local",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-049",
      "name": "Education savings goal",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Each study year’s cost grows separately. This estimates the funding target, without assuming investment returns.",
      "url": "/calculators/education-savings-goal/",
      "version": "52adf9e028d2a752ec782c184f1626b938ecea2ea379b6a8f2e931725d79b7d0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current annual study cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cost growth (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Years until start",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Years of study",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Already saved (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated total future cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Gap before investment returns (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each study year’s cost grows separately. This estimates the funding target, without assuming investment returns."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated total future cost (£)",
          "text": "For each study year i from 0 through d−1, calculate a × (1+b/100)^(c+i). Add those annual costs."
        },
        {
          "label": "Gap before investment returns (£)",
          "text": "max(0, estimated total future cost − e)."
        }
      ],
      "example_questions": [
        "Use the Education savings goal calculator.",
        "Help me calculate education savings goal."
      ],
      "retrieval_phrases": [
        "Education savings goal",
        "education savings goal"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 0,
            "c": 5,
            "d": 3,
            "e": 0
          },
          "outputs": [
            {
              "label": "Estimated total future cost (£)",
              "value": 30000
            },
            {
              "label": "Gap before investment returns (£)",
              "value": 30000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-050",
      "name": "Retirement spending runway",
      "category": "Saving and personal budgets",
      "status": "available",
      "purpose": "Withdraw at each year start, then apply the assumed annual return. Constant-return scenarios omit market volatility and are not retirement advice.",
      "url": "/calculators/retirement-spending-runway/",
      "version": "c99d8eab74206773077eaa2346e0de6feded1feaa8c8a8debab1bbefc6fa4687",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starting fund (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Initial annual withdrawal (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual return (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Annual withdrawal inflation (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Horizon years",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Years funded",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Withdraw at each year start, then apply the assumed annual return. Constant-return scenarios omit market volatility and are not retirement advice."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Years funded",
          "text": "fundedYears(a,b,c,d,e)"
        }
      ],
      "example_questions": [
        "Use the Retirement spending runway calculator.",
        "Help me calculate retirement spending runway."
      ],
      "retrieval_phrases": [
        "Retirement spending runway",
        "retirement spending runway"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100000,
            "b": 10000,
            "c": 0,
            "d": 0,
            "e": 20
          },
          "outputs": [
            {
              "label": "Years funded",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-051",
      "name": "Loan repayment",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Fixed-rate amortising loan with monthly payments at month end. The annual nominal rate is divided by 12; fees are excluded.",
      "url": "/calculators/loan-repayment/",
      "version": "fec0480a6ac68af0b061eba4a0b5004ab8b8a6233f9f72328ea3f535bbe94738",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Nominal annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent/year",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Term in months",
          "type": "integer",
          "required": true,
          "unit": "month",
          "unit_status": "explicit",
          "minimum": 1e-9,
          "maximum": 1200
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly payment (£)",
          "type": "number",
          "unit": "GBP/month",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Total interest (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Fixed-rate amortising loan with monthly payments at month end. The annual nominal rate is divided by 12; fees are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly payment (£)",
          "text": "Let q = b/1200. Monthly payment = a × q/(1−(1+q)^(−c)). At zero interest, use a/c."
        },
        {
          "label": "Total interest (£)",
          "text": "Monthly payment × c − a."
        }
      ],
      "example_questions": [
        "What is my monthly loan repayment?",
        "Calculate a fixed rate loan payment"
      ],
      "retrieval_phrases": [
        "loan repayment",
        "loan payment",
        "loan payments",
        "monthly payment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1200,
            "b": 0,
            "c": 12
          },
          "outputs": [
            {
              "label": "Monthly payment (£)",
              "value": 100
            },
            {
              "label": "Total interest (£)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-052",
      "name": "Loan overpayment",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Extra payments start with the first regular payment. Interest accrues monthly. No prepayment penalty is included.",
      "url": "/calculators/loan-overpayment/",
      "version": "3647ddad64fd68b988befea001592ff1acbaa07d81fa324a3038c24eb6eeb75f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Original term (months)",
          "type": "integer",
          "required": true,
          "unit": "months",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Extra monthly payment (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Months to payoff",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Interest (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Extra payments start with the first regular payment. Interest accrues monthly. No prepayment penalty is included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Months to payoff",
          "text": "Calculate the standard monthly payment with q = b/1200: a × q/(1−(1+q)^(−c)), or a/c at zero interest. Add d. Each month add balance × q interest, then subtract the payment capped at the amount owed. Count months until the balance is below £0.0000001, with a 1,200-month limit."
        },
        {
          "label": "Interest (£)",
          "text": "Add the interest charged in every simulated month, including the final partial-payment month."
        }
      ],
      "example_questions": [
        "Use the Loan overpayment calculator.",
        "Help me calculate loan overpayment."
      ],
      "retrieval_phrases": [
        "Loan overpayment",
        "loan overpayment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1200,
            "b": 0,
            "c": 12,
            "d": 100
          },
          "outputs": [
            {
              "label": "Months to payoff",
              "value": 6
            },
            {
              "label": "Interest (£)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-053",
      "name": "Loan affordability",
      "category": "Loans and property",
      "status": "available",
      "purpose": "This is payment arithmetic, not a lender affordability assessment. Other expenses, underwriting and fees are excluded.",
      "url": "/calculators/loan-affordability/",
      "version": "08b49e1a0484cd98ad6e3f7311d39736b2c51d0bdff99d296abe8e808131f2de",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Affordable monthly payment (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Nominal annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Term in months",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Modelled principal (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This is payment arithmetic, not a lender affordability assessment. Other expenses, underwriting and fees are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Modelled principal (£)",
          "text": "Let q = b/1200. Principal = a × (1−(1+q)^(−c))/q. At zero interest, principal = a × c."
        }
      ],
      "example_questions": [
        "Use the Loan affordability calculator.",
        "Help me calculate loan affordability."
      ],
      "retrieval_phrases": [
        "Loan affordability",
        "loan affordability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 0,
            "c": 12
          },
          "outputs": [
            {
              "label": "Modelled principal (£)",
              "value": 1200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-054",
      "name": "Loan refinance break-even",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Simple fee recovery compares payment savings only. A longer replacement term can cost more overall even with lower payments; compare full repayment totals separately.",
      "url": "/calculators/loan-refinance-break-even/",
      "version": "59381fc80de0066c5584404bb1fcc72eb3343d93cc787818583dc166aaaba5b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Existing balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Old annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Old months remaining",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "New rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "New term months",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Refinance fees (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly saving (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Simple fee recovery (months)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Simple fee recovery compares payment savings only. A longer replacement term can cost more overall even with lower payments; compare full repayment totals separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly saving (£)",
          "text": "monthlyPayment(a, b, c) − monthlyPayment(a, d, e), using the definition below."
        },
        {
          "label": "Simple fee recovery (months)",
          "text": "If the monthly saving is positive: f / monthly saving. Otherwise report no monthly saving."
        }
      ],
      "example_questions": [
        "Use the Loan refinance break-even calculator.",
        "Help me calculate loan refinance break-even."
      ],
      "retrieval_phrases": [
        "Loan refinance break-even",
        "loan refinance break even"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 8,
            "c": 60,
            "d": 5,
            "e": 60,
            "f": 500
          },
          "outputs": [
            {
              "label": "Monthly saving (£)",
              "value": 14.05160644402747
            },
            {
              "label": "Simple fee recovery (months)",
              "value": 35.583120121651376
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-055",
      "name": "Flat versus reducing interest",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Flat interest is charged against the original principal throughout the term. The reducing-balance loan amortises monthly.",
      "url": "/calculators/flat-versus-reducing-interest/",
      "version": "1582f9df0cd29d12ea4b3db882297a29449b26d9b6661dcf262bee294c83b135",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual flat rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual reducing-balance rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Term in years",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Flat-rate total (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Reducing-balance total (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Flat interest is charged against the original principal throughout the term. The reducing-balance loan amortises monthly."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Flat-rate total (£)",
          "text": "a × (1+b ÷ 100 × d)"
        },
        {
          "label": "Reducing-balance total (£)",
          "text": "monthlyPayment(a,c,d × 12) × d × 12"
        }
      ],
      "example_questions": [
        "Use the Flat versus reducing interest calculator.",
        "Help me calculate flat versus reducing interest."
      ],
      "retrieval_phrases": [
        "Flat versus reducing interest",
        "flat versus reducing interest"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 10,
            "c": 10,
            "d": 2
          },
          "outputs": [
            {
              "label": "Flat-rate total (£)",
              "value": 1200
            },
            {
              "label": "Reducing-balance total (£)",
              "value": 1107.4782321003963
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-056",
      "name": "Balloon loan",
      "category": "Loans and property",
      "status": "available",
      "purpose": "The balloon is paid at the term end, in addition to the final regular payment. Fees are excluded.",
      "url": "/calculators/balloon-loan/",
      "version": "9896bfaa2b7475dd143bf801b5787587aad6a4d72ab84736c663f11387b22510",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual nominal rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Months",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Final balloon (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly payment (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The balloon is paid at the term end, in addition to the final regular payment. Fees are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly payment (£)",
          "text": "Let q = b/1200. Payment = (a − d/(1+q)^c) × q/(1−(1+q)^(−c)). At zero interest, payment = (a−d)/c."
        }
      ],
      "example_questions": [
        "Use the Balloon loan calculator.",
        "Help me calculate balloon loan."
      ],
      "retrieval_phrases": [
        "Balloon loan",
        "balloon loan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1200,
            "b": 0,
            "c": 12,
            "d": 600
          },
          "outputs": [
            {
              "label": "Monthly payment (£)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-057",
      "name": "Interest-only loan",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Interest-only payments do not reduce principal. A separate repayment of the full principal is required.",
      "url": "/calculators/interest-only-loan/",
      "version": "c3b3108e62a244da56c0003bdefc28215cbde443ca57eb9b22f51749a6c9cff6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Years",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly interest (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total interest (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Principal still owed (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Interest-only payments do not reduce principal. A separate repayment of the full principal is required."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly interest (£)",
          "text": "a × b ÷ 1200"
        },
        {
          "label": "Total interest (£)",
          "text": "a × b ÷ 100 × c"
        },
        {
          "label": "Principal still owed (£)",
          "text": "a"
        }
      ],
      "example_questions": [
        "Use the Interest-only loan calculator.",
        "Help me calculate interest-only loan."
      ],
      "retrieval_phrases": [
        "Interest-only loan",
        "interest only loan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 6,
            "c": 2
          },
          "outputs": [
            {
              "label": "Monthly interest (£)",
              "value": 50
            },
            {
              "label": "Total interest (£)",
              "value": 1200
            },
            {
              "label": "Principal still owed (£)",
              "value": 10000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-058",
      "name": "Credit card payoff",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Uses monthly interest and treats new spending as reducing the effective payment. Actual daily card interest and minimum-payment rules can differ.",
      "url": "/calculators/credit-card-payoff/",
      "version": "eb2f5c6ed11a6f45397826dc1e7d422645579333e0104202d41b1d80dc9dd345",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Card balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual nominal rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly payment (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "New monthly spending (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Months to payoff",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Interest (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses monthly interest and treats new spending as reducing the effective payment. Actual daily card interest and minimum-payment rules can differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Months to payoff",
          "text": "Effective payment = c−d. Starting at a, add balance × b/1200 each month, then subtract the effective payment capped at the amount owed. Count months until the balance is below £0.0000001, up to 1,200 months. A payment not covering initial interest is rejected; a zero starting balance takes zero months."
        },
        {
          "label": "Interest (£)",
          "text": "Sum the interest charged across all simulated months."
        }
      ],
      "example_questions": [
        "Use the Credit card payoff calculator.",
        "Help me calculate credit card payoff."
      ],
      "retrieval_phrases": [
        "Credit card payoff",
        "credit card payoff"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1200,
            "b": 0,
            "c": 100,
            "d": 0
          },
          "outputs": [
            {
              "label": "Months to payoff",
              "value": 12
            },
            {
              "label": "Interest (£)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-059",
      "name": "Debt avalanche schedule",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Pay required amounts first, then direct remaining budget to the highest rate. Released payments are rolled into the next debt. This is a simplified monthly model.",
      "url": "/calculators/debt-avalanche-schedule/",
      "version": "3d2d600eadf03bfaac095b773a2acb9f9afe35928ea6f68794cce3f8e82daeb8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Balances (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Annual rates (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Minimum monthly payments (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Extra monthly budget (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Months to debt free",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Interest (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Pay required amounts first, then direct remaining budget to the highest rate. Released payments are rolled into the next debt. This is a simplified monthly model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Months to debt free",
          "text": "Keep monthly budget = sum(c)+d. Add each balance’s monthly interest at its annual percentage/1200, then pay its minimum capped at the amount owed. Apply remaining budget to the highest-rate outstanding debt first. Repeat until all balances are repaid, up to the 100-year horizon."
        },
        {
          "label": "Interest (£)",
          "text": "Add all interest charged to all debts during the simulation."
        }
      ],
      "example_questions": [
        "Use the Debt avalanche schedule calculator.",
        "Help me calculate debt avalanche schedule."
      ],
      "retrieval_phrases": [
        "Debt avalanche schedule",
        "debt avalanche schedule"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,500",
            "b": "10,20",
            "c": "50,25",
            "d": 100
          },
          "outputs": [
            {
              "label": "Months to debt free",
              "value": 9
            },
            {
              "label": "Interest (£)",
              "value": 74.38450664432975
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-060",
      "name": "Debt snowball schedule",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Pay required amounts first, then direct remaining budget to the smallest outstanding balance. No new borrowing is modelled.",
      "url": "/calculators/debt-snowball-schedule/",
      "version": "33867874b782c948d593d663de1073c38bb78920433c5228036eb5bbeea11398",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Balances (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Annual rates (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Minimum monthly payments (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Extra monthly budget (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Months to debt free",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Interest (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Pay required amounts first, then direct remaining budget to the smallest outstanding balance. No new borrowing is modelled."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Months to debt free",
          "text": "Keep monthly budget = sum(c)+d. Add each balance’s monthly interest at its annual percentage/1200, then pay its minimum capped at the amount owed. Apply remaining budget to the smallest remaining balance first. Repeat until all balances are repaid, up to the 100-year horizon."
        },
        {
          "label": "Interest (£)",
          "text": "Add all interest charged to all debts during the simulation."
        }
      ],
      "example_questions": [
        "Use the Debt snowball schedule calculator.",
        "Help me calculate debt snowball schedule."
      ],
      "retrieval_phrases": [
        "Debt snowball schedule",
        "debt snowball schedule"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,500",
            "b": "10,20",
            "c": "50,25",
            "d": 100
          },
          "outputs": [
            {
              "label": "Months to debt free",
              "value": 9
            },
            {
              "label": "Interest (£)",
              "value": 74.38450664432975
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-061",
      "name": "Mortgage deposit",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Deposit percentage is chosen by you. Closing costs and lending eligibility are not included.",
      "url": "/calculators/mortgage-deposit/",
      "version": "1703ccd2be8609b6ca7460f4a7a9db586ef001db3deb425e95fe139451366ad4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Property price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Deposit (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0,
          "maximum": 100
        },
        {
          "key": "c",
          "label": "Already saved (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Deposit needed (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Gap (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Deposit percentage is chosen by you. Closing costs and lending eligibility are not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Deposit needed (£)",
          "text": "a × b ÷ 100"
        },
        {
          "label": "Gap (£)",
          "text": "max(0,a × b ÷ 100-c)"
        }
      ],
      "example_questions": [
        "How much deposit do I need for a house?",
        "Find my mortgage deposit savings gap"
      ],
      "retrieval_phrases": [
        "mortgage deposit",
        "deposit for a house",
        "deposit do i need for a house",
        "house deposit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200000,
            "b": 10,
            "c": 15000
          },
          "outputs": [
            {
              "label": "Deposit needed (£)",
              "value": 20000
            },
            {
              "label": "Gap (£)",
              "value": 5000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-062",
      "name": "Loan-to-value",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Divide the secured loan balance by the property value. This does not predict lender approval.",
      "url": "/calculators/loan-to-value/",
      "version": "ecd288451ff8c8de75ae5afeeec23f497286bb5e0f09cc9166321b1251dc423c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Loan (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Property value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Loan-to-value (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Divide the secured loan balance by the property value. This does not predict lender approval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Loan-to-value (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [
        "Calculate loan-to-value for my mortgage",
        "Find my loan to value ratio"
      ],
      "retrieval_phrases": [
        "loan to value",
        "ltv"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 150000,
            "b": 200000
          },
          "outputs": [
            {
              "label": "Loan-to-value (%)",
              "value": 75
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-063",
      "name": "Debt-to-income",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Measure income and debt payments over the same month. No approval threshold is applied.",
      "url": "/calculators/debt-to-income/",
      "version": "00fda0e512bfbae1a41c80178346b10efe4d59068ba4f1cae425d5c0280c3c81",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly debt payments (£)",
          "type": "number",
          "required": true,
          "unit": "GBP/month",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Gross monthly income (£)",
          "type": "number",
          "required": true,
          "unit": "GBP/month",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Debt-to-income (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Measure income and debt payments over the same month. No approval threshold is applied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Debt-to-income (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [
        "Calculate debt-to-income using monthly debt payments and gross income",
        "Find my debt to income ratio"
      ],
      "retrieval_phrases": [
        "debt to income",
        "dti"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 600,
            "b": 3000
          },
          "outputs": [
            {
              "label": "Debt-to-income (%)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-064",
      "name": "Mortgage points break-even",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Compares monthly payment savings with the upfront cost, excluding tax effects, opportunity costs and early payoff.",
      "url": "/calculators/mortgage-points-break-even/",
      "version": "05f1e31207afa5da47f0b3ea088738f5d1b059caf90f99ba0b8c221e7858ea0a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Loan (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Standard rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reduced rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Months",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Points cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly saving (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Simple break-even (months)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares monthly payment savings with the upfront cost, excluding tax effects, opportunity costs and early payoff."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly saving (£)",
          "text": "monthlyPayment(a, b, d) − monthlyPayment(a, c, d), using the definition below."
        },
        {
          "label": "Simple break-even (months)",
          "text": "If the reduced rate is lower: e / monthly saving. Otherwise report no saving."
        }
      ],
      "example_questions": [
        "Use the Mortgage points break-even calculator.",
        "Help me calculate mortgage points break-even."
      ],
      "retrieval_phrases": [
        "Mortgage points break-even",
        "mortgage points break even"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100000,
            "b": 6,
            "c": 5,
            "d": 240,
            "e": 2000
          },
          "outputs": [
            {
              "label": "Monthly saving (£)",
              "value": 56.47531926150782
            },
            {
              "label": "Simple break-even (months)",
              "value": 35.41369975686265
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-065",
      "name": "Rent versus buy scenario",
      "category": "Loans and property",
      "status": "available",
      "purpose": "A simplified cash-outlay comparison. Enter expected recovered equity yourself. It does not automatically model mortgage equity, property growth, tax or invested rent savings.",
      "url": "/calculators/rent-versus-buy-scenario/",
      "version": "3b22cb5119513f28c5563442faabdd04806ddbb5003cfdf13c36a6846e587b75",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly rent (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly ownership cash costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Upfront ownership costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Years",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Expected equity recovered (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Rent cash cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Ownership net cash cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Ownership minus renting (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A simplified cash-outlay comparison. Enter expected recovered equity yourself. It does not automatically model mortgage equity, property growth, tax or invested rent savings."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Rent cash cost (£)",
          "text": "a × 12 × d"
        },
        {
          "label": "Ownership net cash cost (£)",
          "text": "b × 12 × d+c-e"
        },
        {
          "label": "Ownership minus renting (£)",
          "text": "b × 12 × d+c-e-a × 12 × d"
        }
      ],
      "example_questions": [
        "Use the Rent versus buy scenario calculator.",
        "Help me calculate rent versus buy scenario."
      ],
      "retrieval_phrases": [
        "Rent versus buy scenario",
        "rent versus buy scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 1200,
            "c": 10000,
            "d": 5,
            "e": 15000
          },
          "outputs": [
            {
              "label": "Rent cash cost (£)",
              "value": 60000
            },
            {
              "label": "Ownership net cash cost (£)",
              "value": 67000
            },
            {
              "label": "Ownership minus renting (£)",
              "value": 7000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-066",
      "name": "Gross rental yield",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Gross yield ignores financing, vacancy, expenses and taxes.",
      "url": "/calculators/gross-rental-yield/",
      "version": "c364351776331f222fce6843d6af2f67932177b6bf518bb12ba18d0e75413d85",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Property price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Annual rent (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gross yield (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Gross yield ignores financing, vacancy, expenses and taxes."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gross yield (%)",
          "text": "b ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Gross rental yield calculator.",
        "Help me calculate gross rental yield."
      ],
      "retrieval_phrases": [
        "Gross rental yield",
        "gross rental yield"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200000,
            "b": 12000
          },
          "outputs": [
            {
              "label": "Gross yield (%)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-067",
      "name": "Net rental yield",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Subtract operating costs before dividing by property cost. Financing and income tax are excluded.",
      "url": "/calculators/net-rental-yield/",
      "version": "342c351c64f5e7b5fe0044b84f83fde3c02ffe7ae7d78c2db8b7ff0a5a353b8a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total property cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Annual rent (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual operating costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net operating yield (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Subtract operating costs before dividing by property cost. Financing and income tax are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net operating yield (%)",
          "text": "(b-c) ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Net rental yield calculator.",
        "Help me calculate net rental yield."
      ],
      "retrieval_phrases": [
        "Net rental yield",
        "net rental yield"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200000,
            "b": 12000,
            "c": 4000
          },
          "outputs": [
            {
              "label": "Net operating yield (%)",
              "value": 4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-068",
      "name": "Property cash flow",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Cash flow includes the entered debt service; it differs from accounting profit and taxable income.",
      "url": "/calculators/property-cash-flow/",
      "version": "bb6c84692f7657714b17604d1e06f652846eb7e77fabdc17eab12595a2f47c3a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly rent (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly operating costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly loan payments (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly cash flow (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Annual cash flow (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Cash flow includes the entered debt service; it differs from accounting profit and taxable income."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly cash flow (£)",
          "text": "a-b-c"
        },
        {
          "label": "Annual cash flow (£)",
          "text": "(a-b-c) × 12"
        }
      ],
      "example_questions": [
        "Use the Property cash flow calculator.",
        "Help me calculate property cash flow."
      ],
      "retrieval_phrases": [
        "Property cash flow",
        "property cash flow"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1500,
            "b": 300,
            "c": 800
          },
          "outputs": [
            {
              "label": "Monthly cash flow (£)",
              "value": 400
            },
            {
              "label": "Annual cash flow (£)",
              "value": 4800
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-069",
      "name": "Capitalisation rate",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Net operating income excludes debt service and income taxes. Use an annual income figure.",
      "url": "/calculators/capitalisation-rate/",
      "version": "5dd5ccc93abcde73d89c80de9d2efd87720bae7a3f9283a530efb8f870ea41b9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual net operating income (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Property value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Capitalisation rate (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Net operating income excludes debt service and income taxes. Use an annual income figure."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Capitalisation rate (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [
        "Use the Capitalisation rate calculator.",
        "Help me calculate capitalisation rate."
      ],
      "retrieval_phrases": [
        "Capitalisation rate",
        "capitalisation rate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 200000
          },
          "outputs": [
            {
              "label": "Capitalisation rate (%)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-070",
      "name": "Cash-on-cash property return",
      "category": "Loans and property",
      "status": "available",
      "purpose": "This ratio compares annual cash flow with invested cash, not total property value or appreciation.",
      "url": "/calculators/cash-on-cash-property-return/",
      "version": "4c5065896b6cac44233f6695735d3bfc28bcb1fc9ca25fb9e17fc9932bd81e90",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual pre-tax cash flow (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Cash invested (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cash-on-cash return (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This ratio compares annual cash flow with invested cash, not total property value or appreciation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cash-on-cash return (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [
        "Use the Cash-on-cash property return calculator.",
        "Help me calculate cash-on-cash property return."
      ],
      "retrieval_phrases": [
        "Cash-on-cash property return",
        "cash on cash property return"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5000,
            "b": 50000
          },
          "outputs": [
            {
              "label": "Cash-on-cash return (%)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-071",
      "name": "Rental vacancy allowance",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Use between zero and twelve occupied months. The tool assumes the stated rent is constant.",
      "url": "/calculators/rental-vacancy-allowance/",
      "version": "bea3c5ef0a3ad58888a8a2dcf8eb97dc6d79e4d5f683db9fd177b45413995622",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly rent (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Occupied months",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Extra vacancy costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Effective annual rent (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rent lost to vacancy (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use between zero and twelve occupied months. The tool assumes the stated rent is constant."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Effective annual rent (£)",
          "text": "a × b-c"
        },
        {
          "label": "Rent lost to vacancy (£)",
          "text": "a × (12-b)"
        }
      ],
      "example_questions": [
        "Use the Rental vacancy allowance calculator.",
        "Help me calculate rental vacancy allowance."
      ],
      "retrieval_phrases": [
        "Rental vacancy allowance",
        "rental vacancy allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 11,
            "c": 200
          },
          "outputs": [
            {
              "label": "Effective annual rent (£)",
              "value": 10800
            },
            {
              "label": "Rent lost to vacancy (£)",
              "value": 1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-072",
      "name": "Property closing-cost budget",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Enter actual jurisdiction-specific fees and taxes. The calculator does not supply tax rates.",
      "url": "/calculators/property-closing-cost-budget/",
      "version": "83524c5d240e1661302d41dde6dce857da4a6e161b1e4150b6759c16ea9d4546",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Deposit (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Entered closing fees and taxes (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cash needed (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter actual jurisdiction-specific fees and taxes. The calculator does not supply tax rates."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cash needed (£)",
          "text": "a+sum(b)"
        }
      ],
      "example_questions": [
        "Use the Property closing-cost budget calculator.",
        "Help me calculate property closing-cost budget."
      ],
      "retrieval_phrases": [
        "Property closing-cost budget",
        "property closing cost budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20000,
            "b": "1000,2000,500"
          },
          "outputs": [
            {
              "label": "Cash needed (£)",
              "value": 23500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-073",
      "name": "Home equity",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Equity may be negative. Selling costs and tax are not deducted.",
      "url": "/calculators/home-equity/",
      "version": "091ee823531b43d2d6438017887e4e3c7c93228058d30eb90a3084ad0926683d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Property value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Secured loan balances (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Equity (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Equity share (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Equity may be negative. Selling costs and tax are not deducted."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Equity (£)",
          "text": "a − sum(b)"
        },
        {
          "label": "Equity share (%)",
          "text": "(a − sum(b))/a × 100; undefined when a = 0."
        }
      ],
      "example_questions": [
        "Use the Home equity calculator.",
        "Help me calculate home equity."
      ],
      "retrieval_phrases": [
        "Home equity",
        "home equity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200000,
            "b": "140000,10000"
          },
          "outputs": [
            {
              "label": "Equity (£)",
              "value": 50000
            },
            {
              "label": "Equity share (%)",
              "value": 25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-074",
      "name": "Lease versus finance vehicle",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Enter net end equity after any remaining loan. Both options should cover the same period; add unequal mileage and maintenance costs separately.",
      "url": "/calculators/lease-versus-finance-vehicle/",
      "version": "6935d3e9707ffd29440851a58cb6ad45f4f25c746d95d1c69ddd720f8347c8e1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Lease upfront (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Lease monthly (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Months",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Finance upfront (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Finance monthly (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Net equity at end (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Lease outlay (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Finance net outlay (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter net end equity after any remaining loan. Both options should cover the same period; add unequal mileage and maintenance costs separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Lease outlay (£)",
          "text": "a+b × c"
        },
        {
          "label": "Finance net outlay (£)",
          "text": "d+e × c-f"
        }
      ],
      "example_questions": [
        "Use the Lease versus finance vehicle calculator.",
        "Help me calculate lease versus finance vehicle."
      ],
      "retrieval_phrases": [
        "Lease versus finance vehicle",
        "lease versus finance vehicle"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2000,
            "b": 300,
            "c": 36,
            "d": 5000,
            "e": 400,
            "f": 10000
          },
          "outputs": [
            {
              "label": "Lease outlay (£)",
              "value": 12800
            },
            {
              "label": "Finance net outlay (£)",
              "value": 9400
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-075",
      "name": "Early loan settlement estimate",
      "category": "Loans and property",
      "status": "available",
      "purpose": "Sum your lender-supplied balances and charges. Request an official dated settlement quote before paying.",
      "url": "/calculators/early-loan-settlement-estimate/",
      "version": "4b4a65526175aa04efa12ce7852f4177efc4e345168bfe958953ac6f3526de70",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Outstanding balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Accrued interest (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Settlement charges (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated payoff (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sum your lender-supplied balances and charges. Request an official dated settlement quote before paying."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated payoff (£)",
          "text": "a+b+c"
        }
      ],
      "example_questions": [
        "Use the Early loan settlement estimate calculator.",
        "Help me calculate early loan settlement estimate."
      ],
      "retrieval_phrases": [
        "Early loan settlement estimate",
        "early loan settlement estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 50,
            "c": 100
          },
          "outputs": [
            {
              "label": "Estimated payoff (£)",
              "value": 10150
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent cash-flow or algebraic reference; rate and timing definitions; zero-rate and payoff boundaries; finance-domain review of explanations; no live rates or advice implied.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-076",
      "name": "Profit margin",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Margin divides profit by revenue. Markup divides profit by cost, so the percentages differ.",
      "url": "/calculators/profit-margin/",
      "version": "fe7bea8295e1f9a590d771bc46e75858f804b714453a97e878190a47c21b99ba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Revenue (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Profit margin (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Profit (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Margin divides profit by revenue. Markup divides profit by cost, so the percentages differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Profit margin (%)",
          "text": "(a-b) ÷ a × 100"
        },
        {
          "label": "Profit (£)",
          "text": "a-b"
        }
      ],
      "example_questions": [
        "Find profit margin from revenue and cost",
        "Calculate profit margin percentage"
      ],
      "retrieval_phrases": [
        "profit margin"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 60
          },
          "outputs": [
            {
              "label": "Profit margin (%)",
              "value": 40
            },
            {
              "label": "Profit (£)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-077",
      "name": "Markup pricing",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Add markup as a percentage of cost. This does not account for taxes or extra selling fees.",
      "url": "/calculators/markup-pricing/",
      "version": "269a97a0760c244baf305bb48b1ee1126dd57d9c7f94aff5307993b8cf81a6f8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Markup (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Selling price (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Profit (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Add markup as a percentage of cost. This does not account for taxes or extra selling fees."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Selling price (£)",
          "text": "a × (1+b ÷ 100)"
        },
        {
          "label": "Profit (£)",
          "text": "a × b ÷ 100"
        }
      ],
      "example_questions": [
        "Find selling price using a markup on cost",
        "Calculate markup pricing"
      ],
      "retrieval_phrases": [
        "markup pricing",
        "markup on cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 50
          },
          "outputs": [
            {
              "label": "Selling price (£)",
              "value": 90
            },
            {
              "label": "Profit (£)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-078",
      "name": "Target margin price",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Divide cost by one minus the target margin. A margin of 100% is unattainable with positive cost.",
      "url": "/calculators/target-margin-price/",
      "version": "5199c6c77bfc9fedce6a64424ef038142133df3f415fef7f38cdaba9335f0d94",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target margin (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required selling price (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Divide cost by one minus the target margin. A margin of 100% is unattainable with positive cost."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required selling price (£)",
          "text": "a ÷ (1-b ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Target margin price calculator.",
        "Help me calculate target margin price."
      ],
      "retrieval_phrases": [
        "Target margin price",
        "target margin price"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 40
          },
          "outputs": [
            {
              "label": "Required selling price (£)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-079",
      "name": "Break-even units",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Round up to a whole unit. Sales below unit variable cost cannot recover positive fixed costs.",
      "url": "/calculators/break-even-units/",
      "version": "c84abec732fc469e4b8f142e0bef8d35950606fcc3ba46590e0303cb0744e6fb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Fixed cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit selling price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP/unit",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unit variable cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP/unit",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Break-even units",
          "type": "number",
          "unit": "unit",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Break-even revenue (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Round up to a whole unit. Sales below unit variable cost cannot recover positive fixed costs."
      ],
      "constraints": {
        "relations": [
          {
            "left": "b",
            "operator": ">",
            "right": "c",
            "message": "Unit selling price must exceed unit variable cost."
          }
        ],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Break-even units",
          "text": "roundUp(a ÷ (b-c))"
        },
        {
          "label": "Break-even revenue (£)",
          "text": "roundUp(a ÷ (b-c)) × b"
        }
      ],
      "example_questions": [
        "How many units must I sell to break even?",
        "Calculate break even sales volume"
      ],
      "retrieval_phrases": [
        "break even",
        "breakeven"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 30,
            "c": 20
          },
          "outputs": [
            {
              "label": "Break-even units",
              "value": 100
            },
            {
              "label": "Break-even revenue (£)",
              "value": 3000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-080",
      "name": "Break-even revenue",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Contribution margin here is a share of sales after variable costs.",
      "url": "/calculators/break-even-revenue/",
      "version": "7789a0188a2c2aced4cbe1add6b924a3279af93f876b0ae1482a5f4533652231",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Fixed costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Contribution margin (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 1e-9,
          "maximum": 100
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Break-even revenue (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Contribution margin here is a share of sales after variable costs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Break-even revenue (£)",
          "text": "a ÷ (b ÷ 100)"
        }
      ],
      "example_questions": [
        "Calculate break-even revenue from contribution margin",
        "Find break even revenue for fixed costs"
      ],
      "retrieval_phrases": [
        "break even revenue"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 25
          },
          "outputs": [
            {
              "label": "Break-even revenue (£)",
              "value": 4000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-081",
      "name": "Contribution margin",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Contribution pays fixed costs before any operating profit remains.",
      "url": "/calculators/contribution-margin/",
      "version": "ec7b1c29c251b2b54e8f7cc5466de07707a7fcb39b6e3a006e4650d268d6c6d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unit price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit variable cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Units sold",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unit contribution (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total contribution (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Contribution pays fixed costs before any operating profit remains."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unit contribution (£)",
          "text": "a-b"
        },
        {
          "label": "Total contribution (£)",
          "text": "(a-b) × c"
        }
      ],
      "example_questions": [
        "Use the Contribution margin calculator.",
        "Help me calculate contribution margin."
      ],
      "retrieval_phrases": [
        "Contribution margin",
        "contribution margin"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 20,
            "c": 100
          },
          "outputs": [
            {
              "label": "Unit contribution (£)",
              "value": 10
            },
            {
              "label": "Total contribution (£)",
              "value": 1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-082",
      "name": "Volume discount profitability",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Compares contribution at constant unit cost, with whole units and no capacity constraints.",
      "url": "/calculators/volume-discount-profitability/",
      "version": "5f5da680ef83bd5319f887e3e11ce43cc9025b71df41b185ad0e390662eaf6f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Standard price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Discounted price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unit cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Original units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Extra units to match profit",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Original contribution (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares contribution at constant unit cost, with whole units and no capacity constraints."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Extra units to match profit",
          "text": "roundUp((a-c) × d ÷ (b-c))-d"
        },
        {
          "label": "Original contribution (£)",
          "text": "(a-c) × d"
        }
      ],
      "example_questions": [
        "Use the Volume discount profitability calculator.",
        "Help me calculate volume discount profitability."
      ],
      "retrieval_phrases": [
        "Volume discount profitability",
        "volume discount profitability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 90,
            "c": 60,
            "d": 100
          },
          "outputs": [
            {
              "label": "Extra units to match profit",
              "value": 34
            },
            {
              "label": "Original contribution (£)",
              "value": 4000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-083",
      "name": "Cost-plus quote",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "The entered markup applies to all entered costs. Taxes are excluded.",
      "url": "/calculators/cost-plus-quote/",
      "version": "3094d99315b5711bfb4b2d826af3dc75a006684d0125e623055fb24b525fedc4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Materials (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labour (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overhead (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Markup (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Quote (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "The entered markup applies to all entered costs. Taxes are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Quote (£)",
          "text": "(a+b+c) × (1+d ÷ 100)"
        }
      ],
      "example_questions": [
        "Build a cost-plus quote from materials labour overhead and markup",
        "Calculate a cost plus quote"
      ],
      "retrieval_phrases": [
        "cost plus quote",
        "cost plus pricing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 300,
            "c": 200,
            "d": 20
          },
          "outputs": [
            {
              "label": "Quote (£)",
              "value": 1200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-084",
      "name": "Freelance hourly rate",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Only the billable share of available hours generates revenue. The income target is before any taxes you have not included.",
      "url": "/calculators/freelance-hourly-rate/",
      "version": "bd7b338283472ad1c4e3c6a18415d44fc54eb3931be7c2ec198dfe62ebf7f996",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual income target (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Available hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Billable share (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required hourly rate (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Only the billable share of available hours generates revenue. The income target is before any taxes you have not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required hourly rate (£)",
          "text": "(a+b) ÷ (c × d ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Freelance hourly rate calculator.",
        "Help me calculate freelance hourly rate."
      ],
      "retrieval_phrases": [
        "Freelance hourly rate",
        "freelance hourly rate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40000,
            "b": 10000,
            "c": 2000,
            "d": 50
          },
          "outputs": [
            {
              "label": "Required hourly rate (£)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-085",
      "name": "Project profitability",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Use your labour cost, not the client billing rate, to calculate project contribution.",
      "url": "/calculators/project-profitability/",
      "version": "c83d2ded68e7a23983582182f2d63e29b3b87fe48edfd0016a766ce189d9dcc6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Project fee (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labour hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hourly cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Project profit (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Margin (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use your labour cost, not the client billing rate, to calculate project contribution."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Project profit (£)",
          "text": "a − b × c − d"
        },
        {
          "label": "Margin (%)",
          "text": "(a − b × c − d)/a × 100; undefined when a = 0."
        }
      ],
      "example_questions": [
        "Use the Project profitability calculator.",
        "Help me calculate project profitability."
      ],
      "retrieval_phrases": [
        "Project profitability",
        "project profitability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5000,
            "b": 100,
            "c": 20,
            "d": 500
          },
          "outputs": [
            {
              "label": "Project profit (£)",
              "value": 2500
            },
            {
              "label": "Margin (%)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-086",
      "name": "Employee hourly cost",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Paid leave and nonproductive hours reduce the denominator. Enter actual employer charges yourself.",
      "url": "/calculators/employee-hourly-cost/",
      "version": "585eedd9e51c85d36783876617334e06669c142bdee77c99ddb6f2939b3d6e7b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual pay (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual benefits and employer costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Productive annual hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Employment cost per productive hour (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Paid leave and nonproductive hours reduce the denominator. Enter actual employer charges yourself."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Employment cost per productive hour (£)",
          "text": "(a+b) ÷ c"
        }
      ],
      "example_questions": [
        "Use the Employee hourly cost calculator.",
        "Help me calculate employee hourly cost."
      ],
      "retrieval_phrases": [
        "Employee hourly cost",
        "employee hourly cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30000,
            "b": 10000,
            "c": 1600
          },
          "outputs": [
            {
              "label": "Employment cost per productive hour (£)",
              "value": 25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-087",
      "name": "Payroll budget",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "This average-pay model assumes the same pay and cost percentage for all workers.",
      "url": "/calculators/payroll-budget/",
      "version": "3b7fa8a6b8c95c62c01ad010422069658b066a450ee1a5968047c6ffb1c89905",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Headcount",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual pay each (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Extra employer cost (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual payroll (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Monthly equivalent (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This average-pay model assumes the same pay and cost percentage for all workers."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual payroll (£)",
          "text": "a × b × (1+c ÷ 100)"
        },
        {
          "label": "Monthly equivalent (£)",
          "text": "a × b × (1+c ÷ 100) ÷ 12"
        }
      ],
      "example_questions": [
        "Use the Payroll budget calculator.",
        "Help me calculate payroll budget."
      ],
      "retrieval_phrases": [
        "Payroll budget",
        "payroll budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 30000,
            "c": 20
          },
          "outputs": [
            {
              "label": "Annual payroll (£)",
              "value": 360000
            },
            {
              "label": "Monthly equivalent (£)",
              "value": 30000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-088",
      "name": "Inventory turnover",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Average inventory should be valued on the same cost basis as cost of goods sold.",
      "url": "/calculators/inventory-turnover/",
      "version": "3d0e9edaf472d10c776b8f412fb0cdcf598bb3a8a52a3dbb839bf581ce75e890",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual cost of goods sold (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Average inventory at cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Turnover",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Inventory days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Average inventory should be valued on the same cost basis as cost of goods sold."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Turnover",
          "text": " a ÷ b"
        },
        {
          "label": "Inventory days",
          "text": "365 × b ÷ a"
        }
      ],
      "example_questions": [
        "Use the Inventory turnover calculator.",
        "Help me calculate inventory turnover."
      ],
      "retrieval_phrases": [
        "Inventory turnover",
        "inventory turnover"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120000,
            "b": 20000
          },
          "outputs": [
            {
              "label": "Turnover",
              "value": 6
            },
            {
              "label": "Inventory days",
              "value": 60.833333333333336
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-089",
      "name": "Reorder point",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Demand during lead time plus safety stock is a simple reorder-point model.",
      "url": "/calculators/reorder-point/",
      "version": "031b94fa8db1dc89af8bedccf7be8504599b9a5c53658d652d40064d96cbf4ae",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Average daily demand",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Lead time (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Safety stock",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Reorder point (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Demand during lead time plus safety stock is a simple reorder-point model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Reorder point (units)",
          "text": "a × b+c"
        }
      ],
      "example_questions": [
        "Use the Reorder point calculator.",
        "Help me calculate reorder point."
      ],
      "retrieval_phrases": [
        "Reorder point",
        "reorder point"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 5,
            "c": 30
          },
          "outputs": [
            {
              "label": "Reorder point (units)",
              "value": 130
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-090",
      "name": "Economic order quantity",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "The basic EOQ model assumes steady demand, fixed ordering cost and no quantity discounts.",
      "url": "/calculators/economic-order-quantity/",
      "version": "e9f81f159cbe098ebebcabee3c97d98f6dfd6e079aaf5c506009bf273b59fabd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual unit demand",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cost per order (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual holding cost per unit (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "EOQ (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The basic EOQ model assumes steady demand, fixed ordering cost and no quantity discounts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "EOQ (units)",
          "text": "sqrt(2 × a × b ÷ c)"
        }
      ],
      "example_questions": [
        "Use the Economic order quantity calculator.",
        "Help me calculate economic order quantity."
      ],
      "retrieval_phrases": [
        "Economic order quantity",
        "economic order quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 20,
            "c": 2
          },
          "outputs": [
            {
              "label": "EOQ (units)",
              "value": 141.4213562373095
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-091",
      "name": "Safety stock",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Assumes independent daily demand and fixed lead time. The z-score is supplied by you; this is not a universal service guarantee.",
      "url": "/calculators/safety-stock/",
      "version": "adda5c66f86f2c2a37c0d36db70bc46da17f67a59542f71f309b2a3b7c7c1113",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Daily demand standard deviation",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Lead time (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Service z-score",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Safety stock (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes independent daily demand and fixed lead time. The z-score is supplied by you; this is not a universal service guarantee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Safety stock (units)",
          "text": "c × a × sqrt(b)"
        }
      ],
      "example_questions": [
        "Use the Safety stock calculator.",
        "Help me calculate safety stock."
      ],
      "retrieval_phrases": [
        "Safety stock",
        "safety stock"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 4,
            "c": 1.65
          },
          "outputs": [
            {
              "label": "Safety stock (units)",
              "value": 33
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-092",
      "name": "Stock coverage",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Ignores incoming orders and demand variability. Use consistent sellable units.",
      "url": "/calculators/stock-coverage/",
      "version": "5a1354f33619ab0019d9df1635f5f3b439ed520a61c2287f4dd75cc2c59e2e4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Units on hand",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected daily sales",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Days of cover",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ignores incoming orders and demand variability. Use consistent sellable units."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Days of cover",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Stock coverage calculator.",
        "Help me calculate stock coverage."
      ],
      "retrieval_phrases": [
        "Stock coverage",
        "stock coverage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 20
          },
          "outputs": [
            {
              "label": "Days of cover",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-093",
      "name": "Capacity utilisation",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Use actual output and capacity for the same time period.",
      "url": "/calculators/capacity-utilisation/",
      "version": "7797323aa945e1bf872b92a4a0da8c03596855637d92649b728c381f3b9e639f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Actual output",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Available capacity",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Utilisation (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Spare capacity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use actual output and capacity for the same time period."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Utilisation (%)",
          "text": "a ÷ b × 100"
        },
        {
          "label": "Spare capacity",
          "text": "b-a"
        }
      ],
      "example_questions": [
        "Use the Capacity utilisation calculator.",
        "Help me calculate capacity utilisation."
      ],
      "retrieval_phrases": [
        "Capacity utilisation",
        "capacity utilisation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 100
          },
          "outputs": [
            {
              "label": "Utilisation (%)",
              "value": 80
            },
            {
              "label": "Spare capacity",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-094",
      "name": "Productivity rate",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Count the labour hours used to produce the measured output, including all participating workers.",
      "url": "/calculators/productivity-rate/",
      "version": "429c58f0e336a506ca19b415ee9bdaf76e73515e99b26f4d8010d615c6e70507",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Output units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labour hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Units per hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Hours per unit",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Count the labour hours used to produce the measured output, including all participating workers."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Units per hour",
          "text": "a/b"
        },
        {
          "label": "Hours per unit",
          "text": "b/a; undefined when a = 0."
        }
      ],
      "example_questions": [
        "Use the Productivity rate calculator.",
        "Help me calculate productivity rate."
      ],
      "retrieval_phrases": [
        "Productivity rate",
        "productivity rate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 240,
            "b": 8
          },
          "outputs": [
            {
              "label": "Units per hour",
              "value": 30
            },
            {
              "label": "Hours per unit",
              "value": 0.03333333333333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-095",
      "name": "Overall equipment effectiveness",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "OEE multiplies availability, performance and quality. Ideal cycle time must be defined for this product.",
      "url": "/calculators/overall-equipment-effectiveness/",
      "version": "22f6a212d3507660cb8ed36a00085d652a7707f14112b24cc14d81397e4f4458",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Planned minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Run minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Ideal cycle (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Good units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "OEE (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Availability (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "OEE multiplies availability, performance and quality. Ideal cycle time must be defined for this product."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "OEE (%)",
          "text": "b ÷ a × (c × d ÷ b) × (e ÷ d) × 100"
        },
        {
          "label": "Availability (%)",
          "text": "b ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Overall equipment effectiveness calculator.",
        "Help me calculate overall equipment effectiveness."
      ],
      "retrieval_phrases": [
        "Overall equipment effectiveness",
        "overall equipment effectiveness"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 480,
            "b": 400,
            "c": 1,
            "d": 350,
            "e": 340
          },
          "outputs": [
            {
              "label": "OEE (%)",
              "value": 70.83333333333334
            },
            {
              "label": "Availability (%)",
              "value": 83.33333333333334
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-096",
      "name": "Working capital",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "This is a balance-sheet measure, not the cash balance available today.",
      "url": "/calculators/working-capital/",
      "version": "b3a21fd8608a76c3b51aac527dbf4ac0a47c69d370317eabb43d4e8d7b58e736",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current assets (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current liabilities (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Working capital (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This is a balance-sheet measure, not the cash balance available today."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Working capital (£)",
          "text": "a-b"
        }
      ],
      "example_questions": [
        "Use the Working capital calculator.",
        "Help me calculate working capital."
      ],
      "retrieval_phrases": [
        "Working capital",
        "working capital"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50000,
            "b": 30000
          },
          "outputs": [
            {
              "label": "Working capital (£)",
              "value": 20000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-097",
      "name": "Cash conversion cycle",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Add inventory and collection time, then subtract supplier payment time.",
      "url": "/calculators/cash-conversion-cycle/",
      "version": "4fd7de4a19b3c7f62a9e671b997cd9a44e356b1ee53b92c553517973b54ea4e0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Inventory days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Receivable days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Payable days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cash conversion cycle (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Add inventory and collection time, then subtract supplier payment time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cash conversion cycle (days)",
          "text": "a+b-c"
        }
      ],
      "example_questions": [
        "Use the Cash conversion cycle calculator.",
        "Help me calculate cash conversion cycle."
      ],
      "retrieval_phrases": [
        "Cash conversion cycle",
        "cash conversion cycle"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 30,
            "c": 25
          },
          "outputs": [
            {
              "label": "Cash conversion cycle (days)",
              "value": 45
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-098",
      "name": "Invoice late-charge estimate",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Uses simple daily interest on a 365-day basis. This does not establish whether a charge is lawful or contractually applicable.",
      "url": "/calculators/invoice-late-charge-estimate/",
      "version": "64d958849d88f91e9f06198f46e290f70c90ad0d7b65962dc925f19f80d53fe4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unpaid balance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Entered annual charge rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overdue days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Fixed charge (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Charge (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Balance plus charge (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses simple daily interest on a 365-day basis. This does not establish whether a charge is lawful or contractually applicable."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Charge (£)",
          "text": "a × b ÷ 100 × c ÷ 365+d"
        },
        {
          "label": "Balance plus charge (£)",
          "text": "a+a × b ÷ 100 × c ÷ 365+d"
        }
      ],
      "example_questions": [
        "Use the Invoice late-charge estimate calculator.",
        "Help me calculate invoice late-charge estimate."
      ],
      "retrieval_phrases": [
        "Invoice late-charge estimate",
        "invoice late charge estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 10,
            "c": 30,
            "d": 0
          },
          "outputs": [
            {
              "label": "Charge (£)",
              "value": 8.219178082191782
            },
            {
              "label": "Balance plus charge (£)",
              "value": 1008.2191780821918
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-099",
      "name": "Weighted product-mix profit",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Assumes the supplied product mix stays constant. Whole-unit allocations may require a different exact production mix.",
      "url": "/calculators/weighted-product-mix-profit/",
      "version": "ea9ce5266e23652302bc8b854565dd0653e5b754042d03d2365f3adeb471ec27",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unit prices (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Unit costs (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Mix weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Fixed costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weighted contribution (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Break-even mixed units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the supplied product mix stays constant. Whole-unit allocations may require a different exact production mix."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weighted contribution (£)",
          "text": "For each product, multiply (price − cost) by its mix weight. Sum these contributions and divide by the sum of weights."
        },
        {
          "label": "Break-even mixed units",
          "text": "Round up d / weighted contribution to whole units."
        }
      ],
      "example_questions": [
        "Use the Weighted product-mix profit calculator.",
        "Help me calculate weighted product-mix profit."
      ],
      "retrieval_phrases": [
        "Weighted product-mix profit",
        "weighted product mix profit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,30",
            "b": "10,15",
            "c": "1,1",
            "d": 1000
          },
          "outputs": [
            {
              "label": "Weighted contribution (£)",
              "value": 12.5
            },
            {
              "label": "Break-even mixed units",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-100",
      "name": "Outsource versus in-house",
      "category": "Business pricing and operations",
      "status": "available",
      "purpose": "Compare costs for the same output scope. Quality, timing and capacity must be considered separately.",
      "url": "/calculators/outsource-versus-in-house/",
      "version": "1b2ac3f161c96730526912b68094988dd47cf719620f19864328a05697a18dde",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Internal fixed cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Internal unit cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplier fixed fee (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplier unit cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Volume",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "In-house cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Supplier cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Crossover units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compare costs for the same output scope. Quality, timing and capacity must be considered separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "In-house cost (£)",
          "text": "a + b × e"
        },
        {
          "label": "Supplier cost (£)",
          "text": "c + d × e"
        },
        {
          "label": "Crossover units",
          "text": "(c−a)/(b−d). Equal unit costs return no unique crossover."
        }
      ],
      "example_questions": [
        "Use the Outsource versus in-house calculator.",
        "Help me calculate outsource versus in-house."
      ],
      "retrieval_phrases": [
        "Outsource versus in-house",
        "outsource versus in house"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 5,
            "c": 0,
            "d": 10,
            "e": 300
          },
          "outputs": [
            {
              "label": "In-house cost (£)",
              "value": 2500
            },
            {
              "label": "Supplier cost (£)",
              "value": 3000
            },
            {
              "label": "Crossover units",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-101",
      "name": "Conversion rate",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Both counts must refer to the same measured population and period.",
      "url": "/calculators/conversion-rate/",
      "version": "80bcd7e476346a3c6e0d830159140c4432c6e89ecceb1800d9f90fc188632bac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Conversions",
          "type": "number",
          "required": true,
          "unit": "conversion",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visitors",
          "type": "number",
          "required": true,
          "unit": "visitor",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Conversion rate (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Both counts must refer to the same measured population and period."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Conversion rate (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [
        "Find conversion rate from conversions and visitors",
        "Calculate a conversion rate"
      ],
      "retrieval_phrases": [
        "conversion rate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 25,
            "b": 1000
          },
          "outputs": [
            {
              "label": "Conversion rate (%)",
              "value": 2.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-102",
      "name": "Click-through rate",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Click-through rate is clicks divided by impressions. Counting conventions should match your reporting source.",
      "url": "/calculators/click-through-rate/",
      "version": "9b3d0ca6035adec4641056e7af4eaf0052124f082d0f6d2f0823a9056d79176b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Clicks",
          "type": "number",
          "required": true,
          "unit": "click",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Impressions",
          "type": "number",
          "required": true,
          "unit": "impression",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "CTR (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Click-through rate is clicks divided by impressions. Counting conventions should match your reporting source."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "CTR (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [
        "Find click-through rate from clicks and impressions",
        "Calculate CTR"
      ],
      "retrieval_phrases": [
        "click through rate",
        "ctr"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 1000
          },
          "outputs": [
            {
              "label": "CTR (%)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-103",
      "name": "Cost per click",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Divide campaign spend by attributed clicks for the same period.",
      "url": "/calculators/cost-per-click/",
      "version": "ce6ca2b23fa4cf84f707a7e4acd126f026888a5aae4ea35d38e982741fa12c73",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Spend (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Clicks",
          "type": "number",
          "required": true,
          "unit": "click",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cost per click (£)",
          "type": "number",
          "unit": "GBP/click",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Divide campaign spend by attributed clicks for the same period."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cost per click (£)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Calculate cost per click from spend and clicks",
        "Find CPC"
      ],
      "retrieval_phrases": [
        "cost per click",
        "cpc"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 50
          },
          "outputs": [
            {
              "label": "Cost per click (£)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-104",
      "name": "Cost per thousand impressions",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "CPM is the cost of one thousand impressions.",
      "url": "/calculators/cost-per-thousand-impressions/",
      "version": "12c56fbe68548bd0085c1908cb4108bec6931e4dd65ead4996b17d2332dd27e9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Spend (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Impressions",
          "type": "number",
          "required": true,
          "unit": "impression",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "CPM (£)",
          "type": "number",
          "unit": "GBP/1000-impressions",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "CPM is the cost of one thousand impressions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "CPM (£)",
          "text": "a ÷ b × 1000"
        }
      ],
      "example_questions": [
        "Calculate cost per thousand impressions",
        "Find CPM"
      ],
      "retrieval_phrases": [
        "cost per thousand impressions",
        "cpm"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10000
          },
          "outputs": [
            {
              "label": "CPM (£)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-105",
      "name": "Cost per acquisition",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Define the acquisition event consistently before comparing campaigns.",
      "url": "/calculators/cost-per-acquisition/",
      "version": "156c540c1f255adf0a3774ca491eece8e85094b6b0c7cea1c6f6afa921898fcd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Spend (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Acquisitions",
          "type": "number",
          "required": true,
          "unit": "acquisition",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "CPA (£)",
          "type": "number",
          "unit": "GBP/acquisition",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Define the acquisition event consistently before comparing campaigns."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "CPA (£)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Calculate cost per acquisition from spend and acquisitions",
        "Find CPA"
      ],
      "retrieval_phrases": [
        "cost per acquisition",
        "cpa"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 50
          },
          "outputs": [
            {
              "label": "CPA (£)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-106",
      "name": "Return on ad spend",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "ROAS uses attributed revenue, not profit. Returns, fees and fulfilment can change profitability.",
      "url": "/calculators/return-on-ad-spend/",
      "version": "f6616d28934a23ee4372e8f5e97d2c8deba8080444c4bc065390df3104b1b9b1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Attributed revenue (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Ad spend (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "ROAS multiple",
          "type": "number",
          "unit": "multiple",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "ROAS (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "ROAS uses attributed revenue, not profit. Returns, fees and fulfilment can change profitability."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "ROAS multiple",
          "text": "a ÷ b"
        },
        {
          "label": "ROAS (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [
        "Calculate return on ad spend using attributed revenue",
        "Find ROAS"
      ],
      "retrieval_phrases": [
        "return on ad spend",
        "roas"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4000,
            "b": 1000
          },
          "outputs": [
            {
              "label": "ROAS multiple",
              "value": 4
            },
            {
              "label": "ROAS (%)",
              "value": 400
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-107",
      "name": "Marketing return on investment",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Use incremental gross profit before campaign cost. Revenue alone is not a profit-based ROI measure.",
      "url": "/calculators/marketing-return-on-investment/",
      "version": "2827855c4c5e7938a3017f43244221e0dd045d59f78596ac611e30f83382e5d9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Incremental gross profit (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Campaign cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Marketing ROI (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Use incremental gross profit before campaign cost. Revenue alone is not a profit-based ROI measure."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Marketing ROI (%)",
          "text": "(a-b) ÷ b × 100"
        }
      ],
      "example_questions": [
        "Find marketing ROI using incremental gross profit and campaign cost",
        "Calculate marketing return on investment"
      ],
      "retrieval_phrases": [
        "marketing roi",
        "marketing return on investment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2000,
            "b": 1000
          },
          "outputs": [
            {
              "label": "Marketing ROI (%)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-108",
      "name": "Customer acquisition cost",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Include the acquisition expenses relevant to your definition, not only ad-platform spend.",
      "url": "/calculators/customer-acquisition-cost/",
      "version": "21b427c3d007c6a8a1504ce01198d92767414f10641abbaf2acc13ec616e979c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Acquisition spend (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New customers",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "CAC (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Include the acquisition expenses relevant to your definition, not only ad-platform spend."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "CAC (£)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Customer acquisition cost calculator.",
        "Help me calculate customer acquisition cost."
      ],
      "retrieval_phrases": [
        "Customer acquisition cost",
        "customer acquisition cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5000,
            "b": 100
          },
          "outputs": [
            {
              "label": "CAC (£)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-109",
      "name": "Customer lifetime value scenario",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "A simple constant-behaviour scenario; it excludes discounting, retention curves and service costs not included in margin.",
      "url": "/calculators/customer-lifetime-value-scenario/",
      "version": "58ae4ed2b60c3c5f13300560cbe41c214e7a73a6d67567673003df7037304b03",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Order value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Purchases per year",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Gross margin (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retention years",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Contribution LTV (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Revenue LTV (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A simple constant-behaviour scenario; it excludes discounting, retention curves and service costs not included in margin."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Contribution LTV (£)",
          "text": "a × b × c ÷ 100 × d"
        },
        {
          "label": "Revenue LTV (£)",
          "text": "a × b × d"
        }
      ],
      "example_questions": [
        "Use the Customer lifetime value scenario calculator.",
        "Help me calculate customer lifetime value scenario."
      ],
      "retrieval_phrases": [
        "Customer lifetime value scenario",
        "customer lifetime value scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 3,
            "c": 40,
            "d": 5
          },
          "outputs": [
            {
              "label": "Contribution LTV (£)",
              "value": 600
            },
            {
              "label": "Revenue LTV (£)",
              "value": 1500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-110",
      "name": "LTV-to-CAC ratio",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Match contribution-based lifetime value with the acquisition cost for the same customer cohort.",
      "url": "/calculators/ltv-to-cac-ratio/",
      "version": "35834a14adb827ec6f2447f0c5196c62f0d0b42b6039b9d267241388b9ca82ab",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Lifetime contribution (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Acquisition cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "LTV to CAC",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Match contribution-based lifetime value with the acquisition cost for the same customer cohort."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "LTV to CAC",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the LTV-to-CAC ratio calculator.",
        "Help me calculate ltv-to-cac ratio."
      ],
      "retrieval_phrases": [
        "LTV-to-CAC ratio",
        "ltv to cac ratio"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 600,
            "b": 100
          },
          "outputs": [
            {
              "label": "LTV to CAC",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-111",
      "name": "CAC payback period",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Assumes constant monthly contribution without churn or discounting.",
      "url": "/calculators/cac-payback-period/",
      "version": "a94e69d2204fb3752eb487d15446e3d995eed5e2c5514d77cb26feb676b48cbc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Acquisition cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly customer contribution (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Payback months",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes constant monthly contribution without churn or discounting."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Payback months",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the CAC payback period calculator.",
        "Help me calculate cac payback period."
      ],
      "retrieval_phrases": [
        "CAC payback period",
        "cac payback period"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 20
          },
          "outputs": [
            {
              "label": "Payback months",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-112",
      "name": "Average order value",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Revenue and orders must cover the same period and refunds convention.",
      "url": "/calculators/average-order-value/",
      "version": "aff4de80cf55478edb3fb429f2d5093d5504975c74815d413baf0af1bd1d0a20",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Revenue (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Orders",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Average order value (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Revenue and orders must cover the same period and refunds convention."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Average order value (£)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Average order value calculator.",
        "Help me calculate average order value."
      ],
      "retrieval_phrases": [
        "Average order value",
        "average order value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 200
          },
          "outputs": [
            {
              "label": "Average order value (£)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-113",
      "name": "Cart abandonment",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Compare created carts and completed orders from the same tracked cohort.",
      "url": "/calculators/cart-abandonment/",
      "version": "27ecb652047ddb78491b9e7618ce757944f0efdb466e05258a337c2006582611",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Created carts",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Completed orders",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Abandonment (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Uncompleted carts",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compare created carts and completed orders from the same tracked cohort."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Abandonment (%)",
          "text": "(a-b) ÷ a × 100"
        },
        {
          "label": "Uncompleted carts",
          "text": "a-b"
        }
      ],
      "example_questions": [
        "Use the Cart abandonment calculator.",
        "Help me calculate cart abandonment."
      ],
      "retrieval_phrases": [
        "Cart abandonment",
        "cart abandonment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 30
          },
          "outputs": [
            {
              "label": "Abandonment (%)",
              "value": 70
            },
            {
              "label": "Uncompleted carts",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-114",
      "name": "Sales funnel projection",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Apply stage rates in sequence. Output is an expected quantity, which can be fractional.",
      "url": "/calculators/sales-funnel-projection/",
      "version": "2f5f01924d6b7c39b1854185c079dc504eb563d71c8a1bfbc9a203bcf27679e7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starting traffic",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Stage conversion rates (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Order value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final conversions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Projected revenue (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Apply stage rates in sequence. Output is an expected quantity, which can be fractional."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final conversions",
          "text": "Start with a. For each stage percentage x in b, multiply by x/100."
        },
        {
          "label": "Projected revenue (£)",
          "text": "Final conversions × c."
        }
      ],
      "example_questions": [
        "Use the Sales funnel projection calculator.",
        "Help me calculate sales funnel projection."
      ],
      "retrieval_phrases": [
        "Sales funnel projection",
        "sales funnel projection"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": "10,20",
            "c": 50
          },
          "outputs": [
            {
              "label": "Final conversions",
              "value": 200
            },
            {
              "label": "Projected revenue (£)",
              "value": 10000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-115",
      "name": "Email engagement",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Open tracking can be distorted by privacy features. Bounce rate here uses delivered plus bounced as the sent count.",
      "url": "/calculators/email-engagement/",
      "version": "f3538dd6ff95403919c8e5b560a0b66b944b246e79fdb4d5c5b88d3df7155418",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Delivered emails",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Unique opens",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unique clicks",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Bounces",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Open rate (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Click rate (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Bounce share of sent (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Open tracking can be distorted by privacy features. Bounce rate here uses delivered plus bounced as the sent count."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Open rate (%)",
          "text": "b ÷ a × 100"
        },
        {
          "label": "Click rate (%)",
          "text": "c ÷ a × 100"
        },
        {
          "label": "Bounce share of sent (%)",
          "text": "d ÷ (a+d) × 100"
        }
      ],
      "example_questions": [
        "Use the Email engagement calculator.",
        "Help me calculate email engagement."
      ],
      "retrieval_phrases": [
        "Email engagement",
        "email engagement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 400,
            "c": 100,
            "d": 20
          },
          "outputs": [
            {
              "label": "Open rate (%)",
              "value": 40
            },
            {
              "label": "Click rate (%)",
              "value": 10
            },
            {
              "label": "Bounce share of sent (%)",
              "value": 1.9607843137254901
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-116",
      "name": "Customer churn",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Counts only losses from the starting customer group; new customers are not added to the denominator.",
      "url": "/calculators/customer-churn/",
      "version": "604b34093f88bd9944fed2797bbeac5337d24f204ec5d530f1bcedce320cc740",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starting customers",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Customers lost",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Churn (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts only losses from the starting customer group; new customers are not added to the denominator."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Churn (%)",
          "text": "b ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Customer churn calculator.",
        "Help me calculate customer churn."
      ],
      "retrieval_phrases": [
        "Customer churn",
        "customer churn"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 10
          },
          "outputs": [
            {
              "label": "Churn (%)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-117",
      "name": "Net revenue retention",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Exclude revenue from newly acquired customers. Measure changes in the same starting cohort.",
      "url": "/calculators/net-revenue-retention/",
      "version": "06a2a90a4a0bd8f0798b2451ada167f8a75acb6c9db0c4d3c52b98f0face9a23",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starting recurring revenue (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Expansion (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Contraction (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Churned revenue (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "NRR (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Exclude revenue from newly acquired customers. Measure changes in the same starting cohort."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "NRR (%)",
          "text": "(a+b-c-d) ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Net revenue retention calculator.",
        "Help me calculate net revenue retention."
      ],
      "retrieval_phrases": [
        "Net revenue retention",
        "net revenue retention"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 2000,
            "c": 500,
            "d": 1000
          },
          "outputs": [
            {
              "label": "NRR (%)",
              "value": 105
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-118",
      "name": "Monthly recurring revenue",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Normalise annual subscriptions to a monthly equivalent before entry. This is a run rate, not recognised accounting revenue.",
      "url": "/calculators/monthly-recurring-revenue/",
      "version": "b1faec139dd29deb9c23a1d5527f961d782c06671b5d56f1472a626e75b658ee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Subscriber counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Monthly plan prices (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "MRR (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Annualised run rate (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Normalise annual subscriptions to a monthly equivalent before entry. This is a run rate, not recognised accounting revenue."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "MRR (£)",
          "text": "Multiply each subscriber count in a by its matching monthly plan price in b; add the products."
        },
        {
          "label": "Annualised run rate (£)",
          "text": "MRR × 12."
        }
      ],
      "example_questions": [
        "Use the Monthly recurring revenue calculator.",
        "Help me calculate monthly recurring revenue."
      ],
      "retrieval_phrases": [
        "Monthly recurring revenue",
        "monthly recurring revenue"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "10,20"
          },
          "outputs": [
            {
              "label": "MRR (£)",
              "value": 2000
            },
            {
              "label": "Annualised run rate (£)",
              "value": 24000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-119",
      "name": "Revenue per visitor",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Use the same reporting window and visitor definition for both figures.",
      "url": "/calculators/revenue-per-visitor/",
      "version": "2973bb2f86caf8b22fe3e92421e7fa7dcfb730e24338bf10a09f60bb76b2a480",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Revenue (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visitors",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Revenue per visitor (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the same reporting window and visitor definition for both figures."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Revenue per visitor (£)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Revenue per visitor calculator.",
        "Help me calculate revenue per visitor."
      ],
      "retrieval_phrases": [
        "Revenue per visitor",
        "revenue per visitor"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 2000
          },
          "outputs": [
            {
              "label": "Revenue per visitor (£)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-120",
      "name": "Advertising budget target",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Assumes conversion rate and click cost stay constant as spend scales.",
      "url": "/calculators/advertising-budget-target/",
      "version": "530a920762a59760d6511f46fd4006a4162d29cf1a27541dd3af47d891fd0840",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Revenue target (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Order value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Conversion rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Cost per click (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required ad budget (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required clicks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes conversion rate and click cost stay constant as spend scales."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required ad budget (£)",
          "text": "a ÷ b ÷ (c ÷ 100) × d"
        },
        {
          "label": "Required clicks",
          "text": "a ÷ b ÷ (c ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Advertising budget target calculator.",
        "Help me calculate advertising budget target."
      ],
      "retrieval_phrases": [
        "Advertising budget target",
        "advertising budget target"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 100,
            "c": 2,
            "d": 1
          },
          "outputs": [
            {
              "label": "Required ad budget (£)",
              "value": 5000
            },
            {
              "label": "Required clicks",
              "value": 5000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-121",
      "name": "Affiliate earnings",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "This expected-value scenario excludes returns, declined commissions and attribution loss.",
      "url": "/calculators/affiliate-earnings/",
      "version": "6135c1f2eb9029ee324dcd36cb58a8feccc90fa327d27af44cc2ca01c1324cfd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Visits",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Outbound click rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Retailer conversion (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Basket value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Commission (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Projected commission (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This expected-value scenario excludes returns, declined commissions and attribution loss."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Projected commission (£)",
          "text": "a × b ÷ 100 × c ÷ 100 × d × e ÷ 100"
        }
      ],
      "example_questions": [
        "Use the Affiliate earnings calculator.",
        "Help me calculate affiliate earnings."
      ],
      "retrieval_phrases": [
        "Affiliate earnings",
        "affiliate earnings"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 20,
            "c": 5,
            "d": 100,
            "e": 10
          },
          "outputs": [
            {
              "label": "Projected commission (£)",
              "value": 1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-122",
      "name": "Marketplace payout",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Percentage fees apply to gross entered sales. Model refunds and nonrefundable fees according to your marketplace.",
      "url": "/calculators/marketplace-payout/",
      "version": "4420fedada1d0fa1235270a2ab023c839b7bee67dc0e5fbd53b62e57211f619d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unit sale price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Percentage fee (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total fixed fees (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Refunds (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Shipping costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net payout (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Percentage fees apply to gross entered sales. Model refunds and nonrefundable fees according to your marketplace."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net payout (£)",
          "text": "a × b × (1-c ÷ 100)-d-e-f"
        }
      ],
      "example_questions": [
        "Use the Marketplace payout calculator.",
        "Help me calculate marketplace payout."
      ],
      "retrieval_phrases": [
        "Marketplace payout",
        "marketplace payout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 10,
            "d": 5,
            "e": 100,
            "f": 20
          },
          "outputs": [
            {
              "label": "Net payout (£)",
              "value": 775
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-123",
      "name": "Payment processing fees",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "This arithmetic estimate does not round each transaction fee to pennies; actual processor settlement can differ.",
      "url": "/calculators/payment-processing-fees/",
      "version": "ec8d1b7f74820b51d609eae933ff45b55c1a90897db59e8fc20a43136fa3d9e2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Transaction amounts (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Percentage fee (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fixed fee per transaction (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total fees (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net proceeds (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This arithmetic estimate does not round each transaction fee to pennies; actual processor settlement can differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total fees (£)",
          "text": "sum(a) × b ÷ 100+count(a) × c"
        },
        {
          "label": "Net proceeds (£)",
          "text": "sum(a) × (1-b ÷ 100)-count(a) × c"
        }
      ],
      "example_questions": [
        "Use the Payment processing fees calculator.",
        "Help me calculate payment processing fees."
      ],
      "retrieval_phrases": [
        "Payment processing fees",
        "payment processing fees"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30",
            "b": 2,
            "c": 0.2
          },
          "outputs": [
            {
              "label": "Total fees (£)",
              "value": 1.8
            },
            {
              "label": "Net proceeds (£)",
              "value": 58.199999999999996
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-124",
      "name": "Free-shipping threshold",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Assumes the gross-margin percentage stays constant and shipping is the only additional cost.",
      "url": "/calculators/free-shipping-threshold/",
      "version": "7d754eb0f21bf5c8e5cc4cbbfd343a74e3399fa458dd9eebdcba724d4d3ea4c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gross margin (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Shipping cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Desired retained contribution (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Minimum order (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the gross-margin percentage stays constant and shipping is the only additional cost."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Minimum order (£)",
          "text": "(b+c) ÷ (a ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Free-shipping threshold calculator.",
        "Help me calculate free-shipping threshold."
      ],
      "retrieval_phrases": [
        "Free-shipping threshold",
        "free shipping threshold"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 5,
            "c": 15
          },
          "outputs": [
            {
              "label": "Minimum order (£)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-125",
      "name": "Campaign pacing",
      "category": "Marketing and online sales",
      "status": "available",
      "purpose": "Uses elapsed whole days and a uniform remaining daily budget.",
      "url": "/calculators/campaign-pacing/",
      "version": "996ecba4e33fdcbb8237522d7590eb6dc24932c257fbefb330af709a8b739c0e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total budget (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Spent (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Total campaign days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Elapsed days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Remaining daily budget (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected spend to date (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses elapsed whole days and a uniform remaining daily budget."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Remaining daily budget (£)",
          "text": "(a-b) ÷ (c-d)"
        },
        {
          "label": "Expected spend to date (£)",
          "text": "a × d ÷ c"
        }
      ],
      "example_questions": [
        "Use the Campaign pacing calculator.",
        "Help me calculate campaign pacing."
      ],
      "retrieval_phrases": [
        "Campaign pacing",
        "campaign pacing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 400,
            "c": 10,
            "d": 4
          },
          "outputs": [
            {
              "label": "Remaining daily budget (£)",
              "value": 100
            },
            {
              "label": "Expected spend to date (£)",
              "value": 400
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-126",
      "name": "Date difference",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Uses calendar dates at UTC midnight and excludes the starting day. Earlier end dates return negative elapsed days.",
      "url": "/calculators/date-difference/",
      "version": "708d7cd253450295102b8d7d94ea6e57f4eb6b39e4b1a145dbeead52ce65a75c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Start date (YYYY-MM-DD)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "End date (YYYY-MM-DD)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Elapsed calendar days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses calendar dates at UTC midnight and excludes the starting day. Earlier end dates return negative elapsed days."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Elapsed calendar days",
          "text": "(UTCdate(b)-UTCdate(a)) ÷ 86400000"
        }
      ],
      "example_questions": [
        "Use the Date difference calculator.",
        "Help me calculate date difference."
      ],
      "retrieval_phrases": [
        "Date difference",
        "date difference"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-01",
            "b": "2026-01-11"
          },
          "outputs": [
            {
              "label": "Elapsed calendar days",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-127",
      "name": "Add or subtract dates",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Months are added first, clamping to the last valid day of the target month. Calendar days are then added.",
      "url": "/calculators/add-or-subtract-dates/",
      "version": "cf64394cde90f6d3dee1d82ce99d6e75a25067c3a2ca83d8aeae9ae4e374fd49",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Start date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Months to add",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Days to add",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Resulting date",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Months are added first, clamping to the last valid day of the target month. Calendar days are then added."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Resulting date",
          "text": "shiftDate(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Add or subtract dates calculator.",
        "Help me calculate add or subtract dates."
      ],
      "retrieval_phrases": [
        "Add or subtract dates",
        "add or subtract dates"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-31",
            "b": 1,
            "c": 0
          },
          "outputs": [
            {
              "label": "Resulting date",
              "value": "2026-02-28"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-128",
      "name": "Business days between dates",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Includes both dates. Weekends are Saturday and Sunday. Enter holidays explicitly; no local holiday calendar is fetched.",
      "url": "/calculators/business-days-between-dates/",
      "version": "d23d68f8640b1caecae5d8267c5281864e0e4a4fa70505611bfba7872c8415d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Start date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "End date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "c",
          "label": "Holidays, comma-separated or none",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Working days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Includes both dates. Weekends are Saturday and Sunday. Enter holidays explicitly; no local holiday calendar is fetched."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Working days",
          "text": "workingDays(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Business days between dates calculator.",
        "Help me calculate business days between dates."
      ],
      "retrieval_phrases": [
        "Business days between dates",
        "business days between dates"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-05",
            "b": "2026-01-09",
            "c": "none"
          },
          "outputs": [
            {
              "label": "Working days",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-129",
      "name": "Business-day deadline",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "The start date is not counted. Saturday, Sunday and supplied holidays are skipped. Zero days returns the start date.",
      "url": "/calculators/business-day-deadline/",
      "version": "ee5b39137356231fba641d5375ce6b128607f7e227576a4b2a103639f1585485",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Start date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Working days to add",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Holidays, comma-separated or none",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Deadline",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The start date is not counted. Saturday, Sunday and supplied holidays are skipped. Zero days returns the start date."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Deadline",
          "text": "addWorkingDays(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Business-day deadline calculator.",
        "Help me calculate business-day deadline."
      ],
      "retrieval_phrases": [
        "Business-day deadline",
        "business day deadline"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-09",
            "b": 1,
            "c": "none"
          },
          "outputs": [
            {
              "label": "Deadline",
              "value": "2026-01-12"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-130",
      "name": "Age on a date",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Uses completed calendar years. For a February 29 birth, the anniversary is March 1 in non-leap years. No birth date is sent to a server.",
      "url": "/calculators/age-on-a-date/",
      "version": "6e18958508bd91a1fe58bcd01b33c339d0ebfd4f80a23a1078e055fc40c0eb2c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Date of birth",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Reference date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Completed years",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses completed calendar years. For a February 29 birth, the anniversary is March 1 in non-leap years. No birth date is sent to a server."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Completed years",
          "text": "completedYears(a,b)"
        }
      ],
      "example_questions": [
        "Use the Age on a date calculator.",
        "Help me calculate age on a date."
      ],
      "retrieval_phrases": [
        "Age on a date",
        "age on a date"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2000-01-01",
            "b": "2026-01-01"
          },
          "outputs": [
            {
              "label": "Completed years",
              "value": 26
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-131",
      "name": "Time duration",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "An earlier end time is treated as the next day. Equal times mean zero hours, not 24. This is a wall-clock duration without DST adjustments.",
      "url": "/calculators/time-duration/",
      "version": "9e291c5085aedb3c7bc4bf8268400d98412d4276c7fc9e8298c7d36ba3e56304",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Start time (HH:MM)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "End time (HH:MM)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Duration (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An earlier end time is treated as the next day. Equal times mean zero hours, not 24. This is a wall-clock duration without DST adjustments."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Duration (hours)",
          "text": "((clockMinutes(b)-clockMinutes(a)+1440) rem 1440) ÷ 60"
        }
      ],
      "example_questions": [
        "Use the Time duration calculator.",
        "Help me calculate time duration."
      ],
      "retrieval_phrases": [
        "Time duration",
        "time duration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "22:00",
            "b": "06:00"
          },
          "outputs": [
            {
              "label": "Duration (hours)",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-132",
      "name": "Time arithmetic",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Enter signed minutes to add or subtract durations. This is elapsed time, not clock times.",
      "url": "/calculators/time-arithmetic/",
      "version": "08fb0527aed5c8fe0e84f6edea9e7738aa4c6004280dff6a628161f4a23787cb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Durations in minutes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter signed minutes to add or subtract durations. This is elapsed time, not clock times."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total minutes",
          "text": "sum(a)"
        },
        {
          "label": "Total hours",
          "text": "sum(a) ÷ 60"
        }
      ],
      "example_questions": [
        "Use the Time arithmetic calculator.",
        "Help me calculate time arithmetic."
      ],
      "retrieval_phrases": [
        "Time arithmetic",
        "time arithmetic"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,45,60"
          },
          "outputs": [
            {
              "label": "Total minutes",
              "value": 135
            },
            {
              "label": "Total hours",
              "value": 2.25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-133",
      "name": "Decimal hours converter",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Converts decimal hours into hours and minutes, rounded to the nearest minute.",
      "url": "/calculators/decimal-hours-converter/",
      "version": "a651e65ab4b23cfaff9ca72e18170ac39fdcd01abb305d59c9e9595cd688d0a7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Decimal hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hours and minutes",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Converts decimal hours into hours and minutes, rounded to the nearest minute."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hours and minutes",
          "text": "hoursAndMinutes(a × 60)"
        }
      ],
      "example_questions": [
        "Use the Decimal hours converter calculator.",
        "Help me calculate decimal hours converter."
      ],
      "retrieval_phrases": [
        "Decimal hours converter",
        "decimal hours converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1.5
          },
          "outputs": [
            {
              "label": "Hours and minutes",
              "value": "1h 30m"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-134",
      "name": "Timesheet total",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Enter one shift per line. Earlier end times cross midnight. Breaks cannot exceed a shift; DST and multiple-day shifts are not inferred.",
      "url": "/calculators/timesheet-total/",
      "version": "6dee8a4fb99c36c28d0f97f1a30c081daba4c9a360583e681129dccf75a348bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Daily start,end,break-minutes (one day per line)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Paid hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter one shift per line. Earlier end times cross midnight. Breaks cannot exceed a shift; DST and multiple-day shifts are not inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Paid hours",
          "text": "timesheetHours(a)"
        }
      ],
      "example_questions": [
        "Use the Timesheet total calculator.",
        "Help me calculate timesheet total."
      ],
      "retrieval_phrases": [
        "Timesheet total",
        "timesheet total"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "09:00,17:00,30"
          },
          "outputs": [
            {
              "label": "Paid hours",
              "value": 7.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-135",
      "name": "Shift pay",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Uses one entered overtime threshold and multiplier. It does not determine employment entitlements or tax deductions.",
      "url": "/calculators/shift-pay/",
      "version": "8e5d71e2cbb483a4e62d2a5bf2d9969b6b0d7b679ce770934507fc8fcb5d6a92",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hourly rate (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overtime starts after hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Overtime multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gross pay (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses one entered overtime threshold and multiplier. It does not determine employment entitlements or tax deductions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gross pay (£)",
          "text": "min(a,c) × b+max(0,a-c) × b × d"
        }
      ],
      "example_questions": [
        "Use the Shift pay calculator.",
        "Help me calculate shift pay."
      ],
      "retrieval_phrases": [
        "Shift pay",
        "shift pay"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 45,
            "b": 10,
            "c": 40,
            "d": 1.5
          },
          "outputs": [
            {
              "label": "Gross pay (£)",
              "value": 475
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-136",
      "name": "Overlapping shifts",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Same-day intervals only. Produces coverage counts between each change in staffing; overnight and DST schedules need separate treatment.",
      "url": "/calculators/overlapping-shifts/",
      "version": "2f44ded45cfacd3f21c2cd073f8ffaf36c024299b28285a28b829c43528eedf9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Shift intervals in HH:MM-HH:MM, one per line",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Coverage segments",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Same-day intervals only. Produces coverage counts between each change in staffing; overnight and DST schedules need separate treatment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Coverage segments",
          "text": "shiftCoverage(a)"
        }
      ],
      "example_questions": [
        "Use the Overlapping shifts calculator.",
        "Help me calculate overlapping shifts."
      ],
      "retrieval_phrases": [
        "Overlapping shifts",
        "overlapping shifts"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "09:00-12:00\n10:00-14:00"
          },
          "outputs": [
            {
              "label": "Coverage segments",
              "value": "09:00–10:00: 1 working; 10:00–12:00: 2 working; 12:00–14:00: 1 working"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-137",
      "name": "Meeting time-zone overlap",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Checks one-hour UTC slots whose starts fall within both local work windows during the selected UTC day. Both locations use the same entered working hours; no holiday or availability data is connected.",
      "url": "/calculators/meeting-time-zone-overlap/",
      "version": "d819609d6585fffd848ee2fe957614422f021ed87c1ad475540b9064ec0d3714",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Meeting date (UTC day)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "IANA time zone A",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "c",
          "label": "IANA time zone B",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "d",
          "label": "Start work hour",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "End work hour",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Available UTC start hours",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Checks one-hour UTC slots whose starts fall within both local work windows during the selected UTC day. Both locations use the same entered working hours; no holiday or availability data is connected."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Available UTC start hours",
          "text": "overlapSlots(a,b,c,d,e)"
        }
      ],
      "example_questions": [
        "Use the Meeting time-zone overlap calculator.",
        "Help me calculate meeting time-zone overlap."
      ],
      "retrieval_phrases": [
        "Meeting time-zone overlap",
        "meeting time zone overlap"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-15",
            "b": "Europe/London",
            "c": "America/New_York",
            "d": 9,
            "e": 17
          },
          "outputs": [
            {
              "label": "Available UTC start hours",
              "value": "14:00Z, 15:00Z, 16:00Z"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-138",
      "name": "Countdown",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "A reproducible countdown between two explicit timestamps. Include Z or a numeric timezone offset; a negative result means the target is earlier.",
      "url": "/calculators/countdown/",
      "version": "cb6f474adb5bf62ce40b55cbee2c17535b55f109bd873ec22d5dc45d4fa5bcdf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "From timestamp with offset",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Target timestamp with offset",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hours remaining",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A reproducible countdown between two explicit timestamps. Include Z or a numeric timezone offset; a negative result means the target is earlier."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hours remaining",
          "text": "(timestampMilliseconds(b)-timestampMilliseconds(a)) ÷ 3600000"
        }
      ],
      "example_questions": [
        "Use the Countdown calculator.",
        "Help me calculate countdown."
      ],
      "retrieval_phrases": [
        "Countdown",
        "countdown"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-01T00:00:00Z",
            "b": "2026-01-02T12:00:00Z"
          },
          "outputs": [
            {
              "label": "Hours remaining",
              "value": 36
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-139",
      "name": "Recurring event dates",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Generates a fixed calendar-day recurrence, including the first date. This version is not a monthly scheduling rule.",
      "url": "/calculators/recurring-event-dates/",
      "version": "2f73124a8c6c11334f4206b01c4f141740c7b4335b7280cbcc0ece5868f36bc2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Interval in days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Occurrences",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Occurrence dates",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Generates a fixed calendar-day recurrence, including the first date. This version is not a monthly scheduling rule."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Occurrence dates",
          "text": "repeatDates(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Recurring event dates calculator.",
        "Help me calculate recurring event dates."
      ],
      "retrieval_phrases": [
        "Recurring event dates",
        "recurring event dates"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-01",
            "b": 7,
            "c": 4
          },
          "outputs": [
            {
              "label": "Occurrence dates",
              "value": "2026-01-01, 2026-01-08, 2026-01-15, 2026-01-22"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-140",
      "name": "Week number",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "ISO weeks begin Monday; week 1 contains January 4. The ISO week-year can differ from the calendar year.",
      "url": "/calculators/week-number/",
      "version": "5297a49f23936c5494273c1512e65fac19cf31efc4045cb93f2f9502e711e6b5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "ISO week",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "ISO weeks begin Monday; week 1 contains January 4. The ISO week-year can differ from the calendar year."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "ISO week",
          "text": "ISOweek(a)"
        }
      ],
      "example_questions": [
        "Use the Week number calculator.",
        "Help me calculate week number."
      ],
      "retrieval_phrases": [
        "Week number",
        "week number"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-01"
          },
          "outputs": [
            {
              "label": "ISO week",
              "value": "2026-W01"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-141",
      "name": "Workdays remaining",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Counts both endpoints, excluding weekends and the dates you supply. No jurisdiction-specific holidays are assumed.",
      "url": "/calculators/workdays-remaining/",
      "version": "cb4c969b510f8d3f0c6536d899102f9ced531e0b50da6ae88a423b7f299e24fb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "From date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Deadline date",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "c",
          "label": "Leave and holidays, comma-separated or none",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Available workdays",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts both endpoints, excluding weekends and the dates you supply. No jurisdiction-specific holidays are assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Available workdays",
          "text": "workingDays(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Workdays remaining calculator.",
        "Help me calculate workdays remaining."
      ],
      "retrieval_phrases": [
        "Workdays remaining",
        "workdays remaining"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2026-01-05",
            "b": "2026-01-09",
            "c": "none"
          },
          "outputs": [
            {
              "label": "Available workdays",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-142",
      "name": "Leave balance",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "A simple linear accrual balance. Employer rounding, carry-over and contractual rules must be entered separately.",
      "url": "/calculators/leave-balance/",
      "version": "82947bf48c33371d351cd133cdd118e183df42f32d97f8fcf2e4e8764ba3d60c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starting leave (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Accrual per month (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Months accrued",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Leave taken (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Remaining leave (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A simple linear accrual balance. Employer rounding, carry-over and contractual rules must be entered separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Remaining leave (days)",
          "text": "a+b × c-d"
        }
      ],
      "example_questions": [
        "Use the Leave balance calculator.",
        "Help me calculate leave balance."
      ],
      "retrieval_phrases": [
        "Leave balance",
        "leave balance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2,
            "c": 3,
            "d": 4
          },
          "outputs": [
            {
              "label": "Remaining leave (days)",
              "value": 12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-143",
      "name": "Task effort forecast",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Assumes work can be divided across the team without dependencies, coordination overhead or bottlenecks.",
      "url": "/calculators/task-effort-forecast/",
      "version": "02e91976990e7fdc1d46796866b93c81e2d568a0d70e7074843fd6bff4b1fd17",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Task effort (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "People",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Productive hours per person per day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Capacity-based days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes work can be divided across the team without dependencies, coordination overhead or bottlenecks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Capacity-based days",
          "text": "a ÷ (b × c)"
        }
      ],
      "example_questions": [
        "Use the Task effort forecast calculator.",
        "Help me calculate task effort forecast."
      ],
      "retrieval_phrases": [
        "Task effort forecast",
        "task effort forecast"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 3,
            "c": 5
          },
          "outputs": [
            {
              "label": "Capacity-based days",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-144",
      "name": "Three-point project estimate",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Uses the PERT weighted estimate. It is a planning approximation, not a guaranteed completion interval.",
      "url": "/calculators/three-point-project-estimate/",
      "version": "a3b7cd78a4e3b4ff1ae2f64897ddb3fb21ea3a955956eb29917e0e46f8ff0ce5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Optimistic duration",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Most likely duration",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pessimistic duration",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "PERT expected duration",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated standard deviation",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the PERT weighted estimate. It is a planning approximation, not a guaranteed completion interval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "PERT expected duration",
          "text": "(a+4 × b+c) ÷ 6"
        },
        {
          "label": "Estimated standard deviation",
          "text": "(c-a) ÷ 6"
        }
      ],
      "example_questions": [
        "Use the Three-point project estimate calculator.",
        "Help me calculate three-point project estimate."
      ],
      "retrieval_phrases": [
        "Three-point project estimate",
        "three point project estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 5,
            "c": 8
          },
          "outputs": [
            {
              "label": "PERT expected duration",
              "value": 5
            },
            {
              "label": "Estimated standard deviation",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-145",
      "name": "Critical path",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Uses a directed acyclic dependency graph with unlimited resources. Durations must share units. Cycles and unknown dependencies are rejected.",
      "url": "/calculators/critical-path/",
      "version": "573e4226ae337f43b9d9eff0173e0dabf3e884139bc0341551218f73cd05f92c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Tasks: ID,duration,dependencies separated by spaces (one per line)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Project duration",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Critical path",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a directed acyclic dependency graph with unlimited resources. Durations must share units. Cycles and unknown dependencies are rejected."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Project duration",
          "text": "For each task, earliest finish = its duration + the greatest earliest finish among its dependencies (zero for no dependencies). Project duration is the largest task finish. Reject dependency cycles and unknown task IDs."
        },
        {
          "label": "Critical path",
          "text": "Trace the dependency choices giving that longest duration; display one such path if there is a tie."
        }
      ],
      "example_questions": [
        "Use the Critical path calculator.",
        "Help me calculate critical path."
      ],
      "retrieval_phrases": [
        "Critical path",
        "critical path"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "A,2,\nB,3,A\nC,1,A\nD,2,B C"
          },
          "outputs": [
            {
              "label": "Project duration",
              "value": 7
            },
            {
              "label": "Critical path",
              "value": "A → B → D"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-146",
      "name": "Pomodoro session planner",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Breaks occur only between focus blocks. No break is added after the final block.",
      "url": "/calculators/pomodoro-session-planner/",
      "version": "ebd5c12b448ff464e82995211eba8ce854d4287c716e2d3251585460e71b74b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Focus blocks",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Focus minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Short break minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Long break minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Blocks per long break",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Session minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Breaks occur only between focus blocks. No break is added after the final block."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Session minutes",
          "text": "a × b+floor((a-1) ÷ e) × d+((a-1)-floor((a-1) ÷ e)) × c"
        }
      ],
      "example_questions": [
        "Use the Pomodoro session planner calculator.",
        "Help me calculate pomodoro session planner."
      ],
      "retrieval_phrases": [
        "Pomodoro session planner",
        "pomodoro session planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 25,
            "c": 5,
            "d": 15,
            "e": 4
          },
          "outputs": [
            {
              "label": "Session minutes",
              "value": 115
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-147",
      "name": "Reading time",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Reading speed is your assumption. Complex material and note-taking may take longer.",
      "url": "/calculators/reading-time/",
      "version": "d9c19e59c024acb2bb141c5b5bca4446f25c7d88f21300be5658fb2dd0be5c40",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Word count",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Reading words per minute",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Reading minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reading speed is your assumption. Complex material and note-taking may take longer."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Reading minutes",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Reading time calculator.",
        "Help me calculate reading time."
      ],
      "retrieval_phrases": [
        "Reading time",
        "reading time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 200
          },
          "outputs": [
            {
              "label": "Reading minutes",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-148",
      "name": "Speaking time",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Adds explicit pause time to a constant speaking-rate estimate.",
      "url": "/calculators/speaking-time/",
      "version": "0ab14f70ce56098cddee731e2e80d6660e15083668aeb5faaefd060f17085f76",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Word count",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Speaking words per minute",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Pause minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Presentation minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds explicit pause time to a constant speaking-rate estimate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Presentation minutes",
          "text": "a ÷ b+c"
        }
      ],
      "example_questions": [
        "Use the Speaking time calculator.",
        "Help me calculate speaking time."
      ],
      "retrieval_phrases": [
        "Speaking time",
        "speaking time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 600,
            "b": 120,
            "c": 1
          },
          "outputs": [
            {
              "label": "Presentation minutes",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-149",
      "name": "Typing completion time",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Correction allowance increases the estimated typing time; research and drafting time are excluded.",
      "url": "/calculators/typing-completion-time/",
      "version": "7f1a8d7644922b4fd74340b807012f5364536c8d3d083c4d64af0d446d1b4419",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Word count",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Typing words per minute",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Correction allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Typing minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Correction allowance increases the estimated typing time; research and drafting time are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Typing minutes",
          "text": "a ÷ b × (1+c ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Typing completion time calculator.",
        "Help me calculate typing completion time."
      ],
      "retrieval_phrases": [
        "Typing completion time",
        "typing completion time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 50,
            "c": 10
          },
          "outputs": [
            {
              "label": "Typing minutes",
              "value": 22
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-150",
      "name": "Deadline capacity gap",
      "category": "Time and work planning",
      "status": "available",
      "purpose": "Assumes work is distributable and every entered hour is productive.",
      "url": "/calculators/deadline-capacity-gap/",
      "version": "825ad74a53d6a449434f22a17f4644325b01c09520c40fe9f00b1928f67ee186",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Remaining work (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Working days left",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Daily hours per person",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "People",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Capacity (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Shortfall (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes work is distributable and every entered hour is productive."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Capacity (hours)",
          "text": "b × c × d"
        },
        {
          "label": "Shortfall (hours)",
          "text": "max(0,a-b × c × d)"
        }
      ],
      "example_questions": [
        "Use the Deadline capacity gap calculator.",
        "Help me calculate deadline capacity gap."
      ],
      "retrieval_phrases": [
        "Deadline capacity gap",
        "deadline capacity gap"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 5,
            "c": 6,
            "d": 3
          },
          "outputs": [
            {
              "label": "Capacity (hours)",
              "value": 90
            },
            {
              "label": "Shortfall (hours)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Calendar and timezone test matrix including leap years, month ends, DST and supplied holidays; explicit inclusion conventions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-151",
      "name": "Wall paint quantity",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Use net paintable area times coats divided by product coverage. Coverage varies by surface and product.",
      "url": "/calculators/wall-paint-quantity/",
      "version": "51d268a6e98e921e01f3abb7144004f71bd7c9c40958330ceac18d5789975424",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Wall area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Openings (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Coats",
          "type": "integer",
          "required": true,
          "unit": "coat",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Coverage (m²/L per coat)",
          "type": "number",
          "required": true,
          "unit": "m2/L/coat",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Paint (L)",
          "type": "number",
          "unit": "L",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Use net paintable area times coats divided by product coverage. Coverage varies by surface and product."
      ],
      "constraints": {
        "relations": [
          {
            "left": "b",
            "operator": "<=",
            "right": "a",
            "message": "Openings cannot exceed wall area."
          }
        ],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Paint (L)",
          "text": "(a-b) × c ÷ d × (1+e ÷ 100)"
        }
      ],
      "example_questions": [
        "How many litres of paint do I need for my walls?",
        "Estimate wall paint quantity"
      ],
      "retrieval_phrases": [
        "paint",
        "painting"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 4,
            "c": 2,
            "d": 12,
            "e": 10
          },
          "outputs": [
            {
              "label": "Paint (L)",
              "value": 6.6000000000000005
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-152",
      "name": "Flooring packs",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Waste is added before rounding up to complete packs. This is an area estimate, not a cutting layout.",
      "url": "/calculators/flooring-packs/",
      "version": "37c71abd406c07f96c112c77426b96ea8315b7390d8921514ef110ead43b624d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Floor area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Pack coverage (m²)",
          "type": "number",
          "required": true,
          "unit": "m2/pack",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Whole packs",
          "type": "number",
          "unit": "pack",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Purchased area (m²)",
          "type": "number",
          "unit": "m2",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Waste is added before rounding up to complete packs. This is an area estimate, not a cutting layout."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Whole packs",
          "text": "roundUp(a × (1+c ÷ 100) ÷ b)"
        },
        {
          "label": "Purchased area (m²)",
          "text": "roundUp(a × (1+c ÷ 100) ÷ b) × b"
        }
      ],
      "example_questions": [
        "How many flooring packs do I need?",
        "Estimate laminate packs including waste"
      ],
      "retrieval_phrases": [
        "flooring",
        "laminate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 2,
            "c": 10
          },
          "outputs": [
            {
              "label": "Whole packs",
              "value": 11
            },
            {
              "label": "Purchased area (m²)",
              "value": 22
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-153",
      "name": "Tile quantity",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Uses tile face area and a waste allowance; no reduction for grout gaps. Complex cuts may require extra tiles.",
      "url": "/calculators/tile-quantity/",
      "version": "4c7d11f4e59f17bb0b8893edeb977e777a10254c69117355602ca56c15e872e4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Surface area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tile width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tile height (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Tiles required",
          "type": "number",
          "unit": "tile",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Uses tile face area and a waste allowance; no reduction for grout gaps. Complex cuts may require extra tiles."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Tiles required",
          "text": "roundUp(a ÷ ((b ÷ 100) × (c ÷ 100)) × (1+d ÷ 100))"
        }
      ],
      "example_questions": [
        "How many tiles will cover my bathroom?",
        "Calculate tile quantity including waste"
      ],
      "retrieval_phrases": [
        "tiles",
        "tile quantity",
        "tile count"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 20,
            "c": 20,
            "d": 10
          },
          "outputs": [
            {
              "label": "Tiles required",
              "value": 275
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-154",
      "name": "Wallpaper rolls",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Full drops are rounded up; pattern repeat rounds the drop length up to a repeat. Openings are not subtracted in this conservative strip model.",
      "url": "/calculators/wallpaper-rolls/",
      "version": "ea71e71e7ee7a772d4897e3b630df4c521e93c272ff040a4f96a522183050b70",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Wall run (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Wall height (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Roll width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Roll length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Pattern repeat (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Rolls",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Full drops are rounded up; pattern repeat rounds the drop length up to a repeat. Openings are not subtracted in this conservative strip model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Rolls",
          "text": "wallpaperRolls(a,b,c,d,e)"
        }
      ],
      "example_questions": [
        "Use the Wallpaper rolls calculator.",
        "Help me calculate wallpaper rolls."
      ],
      "retrieval_phrases": [
        "Wallpaper rolls",
        "wallpaper rolls"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2.5,
            "c": 0.5,
            "d": 10,
            "e": 0
          },
          "outputs": [
            {
              "label": "Rolls",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-155",
      "name": "Concrete volume",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Volume equals length × width × depth, with depth converted from centimetres. Confirm supplier requirements and structural design separately.",
      "url": "/calculators/concrete-volume/",
      "version": "e281a199329bb3d12cd35b43f5a9e8df2cb4c712a5ae6e5107d7c1e0cccf5a4b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Slab length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Concrete (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Volume equals length × width × depth, with depth converted from centimetres. Confirm supplier requirements and structural design separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Concrete (m³)",
          "text": "a × b × c ÷ 100 × (1+d ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Concrete volume calculator.",
        "Help me calculate concrete volume."
      ],
      "retrieval_phrases": [
        "Concrete volume",
        "concrete volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 4,
            "c": 10,
            "d": 10
          },
          "outputs": [
            {
              "label": "Concrete (m³)",
              "value": 2.2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-156",
      "name": "Grout quantity",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Uses the common thin-joint approximation. Product-specific coverage and jobsite losses can change the required quantity.",
      "url": "/calculators/grout-quantity/",
      "version": "9bb61b4c38411113b3800e8a7886831e5689549243915d234f6b8531013a81f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tile width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tile height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Joint width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Joint depth (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Grout density (kg/L)",
          "type": "number",
          "required": true,
          "unit": "kg/L",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Approximate grout (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the common thin-joint approximation. Product-specific coverage and jobsite losses can change the required quantity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Approximate grout (kg)",
          "text": "(b+c) ÷ (b × c) × d × e × f × a"
        }
      ],
      "example_questions": [
        "Use the Grout quantity calculator.",
        "Help me calculate grout quantity."
      ],
      "retrieval_phrases": [
        "Grout quantity",
        "grout quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 200,
            "c": 200,
            "d": 3,
            "e": 5,
            "f": 1.6
          },
          "outputs": [
            {
              "label": "Approximate grout (kg)",
              "value": 2.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-157",
      "name": "Tile adhesive quantity",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Use the supplier consumption for the substrate and trowel. Round up to whole bags.",
      "url": "/calculators/tile-adhesive-quantity/",
      "version": "f9fb68ec97ee9fee55703e9b9468c34a0b5ccd1ce3c7b5e02b95331bddeab570",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consumption (kg/m²)",
          "type": "number",
          "required": true,
          "unit": "kg/m2",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bag weight (kg)",
          "type": "number",
          "required": true,
          "unit": "kg/bag",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bags",
          "type": "number",
          "unit": "bag",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Adhesive (kg)",
          "type": "number",
          "unit": "kg",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Use the supplier consumption for the substrate and trowel. Round up to whole bags."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bags",
          "text": "roundUp(a × b ÷ c)"
        },
        {
          "label": "Adhesive (kg)",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "How many bags of tile adhesive do I need?",
        "Work out tile adhesive weight"
      ],
      "retrieval_phrases": [
        "adhesive"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 4,
            "c": 20
          },
          "outputs": [
            {
              "label": "Bags",
              "value": 4
            },
            {
              "label": "Adhesive (kg)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-158",
      "name": "Plaster quantity",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Consumption is per square metre per millimetre. Verify the product yield and thickness range.",
      "url": "/calculators/plaster-quantity/",
      "version": "01af1a5b6d27b66efa4ed73faa03471cd4e626b5a37f8a610ac35f648aea74ea",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplier consumption (kg/m²/mm)",
          "type": "number",
          "required": true,
          "unit": "kg/m2/mm",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Bag size (kg)",
          "type": "number",
          "required": true,
          "unit": "kg/bag",
          "unit_status": "explicit",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bags",
          "type": "number",
          "unit": "bag",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Plaster (kg)",
          "type": "number",
          "unit": "kg",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Consumption is per square metre per millimetre. Verify the product yield and thickness range."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bags",
          "text": "roundUp(a × b × c ÷ d)"
        },
        {
          "label": "Plaster (kg)",
          "text": "a × b × c"
        }
      ],
      "example_questions": [
        "How many bags of plaster do I need?",
        "Estimate plaster weight from thickness"
      ],
      "retrieval_phrases": [
        "plaster"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10,
            "c": 1,
            "d": 25
          },
          "outputs": [
            {
              "label": "Bags",
              "value": 8
            },
            {
              "label": "Plaster (kg)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-159",
      "name": "Skirting board lengths",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "This is a total-length estimate. A cutting plan may need more stock for individual long runs.",
      "url": "/calculators/skirting-board-lengths/",
      "version": "e065183ce81fbe5e12d737e5285b34005fbccca3c66e1f9d3e053a16d224b2b9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Room perimeter (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Door openings (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Stock length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Stock lengths",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net run (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This is a total-length estimate. A cutting plan may need more stock for individual long runs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Stock lengths",
          "text": "roundUp((a-b) × (1+d ÷ 100) ÷ c)"
        },
        {
          "label": "Net run (m)",
          "text": "a-b"
        }
      ],
      "example_questions": [
        "Use the Skirting board lengths calculator.",
        "Help me calculate skirting board lengths."
      ],
      "retrieval_phrases": [
        "Skirting board lengths",
        "skirting board lengths"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 2,
            "c": 3,
            "d": 10
          },
          "outputs": [
            {
              "label": "Stock lengths",
              "value": 7
            },
            {
              "label": "Net run (m)",
              "value": 18
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-160",
      "name": "Coving length",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Uses rectangular-room perimeter and entered exclusions; corner cuts are not optimised.",
      "url": "/calculators/coving-length/",
      "version": "73872043bfe1f5cf32ca3c2c7d7c2ad98cff7a29a968ad6bef120105cd162f39",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Room length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Excluded run (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Stock length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Stock lengths",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net coving run (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses rectangular-room perimeter and entered exclusions; corner cuts are not optimised."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Stock lengths",
          "text": "roundUp((2 × (a+b)-c) ÷ d)"
        },
        {
          "label": "Net coving run (m)",
          "text": "2 × (a+b)-c"
        }
      ],
      "example_questions": [
        "Use the Coving length calculator.",
        "Help me calculate coving length."
      ],
      "retrieval_phrases": [
        "Coving length",
        "coving length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 4,
            "c": 0,
            "d": 3
          },
          "outputs": [
            {
              "label": "Stock lengths",
              "value": 6
            },
            {
              "label": "Net coving run (m)",
              "value": 18
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-161",
      "name": "Roof sheet quantity",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Use effective cover dimensions after overlap. Count roof planes separately. This is not a wind-load or fixing specification.",
      "url": "/calculators/roof-sheet-quantity/",
      "version": "16a1304c505131ad9c2d1dcca2e738f914c5bf520a8f0d5d31c7147f71effdab",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Roof plane width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Plane slope length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Effective sheet cover width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Effective cover length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sheets",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use effective cover dimensions after overlap. Count roof planes separately. This is not a wind-load or fixing specification."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sheets",
          "text": "roundUp(a ÷ c) × roundUp(b ÷ d)"
        }
      ],
      "example_questions": [
        "Use the Roof sheet quantity calculator.",
        "Help me calculate roof sheet quantity."
      ],
      "retrieval_phrases": [
        "Roof sheet quantity",
        "roof sheet quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 4,
            "c": 1,
            "d": 2
          },
          "outputs": [
            {
              "label": "Sheets",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-162",
      "name": "Gutter lengths",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Rounds each independent run separately. Fittings, outlets and downpipes are additional.",
      "url": "/calculators/gutter-lengths/",
      "version": "c9d8d331d6b5e5fd58fb54d5adff4eb9ada38b474d5045cd19ae355fb185d1b4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gutter runs (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Stock length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Stock pieces",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total length (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rounds each independent run separately. Fittings, outlets and downpipes are additional."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Stock pieces",
          "text": "For each run x in a, round up x/b to whole stock pieces; then add the counts."
        },
        {
          "label": "Total length (m)",
          "text": "Add all run lengths in a."
        }
      ],
      "example_questions": [
        "Use the Gutter lengths calculator.",
        "Help me calculate gutter lengths."
      ],
      "retrieval_phrases": [
        "Gutter lengths",
        "gutter lengths"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "8,5",
            "b": 3
          },
          "outputs": [
            {
              "label": "Stock pieces",
              "value": 5
            },
            {
              "label": "Total length (m)",
              "value": 13
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-163",
      "name": "Insulation packs",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Use the coverage stated for the selected insulation thickness. Thermal performance is not calculated.",
      "url": "/calculators/insulation-packs/",
      "version": "c29d90d0789dd150356b81777f68d7378b4da974a3c1479b3e6d8ea7e8c3f144",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Pack coverage (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Layers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Packs",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the coverage stated for the selected insulation thickness. Thermal performance is not calculated."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Packs",
          "text": "roundUp(a × c × (1+d ÷ 100) ÷ b)"
        }
      ],
      "example_questions": [
        "Use the Insulation packs calculator.",
        "Help me calculate insulation packs."
      ],
      "retrieval_phrases": [
        "Insulation packs",
        "insulation packs"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 5,
            "c": 2,
            "d": 10
          },
          "outputs": [
            {
              "label": "Packs",
              "value": 22
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-164",
      "name": "Drywall sheets",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "An area-based material estimate; framing, sheet orientation and offcuts can increase the requirement.",
      "url": "/calculators/drywall-sheets/",
      "version": "c47e45455537f138bcd1400867eb41d51f1ec8a1d5e851284a5f8bda6d7ba719",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Wall area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Openings (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sheet area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sheets",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An area-based material estimate; framing, sheet orientation and offcuts can increase the requirement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sheets",
          "text": "roundUp((a-b) × (1+d ÷ 100) ÷ c)"
        }
      ],
      "example_questions": [
        "Use the Drywall sheets calculator.",
        "Help me calculate drywall sheets."
      ],
      "retrieval_phrases": [
        "Drywall sheets",
        "drywall sheets"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 4,
            "c": 2.4,
            "d": 10
          },
          "outputs": [
            {
              "label": "Sheets",
              "value": 17
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-165",
      "name": "Brick quantity",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Counts a single visible wall face using nominal modules including joints. Wall thickness and bond can require additional bricks.",
      "url": "/calculators/brick-quantity/",
      "version": "9c0ea5fadc4fcc7d1b20343f497b8866bb4ed209e8090175b1c3915b7b1933af",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Net wall area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Brick face width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Face height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Joint (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bricks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts a single visible wall face using nominal modules including joints. Wall thickness and bond can require additional bricks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bricks",
          "text": "roundUp(a ÷ ((b+d) × (c+d) ÷ 1e6) × (1+e ÷ 100))"
        }
      ],
      "example_questions": [
        "Use the Brick quantity calculator.",
        "Help me calculate brick quantity."
      ],
      "retrieval_phrases": [
        "Brick quantity",
        "brick quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 215,
            "c": 65,
            "d": 10,
            "e": 5
          },
          "outputs": [
            {
              "label": "Bricks",
              "value": 623
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-166",
      "name": "Mortar quantity",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Enter a mortar allowance suitable for the brick and joint geometry. The tool does not prescribe a structural mortar mix.",
      "url": "/calculators/mortar-quantity/",
      "version": "fff1c568e96d0c9d87f3014dd3db7a1611f68556ff8b79a74705fef06613ff86",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Brick count",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Mortar allowance per brick (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Batch yield (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mortar (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Batches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter a mortar allowance suitable for the brick and joint geometry. The tool does not prescribe a structural mortar mix."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mortar (L)",
          "text": "a × b × (1+c ÷ 100)"
        },
        {
          "label": "Batches",
          "text": "roundUp(a × b × (1+c ÷ 100) ÷ d)"
        }
      ],
      "example_questions": [
        "Use the Mortar quantity calculator.",
        "Help me calculate mortar quantity."
      ],
      "retrieval_phrases": [
        "Mortar quantity",
        "mortar quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 0.5,
            "c": 10,
            "d": 100
          },
          "outputs": [
            {
              "label": "Mortar (L)",
              "value": 275
            },
            {
              "label": "Batches",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-167",
      "name": "Fence panels",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Model assumes a straight run with posts at both ends and one post between panels. The last panel may require cutting.",
      "url": "/calculators/fence-panels/",
      "version": "0b35cbf06a8bd5e2210e13846b401af1dc1927a2e9b4eddf6ffc3ea85949d6b5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fence length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Panel width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Post width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Panels",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Posts",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Model assumes a straight run with posts at both ends and one post between panels. The last panel may require cutting."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Panels",
          "text": "roundUp(max(0,a-c) ÷ (b+c))"
        },
        {
          "label": "Posts",
          "text": "roundUp(max(0,a-c) ÷ (b+c))+1"
        }
      ],
      "example_questions": [
        "Use the Fence panels calculator.",
        "Help me calculate fence panels."
      ],
      "retrieval_phrases": [
        "Fence panels",
        "fence panels"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2,
            "c": 0.1
          },
          "outputs": [
            {
              "label": "Panels",
              "value": 5
            },
            {
              "label": "Posts",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-168",
      "name": "Decking boards",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Total-area estimate using effective board cover width. Board orientation, joins and unsupported ends need a layout plan.",
      "url": "/calculators/decking-boards/",
      "version": "c3307164eed3ec9f954aed1a735222d3adcb3e96e8b5558f20583ddc7a1de18b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Deck area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Board cover width including gap (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Stock length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Stock boards",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Total-area estimate using effective board cover width. Board orientation, joins and unsupported ends need a layout plan."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Stock boards",
          "text": "roundUp(a ÷ b × (1+d ÷ 100) ÷ c)"
        }
      ],
      "example_questions": [
        "Use the Decking boards calculator.",
        "Help me calculate decking boards."
      ],
      "retrieval_phrases": [
        "Decking boards",
        "decking boards"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 0.15,
            "c": 3,
            "d": 10
          },
          "outputs": [
            {
              "label": "Stock boards",
              "value": 49
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-169",
      "name": "Stair geometry",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Assumes the upper landing serves as the final tread. These dimensions do not establish building-code compliance.",
      "url": "/calculators/stair-geometry/",
      "version": "7125854918f802d4d7e2be3a4295ee6db71c1f11cf3d73fea0d08aa50ed08beb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total rise (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Riser count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tread depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Riser height (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Run with one fewer tread (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the upper landing serves as the final tread. These dimensions do not establish building-code compliance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Riser height (cm)",
          "text": "a ÷ b"
        },
        {
          "label": "Run with one fewer tread (cm)",
          "text": "(b-1) × c"
        }
      ],
      "example_questions": [
        "Use the Stair geometry calculator.",
        "Help me calculate stair geometry."
      ],
      "retrieval_phrases": [
        "Stair geometry",
        "stair geometry"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 280,
            "b": 14,
            "c": 25
          },
          "outputs": [
            {
              "label": "Riser height (cm)",
              "value": 20
            },
            {
              "label": "Run with one fewer tread (cm)",
              "value": 325
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-170",
      "name": "Ramp gradient",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Gradient is rise divided by horizontal run. This does not assess accessibility or building standards.",
      "url": "/calculators/ramp-gradient/",
      "version": "bad91e375b787409e24b826131ae68adf938b45190b5c8178def5f42798cb250",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rise (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Horizontal run (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gradient (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Angle (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Gradient is rise divided by horizontal run. This does not assess accessibility or building standards."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gradient (%)",
          "text": "a ÷ b × 100"
        },
        {
          "label": "Angle (degrees)",
          "text": "atan(a ÷ b) × 180 ÷ π"
        }
      ],
      "example_questions": [
        "Use the Ramp gradient calculator.",
        "Help me calculate ramp gradient."
      ],
      "retrieval_phrases": [
        "Ramp gradient",
        "ramp gradient"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 12
          },
          "outputs": [
            {
              "label": "Gradient (%)",
              "value": 8.333333333333332
            },
            {
              "label": "Angle (degrees)",
              "value": 4.763641690726177
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-171",
      "name": "Roof pitch",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Use the same units for rise and run. Run is horizontal, not the roof slope length.",
      "url": "/calculators/roof-pitch/",
      "version": "a5a5f00048dba435bc8f6c202176d24974cdd91b3c357df735c1021305a45594",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rise",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Horizontal run",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pitch (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Slope ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the same units for rise and run. Run is horizontal, not the roof slope length."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pitch (degrees)",
          "text": "atan(a ÷ b) × 180 ÷ π"
        },
        {
          "label": "Slope ratio",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Roof pitch calculator.",
        "Help me calculate roof pitch."
      ],
      "retrieval_phrases": [
        "Roof pitch",
        "roof pitch"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 4
          },
          "outputs": [
            {
              "label": "Pitch (degrees)",
              "value": 36.86989764584402
            },
            {
              "label": "Slope ratio",
              "value": 0.75
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-172",
      "name": "Roof area",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Applies to roof planes with one common pitch. Include overhangs in the horizontal projected area.",
      "url": "/calculators/roof-area/",
      "version": "c9f70cb7f82e1fba94be92f97c714b658355b8b9aade1660db2eb4535e7a0dc1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Horizontal projected roof area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Pitch (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sloped roof area (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Applies to roof planes with one common pitch. Include overhangs in the horizontal projected area."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sloped roof area (m²)",
          "text": "a ÷ cos(b × π ÷ 180)"
        }
      ],
      "example_questions": [
        "Use the Roof area calculator.",
        "Help me calculate roof area."
      ],
      "retrieval_phrases": [
        "Roof area",
        "roof area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 30
          },
          "outputs": [
            {
              "label": "Sloped roof area (m²)",
              "value": 115.47005383792515
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-173",
      "name": "Sealant cartridges",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Rectangular joint cross-section, without waste. Actual bead shape and material loss may change yield.",
      "url": "/calculators/sealant-cartridges/",
      "version": "93f6b69935a8f63199e45bc8b268a6083a0ff0136df36e641207828f112d5379",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Joint length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Depth (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Cartridge volume (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cartridges",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sealant volume (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rectangular joint cross-section, without waste. Actual bead shape and material loss may change yield."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cartridges",
          "text": "roundUp(a × b × c ÷ d)"
        },
        {
          "label": "Sealant volume (mL)",
          "text": "a × b × c"
        }
      ],
      "example_questions": [
        "Use the Sealant cartridges calculator.",
        "Help me calculate sealant cartridges."
      ],
      "retrieval_phrases": [
        "Sealant cartridges",
        "sealant cartridges"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 10,
            "c": 10,
            "d": 300
          },
          "outputs": [
            {
              "label": "Cartridges",
              "value": 4
            },
            {
              "label": "Sealant volume (mL)",
              "value": 1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-174",
      "name": "Radiator paint area",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "The surface multiplier approximates additional panels and contours. Use paint appropriate for the radiator and follow its coverage guidance.",
      "url": "/calculators/radiator-paint-area/",
      "version": "9eea85f47d495b57dcbf8809571f210c123b779e540e07d1c9faf95fab83dc50",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radiator width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Height (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Surface multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Coats",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Coverage (m²/L)",
          "type": "number",
          "required": true,
          "unit": "m²/L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Paint (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The surface multiplier approximates additional panels and contours. Use paint appropriate for the radiator and follow its coverage guidance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Paint (L)",
          "text": "a × b × c × d ÷ e"
        }
      ],
      "example_questions": [
        "Use the Radiator paint area calculator.",
        "Help me calculate radiator paint area."
      ],
      "retrieval_phrases": [
        "Radiator paint area",
        "radiator paint area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 0.6,
            "c": 2,
            "d": 2,
            "e": 10
          },
          "outputs": [
            {
              "label": "Paint (L)",
              "value": 0.24
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-175",
      "name": "Renovation contingency budget",
      "category": "Home renovation and materials",
      "status": "available",
      "purpose": "Contingency is a budget allowance chosen by you, not a prediction of final cost.",
      "url": "/calculators/renovation-contingency-budget/",
      "version": "3b62aa1018ffc042c32653f527b2631b00f204e78f9ccc968bc9a606f05ca1c5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Quoted costs (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "items": {
            "type": "number",
            "minimum": 0
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Contingency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Budget (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total including reserve (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Budget remaining (£)",
          "type": "number",
          "unit": "GBP",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Contingency is a budget allowance chosen by you, not a prediction of final cost."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total including reserve (£)",
          "text": "sum(a) × (1+b ÷ 100)"
        },
        {
          "label": "Budget remaining (£)",
          "text": "c-sum(a) × (1+b ÷ 100)"
        }
      ],
      "example_questions": [
        "Add a contingency to my renovation budget",
        "Allow a reserve for quoted renovation costs"
      ],
      "retrieval_phrases": [
        "renovation budget",
        "contingency",
        "renovation costs"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5000,3000,2000",
            "b": 15,
            "c": 12000
          },
          "outputs": [
            {
              "label": "Total including reserve (£)",
              "value": 11500
            },
            {
              "label": "Budget remaining (£)",
              "value": 500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-176",
      "name": "Topsoil quantity",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Depth is converted to metres. Bulk density depends on moisture and compaction.",
      "url": "/calculators/topsoil-quantity/",
      "version": "aab5b1e145b00862b420994b89a8a7bcdf6e9dcc38427787b4bf6159812f887d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bulk density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": "kg/m³",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated mass (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Depth is converted to metres. Bulk density depends on moisture and compaction."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume (m³)",
          "text": "a × b ÷ 100"
        },
        {
          "label": "Estimated mass (kg)",
          "text": "a × b ÷ 100 × c"
        }
      ],
      "example_questions": [
        "Use the Topsoil quantity calculator.",
        "Help me calculate topsoil quantity."
      ],
      "retrieval_phrases": [
        "Topsoil quantity",
        "topsoil quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10,
            "c": 1200
          },
          "outputs": [
            {
              "label": "Volume (m³)",
              "value": 2
            },
            {
              "label": "Estimated mass (kg)",
              "value": 2400
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-177",
      "name": "Mulch quantity",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "One square metre covered to one centimetre deep is ten litres. Settlement is not included.",
      "url": "/calculators/mulch-quantity/",
      "version": "508211fbad4c8120261d1f4211fe062c4c6ae159b556c9e95870d9cb48fe4b93",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bag size (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bags",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One square metre covered to one centimetre deep is ten litres. Settlement is not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bags",
          "text": "roundUp(a × b × 10 ÷ c)"
        },
        {
          "label": "Volume (L)",
          "text": "a × b × 10"
        }
      ],
      "example_questions": [
        "Use the Mulch quantity calculator.",
        "Help me calculate mulch quantity."
      ],
      "retrieval_phrases": [
        "Mulch quantity",
        "mulch quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 5,
            "c": 50
          },
          "outputs": [
            {
              "label": "Bags",
              "value": 10
            },
            {
              "label": "Volume (L)",
              "value": 500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-178",
      "name": "Compost blend",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Volume ratios do not establish chemical nutrient balance. Choose suitable ingredients separately.",
      "url": "/calculators/compost-blend/",
      "version": "aee2358c016ee01cbbb827d6169ac557ede2788dc84bc501c51139ac8200f5db",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target volume (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Blend ratio parts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Component volumes (L)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Volume ratios do not establish chemical nutrient balance. Choose suitable ingredients separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Component volumes (L)",
          "text": "For each blend part x in b: a × x/sum(b)."
        }
      ],
      "example_questions": [
        "Use the Compost blend calculator.",
        "Help me calculate compost blend."
      ],
      "retrieval_phrases": [
        "Compost blend",
        "compost blend"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "2,1,1"
          },
          "outputs": [
            {
              "label": "Component volumes (L)",
              "value": "50, 25, 25"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-179",
      "name": "Gravel quantity",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Use the supplier bulk density. Compaction and material loss are not automatically included.",
      "url": "/calculators/gravel-quantity/",
      "version": "218a2e192542ce9e792d4e40ebf7b903e02d4daf411fcdb081e2d81563e0d7bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bulk density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": "kg/m³",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gravel mass (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Volume (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the supplier bulk density. Compaction and material loss are not automatically included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gravel mass (kg)",
          "text": "a × b ÷ 100 × c"
        },
        {
          "label": "Volume (m³)",
          "text": "a × b ÷ 100"
        }
      ],
      "example_questions": [
        "Use the Gravel quantity calculator.",
        "Help me calculate gravel quantity."
      ],
      "retrieval_phrases": [
        "Gravel quantity",
        "gravel quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 5,
            "c": 1600
          },
          "outputs": [
            {
              "label": "Gravel mass (kg)",
              "value": 1600
            },
            {
              "label": "Volume (m³)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-180",
      "name": "Raised-bed soil",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Uses internal bed dimensions and uniform fill depth. Deduct internal structures separately.",
      "url": "/calculators/raised-bed-soil/",
      "version": "31a4a1af14f83441b1aed7c508167c0aa653b670f703129ad768d1e37148fae6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bed length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fill depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Number of beds",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fill volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses internal bed dimensions and uniform fill depth. Deduct internal structures separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fill volume (L)",
          "text": "a × b × c × 10 × d"
        }
      ],
      "example_questions": [
        "Use the Raised-bed soil calculator.",
        "Help me calculate raised-bed soil."
      ],
      "retrieval_phrases": [
        "Raised-bed soil",
        "raised bed soil"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 1,
            "c": 30,
            "d": 2
          },
          "outputs": [
            {
              "label": "Fill volume (L)",
              "value": 1200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-181",
      "name": "Plant spacing",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "A square grid with half-spacing margins around the bed. It is a geometric estimate, not a species-specific planting recommendation.",
      "url": "/calculators/plant-spacing/",
      "version": "aa427c1a39c7e43e04b7a53993fb914656bb7d5e94dc9166c7cacdae3313fe0f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bed length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Plant spacing (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Plants",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A square grid with half-spacing margins around the bed. It is a geometric estimate, not a species-specific planting recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Plants",
          "text": "floor(a ÷ c) × floor(b ÷ c)"
        }
      ],
      "example_questions": [
        "Use the Plant spacing calculator.",
        "Help me calculate plant spacing."
      ],
      "retrieval_phrases": [
        "Plant spacing",
        "plant spacing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 2,
            "c": 0.5
          },
          "outputs": [
            {
              "label": "Plants",
              "value": 24
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-182",
      "name": "Seed quantity",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Use the product rate for your seed and application method.",
      "url": "/calculators/seed-quantity/",
      "version": "e58f5c790d8b1379e5b24ed54d0ac62dffc431702b2069e43a36b143db9b034f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Supplier seed rate (g/m²)",
          "type": "number",
          "required": true,
          "unit": "g/m²",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pack mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Seed required (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Packs",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the product rate for your seed and application method."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Seed required (g)",
          "text": "a × b"
        },
        {
          "label": "Packs",
          "text": "roundUp(a × b ÷ c)"
        }
      ],
      "example_questions": [
        "Use the Seed quantity calculator.",
        "Help me calculate seed quantity."
      ],
      "retrieval_phrases": [
        "Seed quantity",
        "seed quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 30,
            "c": 1000
          },
          "outputs": [
            {
              "label": "Seed required (g)",
              "value": 3000
            },
            {
              "label": "Packs",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-183",
      "name": "Turf rolls",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Allows the entered waste percentage before rounding up to whole rolls.",
      "url": "/calculators/turf-rolls/",
      "version": "fefc35f14e88ab33a20e9cc52bd794ecf78257e12cfe1bae140cbe630ef76cad",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Lawn area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "explicit",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Roll coverage (m²)",
          "type": "number",
          "required": true,
          "unit": "m2/roll",
          "unit_status": "explicit",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Rolls",
          "type": "number",
          "unit": "roll",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "Allows the entered waste percentage before rounding up to whole rolls."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Rolls",
          "text": "roundUp(a × (1+c ÷ 100) ÷ b)"
        }
      ],
      "example_questions": [
        "How many turf rolls will cover my lawn?",
        "Calculate lawn turf with a waste allowance"
      ],
      "retrieval_phrases": [
        "turf",
        "lawn"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 1,
            "c": 10
          },
          "outputs": [
            {
              "label": "Rolls",
              "value": 55
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-184",
      "name": "Paving slabs",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "An area-based count without reducing for joints. Patterns and cuts may change required quantities.",
      "url": "/calculators/paving-slabs/",
      "version": "038767fd9a4775e3e93b6e5f542719ebb4089d2ee8c5ccedc029b131806978e8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Patio area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Slab width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Slab length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Slabs",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An area-based count without reducing for joints. Patterns and cuts may change required quantities."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Slabs",
          "text": "roundUp(a ÷ (b × c ÷ 10000) × (1+d ÷ 100))"
        }
      ],
      "example_questions": [
        "Use the Paving slabs calculator.",
        "Help me calculate paving slabs."
      ],
      "retrieval_phrases": [
        "Paving slabs",
        "paving slabs"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 50,
            "c": 50,
            "d": 10
          },
          "outputs": [
            {
              "label": "Slabs",
              "value": 44
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-185",
      "name": "Paver base",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "The compaction allowance is entered by you and varies with the material.",
      "url": "/calculators/paver-base/",
      "version": "76740df74d08624cc15df5e2e9526abe037823b6ab862d433705b6dcddcbc693",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Compacted depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Loose-volume allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Loose density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": "kg/m³",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Loose volume (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mass (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The compaction allowance is entered by you and varies with the material."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Loose volume (m³)",
          "text": "a × b ÷ 100 × (1+c ÷ 100)"
        },
        {
          "label": "Mass (kg)",
          "text": "a × b ÷ 100 × (1+c ÷ 100) × d"
        }
      ],
      "example_questions": [
        "Use the Paver base calculator.",
        "Help me calculate paver base."
      ],
      "retrieval_phrases": [
        "Paver base",
        "paver base"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10,
            "c": 20,
            "d": 1500
          },
          "outputs": [
            {
              "label": "Loose volume (m³)",
              "value": 2.4
            },
            {
              "label": "Mass (kg)",
              "value": 3600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-186",
      "name": "Edging blocks",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Curves and corners may need additional pieces or cuts.",
      "url": "/calculators/edging-blocks/",
      "version": "17400c38a7a7bc2af90e9e87b906de38632958c6c849f54ff9a23c86bb15d14a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Border length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Edging units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Curves and corners may need additional pieces or cuts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Edging units",
          "text": "roundUp(a ÷ (b ÷ 100) × (1+c ÷ 100))"
        }
      ],
      "example_questions": [
        "Use the Edging blocks calculator.",
        "Help me calculate edging blocks."
      ],
      "retrieval_phrases": [
        "Edging blocks",
        "edging blocks"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 50,
            "c": 5
          },
          "outputs": [
            {
              "label": "Edging units",
              "value": 42
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-187",
      "name": "Tree spacing",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Assumes a rectangular grid including endpoints after setbacks. Species, roots and local rules are not assessed.",
      "url": "/calculators/tree-spacing/",
      "version": "98019224929b705864a127d207f7afc1e15059fd6e55a5a6ea24a6f6c4287464",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Plot length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Row spacing (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Tree spacing (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Edge setback (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Tree positions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes a rectangular grid including endpoints after setbacks. Species, roots and local rules are not assessed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Tree positions",
          "text": "max(0,floor((a-2 × e) ÷ d)+1) × max(0,floor((b-2 × e) ÷ c)+1)"
        }
      ],
      "example_questions": [
        "Use the Tree spacing calculator.",
        "Help me calculate tree spacing."
      ],
      "retrieval_phrases": [
        "Tree spacing",
        "tree spacing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10,
            "c": 5,
            "d": 5,
            "e": 2.5
          },
          "outputs": [
            {
              "label": "Tree positions",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-188",
      "name": "Irrigation runtime",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "One millimetre over one square metre is one litre. Uniform application is assumed.",
      "url": "/calculators/irrigation-runtime/",
      "version": "278513b99e57b69798b94a1e834012289c590f3e0df944257ebb563cc2fd655e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target water depth (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Measured flow (L/min)",
          "type": "number",
          "required": true,
          "unit": "L/min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Runtime (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Water required (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One millimetre over one square metre is one litre. Uniform application is assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Runtime (minutes)",
          "text": "a × b ÷ c"
        },
        {
          "label": "Water required (L)",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "Use the Irrigation runtime calculator.",
        "Help me calculate irrigation runtime."
      ],
      "retrieval_phrases": [
        "Irrigation runtime",
        "irrigation runtime"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10,
            "c": 10
          },
          "outputs": [
            {
              "label": "Runtime (minutes)",
              "value": 20
            },
            {
              "label": "Water required (L)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-189",
      "name": "Drip-line flow",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Uses the stated emitter flow, which can vary with water pressure.",
      "url": "/calculators/drip-line-flow/",
      "version": "1db31a249e0e2fe17de7ea71abd3921a2b7505b8d058c195505102144373e8c3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Emitter count",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Flow per emitter (L/hour)",
          "type": "number",
          "required": true,
          "unit": "L/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Run time (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Water delivered (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total flow (L/hour)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the stated emitter flow, which can vary with water pressure."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Water delivered (L)",
          "text": "a × b × c"
        },
        {
          "label": "Total flow (L/hour)",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "Use the Drip-line flow calculator.",
        "Help me calculate drip-line flow."
      ],
      "retrieval_phrases": [
        "Drip-line flow",
        "drip line flow"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 2,
            "c": 1.5
          },
          "outputs": [
            {
              "label": "Water delivered (L)",
              "value": 60
            },
            {
              "label": "Total flow (L/hour)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-190",
      "name": "Rainwater harvest",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Does not account for overflow, first-flush diversion or event timing beyond the entered efficiency.",
      "url": "/calculators/rainwater-harvest/",
      "version": "d69bf08c9804370989edd4ea58ce9bdb7a10f00c9fc408465be04229aea5215c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Roof collection area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rainfall (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Collection efficiency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Potential collection (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Does not account for overflow, first-flush diversion or event timing beyond the entered efficiency."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Potential collection (L)",
          "text": "a × b × c ÷ 100"
        }
      ],
      "example_questions": [
        "Use the Rainwater harvest calculator.",
        "Help me calculate rainwater harvest."
      ],
      "retrieval_phrases": [
        "Rainwater harvest",
        "rainwater harvest"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 80
          },
          "outputs": [
            {
              "label": "Potential collection (L)",
              "value": 800
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-191",
      "name": "Water-butt fill time",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Assumes constant inflow and no simultaneous use.",
      "url": "/calculators/water-butt-fill-time/",
      "version": "21c8df6c0b20d77d9a5d351f826eaeeb1b62f57bad627318fb25f2f8d8f4ffef",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Tank capacity (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting water (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Inflow (L/min)",
          "type": "number",
          "required": true,
          "unit": "L/min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fill time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes constant inflow and no simultaneous use."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fill time (minutes)",
          "text": "(a-b) ÷ c"
        }
      ],
      "example_questions": [
        "Use the Water-butt fill time calculator.",
        "Help me calculate water-butt fill time."
      ],
      "retrieval_phrases": [
        "Water-butt fill time",
        "water butt fill time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 50,
            "c": 10
          },
          "outputs": [
            {
              "label": "Fill time (minutes)",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-192",
      "name": "Pond volume",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Rectangular plan with an average depth. Irregular ponds require a measured area or a suitable approximation.",
      "url": "/calculators/pond-volume/",
      "version": "77aa42dd9d6003bae67058be0102c0ecaa706ac536d63d26d5c096f1aebe7608",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pond length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average depth (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Capacity (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rectangular plan with an average depth. Irregular ponds require a measured area or a suitable approximation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Capacity (L)",
          "text": "a × b × c × 1000"
        }
      ],
      "example_questions": [
        "Use the Pond volume calculator.",
        "Help me calculate pond volume."
      ],
      "retrieval_phrases": [
        "Pond volume",
        "pond volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 2,
            "c": 0.5
          },
          "outputs": [
            {
              "label": "Capacity (L)",
              "value": 3000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-193",
      "name": "Pond liner dimensions",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Adds twice the depth plus an allowance at each edge. Complex shelves may need a separate measurement.",
      "url": "/calculators/pond-liner-dimensions/",
      "version": "ad34387c2f46c7443dc713ee7f397e1ea1413d4c3fd6ae53ba70c34a0e927d29",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pond length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Maximum depth (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Edge allowance per side (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Liner length (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Liner width (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds twice the depth plus an allowance at each edge. Complex shelves may need a separate measurement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Liner length (m)",
          "text": "a+2 × c+2 × d"
        },
        {
          "label": "Liner width (m)",
          "text": "b+2 × c+2 × d"
        }
      ],
      "example_questions": [
        "Use the Pond liner dimensions calculator.",
        "Help me calculate pond liner dimensions."
      ],
      "retrieval_phrases": [
        "Pond liner dimensions",
        "pond liner dimensions"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 2,
            "c": 1,
            "d": 0.5
          },
          "outputs": [
            {
              "label": "Liner length (m)",
              "value": 6
            },
            {
              "label": "Liner width (m)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-194",
      "name": "Garden path area",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Uses rectangular segments. Avoid double-counting overlapping junctions.",
      "url": "/calculators/garden-path-area/",
      "version": "21ed307ab06f181b48885486b1f0b03fc7bd01935bee7c1f82d7f152956695d1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Segment lengths (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Segment widths (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Path area (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses rectangular segments. Avoid double-counting overlapping junctions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Path area (m²)",
          "text": "Multiply each segment length in a by its paired width in b, then add the rectangular areas."
        }
      ],
      "example_questions": [
        "Use the Garden path area calculator.",
        "Help me calculate garden path area."
      ],
      "retrieval_phrases": [
        "Garden path area",
        "garden path area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,10",
            "b": "1,1.5"
          },
          "outputs": [
            {
              "label": "Path area (m²)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-195",
      "name": "Stepping-stone layout",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Places full stones with equal gaps between stones only. Remaining end space is not distributed automatically.",
      "url": "/calculators/stepping-stone-layout/",
      "version": "ac17402ca52c4efebecb85fe6683f437cf59778e70ee27397fd32fd7282a1278",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Path length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Stone length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Gap (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Whole stones fitting",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Used length (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Places full stones with equal gaps between stones only. Remaining end space is not distributed automatically."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Whole stones fitting",
          "text": "floor((a+c) ÷ (b+c))"
        },
        {
          "label": "Used length (m)",
          "text": "max(0,floor((a+c) ÷ (b+c)) × b+(floor((a+c) ÷ (b+c))-1) × c)"
        }
      ],
      "example_questions": [
        "Use the Stepping-stone layout calculator.",
        "Help me calculate stepping-stone layout."
      ],
      "retrieval_phrases": [
        "Stepping-stone layout",
        "stepping stone layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 0.4,
            "c": 0.2
          },
          "outputs": [
            {
              "label": "Whole stones fitting",
              "value": 8
            },
            {
              "label": "Used length (m)",
              "value": 4.6000000000000005
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-196",
      "name": "Retaining-wall block quantity",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Face-area count only. Foundations, reinforcement, drainage and structural suitability require a separate design.",
      "url": "/calculators/retaining-wall-block-quantity/",
      "version": "974461bf91ecab760284a530574887fdb65edbf9d7aeb8676cbd4a146600c4ca",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Wall face area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Block face area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Blocks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Face-area count only. Foundations, reinforcement, drainage and structural suitability require a separate design."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Blocks",
          "text": "roundUp(a ÷ b × (1+c ÷ 100))"
        }
      ],
      "example_questions": [
        "Use the Retaining-wall block quantity calculator.",
        "Help me calculate retaining-wall block quantity."
      ],
      "retrieval_phrases": [
        "Retaining-wall block quantity",
        "retaining wall block quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 0.1,
            "c": 5
          },
          "outputs": [
            {
              "label": "Blocks",
              "value": 105
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-197",
      "name": "Landscape gradient",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Measure horizontal distance, not the distance along the slope.",
      "url": "/calculators/landscape-gradient/",
      "version": "9958ba55592c57c785297f4f01f70289582fafced0dfa4260254593755677d0d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Elevation change (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Horizontal distance (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Slope (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Angle (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Measure horizontal distance, not the distance along the slope."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Slope (%)",
          "text": "a ÷ b × 100"
        },
        {
          "label": "Angle (degrees)",
          "text": "atan(a ÷ b) × 180 ÷ π"
        }
      ],
      "example_questions": [
        "Use the Landscape gradient calculator.",
        "Help me calculate landscape gradient."
      ],
      "retrieval_phrases": [
        "Landscape gradient",
        "landscape gradient"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 20
          },
          "outputs": [
            {
              "label": "Slope (%)",
              "value": 5
            },
            {
              "label": "Angle (degrees)",
              "value": 2.8624052261117474
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-198",
      "name": "Compost-bin capacity",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "A rectangular-bin capacity. Decomposition and settling change the volume over time.",
      "url": "/calculators/compost-bin-capacity/",
      "version": "f8b56886a282dc6b771dc6c58d2ff4f8dab772859c0e3e19cf85b22ac3f9759e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Internal length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fill height (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Capacity (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A rectangular-bin capacity. Decomposition and settling change the volume over time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Capacity (L)",
          "text": "a × b × c × 1000"
        }
      ],
      "example_questions": [
        "Use the Compost-bin capacity calculator.",
        "Help me calculate compost-bin capacity."
      ],
      "retrieval_phrases": [
        "Compost-bin capacity",
        "compost bin capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 1,
            "c": 1
          },
          "outputs": [
            {
              "label": "Capacity (L)",
              "value": 1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-199",
      "name": "Greenhouse cover area",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Gable-ended greenhouse including walls and roof, excluding floor. Doors and vents are not deducted; overlap is not included.",
      "url": "/calculators/greenhouse-cover-area/",
      "version": "fd646ea6580db506b0c467685d1ee566cede10edb3656df2947c3635643f3771",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Greenhouse length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Eaves height (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Roof rise (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cover area (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Gable-ended greenhouse including walls and roof, excluding floor. Doors and vents are not deducted; overlap is not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cover area (m²)",
          "text": "2 × a × c+2 × b × c+b × d+2 × a × hypot(b ÷ 2,d)"
        }
      ],
      "example_questions": [
        "Use the Greenhouse cover area calculator.",
        "Help me calculate greenhouse cover area."
      ],
      "retrieval_phrases": [
        "Greenhouse cover area",
        "greenhouse cover area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 3,
            "c": 2,
            "d": 1
          },
          "outputs": [
            {
              "label": "Cover area (m²)",
              "value": 45.42220510185596
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-200",
      "name": "Garden material delivery cost",
      "category": "Garden and landscaping",
      "status": "available",
      "purpose": "Discount applies to materials before adding delivery. All quantities and prices must use the same unit.",
      "url": "/calculators/garden-material-delivery-cost/",
      "version": "8b0316169f2adf09d18d28aa40ebc4760df0c27acff416b3bbdc6bdc195cc755",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Quantity",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Delivery (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Discount (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Delivered cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Discount applies to materials before adding delivery. All quantities and prices must use the same unit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Delivered cost (£)",
          "text": "a × b × (1-d ÷ 100)+c"
        }
      ],
      "example_questions": [
        "Use the Garden material delivery cost calculator.",
        "Help me calculate garden material delivery cost."
      ],
      "retrieval_phrases": [
        "Garden material delivery cost",
        "garden material delivery cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 50,
            "c": 25,
            "d": 10
          },
          "outputs": [
            {
              "label": "Delivered cost (£)",
              "value": 160
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Supplier-unit and coverage definitions; net/gross area rules; waste and whole-pack rounding; explain estimate versus measured layout.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-201",
      "name": "Rectangle dimensions",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Use the same length unit for both dimensions. Area is in squared units.",
      "url": "/calculators/rectangle-dimensions/",
      "version": "1b68bb139242d866fb92af7bc6576dbada6d61a4eb60cf790788ae4ac76895c4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Length",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Perimeter",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Diagonal",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the same length unit for both dimensions. Area is in squared units."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "a × b"
        },
        {
          "label": "Perimeter",
          "text": "2 × (a+b)"
        },
        {
          "label": "Diagonal",
          "text": "hypot(a,b)"
        }
      ],
      "example_questions": [
        "Use the Rectangle dimensions calculator.",
        "Help me calculate rectangle dimensions."
      ],
      "retrieval_phrases": [
        "Rectangle dimensions",
        "rectangle dimensions"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 4
          },
          "outputs": [
            {
              "label": "Area",
              "value": 20
            },
            {
              "label": "Perimeter",
              "value": 18
            },
            {
              "label": "Diagonal",
              "value": 6.4031242374328485
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-202",
      "name": "Circle dimensions",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Radius is half the diameter. The area uses squared units; circumference uses the original length unit.",
      "url": "/calculators/circle-dimensions/",
      "version": "47365c70ecc8b15f7fef3a048bdbdf2823decbc29f18c3030a7965410308c176",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Circumference",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Diameter",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Radius is half the diameter. The area uses squared units; circumference uses the original length unit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "π × a × a"
        },
        {
          "label": "Circumference",
          "text": "2 × π × a"
        },
        {
          "label": "Diameter",
          "text": "2 × a"
        }
      ],
      "example_questions": [
        "Use the Circle dimensions calculator.",
        "Help me calculate circle dimensions."
      ],
      "retrieval_phrases": [
        "Circle dimensions",
        "circle dimensions"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3
          },
          "outputs": [
            {
              "label": "Area",
              "value": 28.274333882308138
            },
            {
              "label": "Circumference",
              "value": 18.84955592153876
            },
            {
              "label": "Diameter",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-203",
      "name": "Triangle from base and height",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Height must be perpendicular to the base, not the length of a sloping side.",
      "url": "/calculators/triangle-from-base-and-height/",
      "version": "447b2be8a26e9ff2a95e53b7f168fb2cdd8a453d4b659644076d478971767250",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Base",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Height must be perpendicular to the base, not the length of a sloping side."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "a × b ÷ 2"
        }
      ],
      "example_questions": [
        "Use the Triangle from base and height calculator.",
        "Help me calculate triangle from base and height."
      ],
      "retrieval_phrases": [
        "Triangle from base and height",
        "triangle from base and height"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6,
            "b": 4
          },
          "outputs": [
            {
              "label": "Area",
              "value": 12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-204",
      "name": "Triangle from three sides",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Heron’s formula uses all three sides. Any two sides must sum to more than the third.",
      "url": "/calculators/triangle-from-three-sides/",
      "version": "9017f08d51db64dc7034064bfbe08c39329f190e4a890f7ec06f522ce550aeae",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Side A",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Side B",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Side C",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Perimeter",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Heron’s formula uses all three sides. Any two sides must sum to more than the third."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "triangleArea(a,b,c)"
        },
        {
          "label": "Perimeter",
          "text": "a+b+c"
        }
      ],
      "example_questions": [
        "Use the Triangle from three sides calculator.",
        "Help me calculate triangle from three sides."
      ],
      "retrieval_phrases": [
        "Triangle from three sides",
        "triangle from three sides"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 4,
            "c": 5
          },
          "outputs": [
            {
              "label": "Area",
              "value": 6
            },
            {
              "label": "Perimeter",
              "value": 12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-205",
      "name": "Right triangle solver",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "This version takes the two perpendicular legs. It does not accept the hypotenuse as an input.",
      "url": "/calculators/right-triangle-solver/",
      "version": "624af8b60cd3ced7e720c3e3f83cd2a6e4a6ded58971004885f6a88298e92bae",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Leg A",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Leg B",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hypotenuse",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Angle opposite A (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This version takes the two perpendicular legs. It does not accept the hypotenuse as an input."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hypotenuse",
          "text": "hypot(a,b)"
        },
        {
          "label": "Area",
          "text": "a × b ÷ 2"
        },
        {
          "label": "Angle opposite A (degrees)",
          "text": "atan2(a,b) × 180 ÷ π"
        }
      ],
      "example_questions": [
        "Use the Right triangle solver calculator.",
        "Help me calculate right triangle solver."
      ],
      "retrieval_phrases": [
        "Right triangle solver",
        "right triangle solver"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 4
          },
          "outputs": [
            {
              "label": "Hypotenuse",
              "value": 5
            },
            {
              "label": "Area",
              "value": 6
            },
            {
              "label": "Angle opposite A (degrees)",
              "value": 36.86989764584402
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-206",
      "name": "Trapezoid area",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Take the mean of the parallel sides and multiply by the perpendicular height.",
      "url": "/calculators/trapezoid-area/",
      "version": "e66f3d4ffad145bbc8fc82a36b9ffd150ba1732bfb3827858f6c598aa8af8812",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Parallel side A",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Parallel side B",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Take the mean of the parallel sides and multiply by the perpendicular height."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "(a+b) × c ÷ 2"
        }
      ],
      "example_questions": [
        "Use the Trapezoid area calculator.",
        "Help me calculate trapezoid area."
      ],
      "retrieval_phrases": [
        "Trapezoid area",
        "trapezoid area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 6,
            "c": 3
          },
          "outputs": [
            {
              "label": "Area",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-207",
      "name": "Parallelogram area",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Perpendicular height can differ from the sloping side length.",
      "url": "/calculators/parallelogram-area/",
      "version": "64609232644f918d474d805754e521bb3e7333c86996a62db32787da1fdba07e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Base",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Perpendicular height can differ from the sloping side length."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "Use the Parallelogram area calculator.",
        "Help me calculate parallelogram area."
      ],
      "retrieval_phrases": [
        "Parallelogram area",
        "parallelogram area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 3
          },
          "outputs": [
            {
              "label": "Area",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-208",
      "name": "Rhombus geometry",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "A rhombus has perpendicular diagonals that bisect one another.",
      "url": "/calculators/rhombus-geometry/",
      "version": "8310c1ca8ce6a9515a93ecd7b90024d45f7c9af174e5de663a061fab86760454",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Diagonal A",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Diagonal B",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Side",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Perimeter",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A rhombus has perpendicular diagonals that bisect one another."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "a × b ÷ 2"
        },
        {
          "label": "Side",
          "text": "hypot(a ÷ 2,b ÷ 2)"
        },
        {
          "label": "Perimeter",
          "text": "4 × hypot(a ÷ 2,b ÷ 2)"
        }
      ],
      "example_questions": [
        "Use the Rhombus geometry calculator.",
        "Help me calculate rhombus geometry."
      ],
      "retrieval_phrases": [
        "Rhombus geometry",
        "rhombus geometry"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6,
            "b": 8
          },
          "outputs": [
            {
              "label": "Area",
              "value": 24
            },
            {
              "label": "Side",
              "value": 5
            },
            {
              "label": "Perimeter",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-209",
      "name": "Ellipse area",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Enter half-axis lengths. Perimeter uses Ramanujan’s first approximation; area is exact within floating-point precision.",
      "url": "/calculators/ellipse-area/",
      "version": "33aa9a61296d3d5679702d0e34a545893216c2496fbd1e24d84dec66f2af792b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Semi-axis A",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Semi-axis B",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Approximate perimeter",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter half-axis lengths. Perimeter uses Ramanujan’s first approximation; area is exact within floating-point precision."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "π × a × b"
        },
        {
          "label": "Approximate perimeter",
          "text": "π × (3 × (a+b)-sqrt((3 × a+b) × (a+3 × b)))"
        }
      ],
      "example_questions": [
        "Use the Ellipse area calculator.",
        "Help me calculate ellipse area."
      ],
      "retrieval_phrases": [
        "Ellipse area",
        "ellipse area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 3
          },
          "outputs": [
            {
              "label": "Area",
              "value": 47.12388980384689
            },
            {
              "label": "Approximate perimeter",
              "value": 25.526986393758545
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-210",
      "name": "Regular polygon",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Applies to a regular polygon with equal sides and angles.",
      "url": "/calculators/regular-polygon/",
      "version": "f28d39cc2ff8e684da8a813bb9f3c5daba6d6abc90d28d12ac01d6a5c9108789",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sides",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Side length",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Perimeter",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Interior angle (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Applies to a regular polygon with equal sides and angles."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "a × b × b ÷ (4 × tan(π ÷ a))"
        },
        {
          "label": "Perimeter",
          "text": "a × b"
        },
        {
          "label": "Interior angle (degrees)",
          "text": "(a-2) × 180 ÷ a"
        }
      ],
      "example_questions": [
        "Use the Regular polygon calculator.",
        "Help me calculate regular polygon."
      ],
      "retrieval_phrases": [
        "Regular polygon",
        "regular polygon"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6,
            "b": 2
          },
          "outputs": [
            {
              "label": "Area",
              "value": 10.392304845413264
            },
            {
              "label": "Perimeter",
              "value": 12
            },
            {
              "label": "Interior angle (degrees)",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-211",
      "name": "Circular sector",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "The central angle is measured in degrees and must be between zero and 360.",
      "url": "/calculators/circular-sector/",
      "version": "6b57cc6203521026cba5b915ba304e1dcc34d267ee01dc568848ae3a625c0d68",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sector area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Arc length",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The central angle is measured in degrees and must be between zero and 360."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sector area",
          "text": "π × a × a × b ÷ 360"
        },
        {
          "label": "Arc length",
          "text": "2 × π × a × b ÷ 360"
        }
      ],
      "example_questions": [
        "Use the Circular sector calculator.",
        "Help me calculate circular sector."
      ],
      "retrieval_phrases": [
        "Circular sector",
        "circular sector"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 90
          },
          "outputs": [
            {
              "label": "Sector area",
              "value": 7.068583470577034
            },
            {
              "label": "Arc length",
              "value": 4.71238898038469
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-212",
      "name": "Circular segment",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Segment area is sector area minus the signed centre triangle. The entered angle selects the segment.",
      "url": "/calculators/circular-segment/",
      "version": "9787fa2f453e1de5ba2966e8a377332b9a244c67e522ebd9c1227da90a38c222",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Segment area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Chord",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Segment area is sector area minus the signed centre triangle. The entered angle selects the segment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Segment area",
          "text": "a × a ÷ 2 × (b × π ÷ 180-sin(b × π ÷ 180))"
        },
        {
          "label": "Chord",
          "text": "2 × a × sin(b × π ÷ 360)"
        }
      ],
      "example_questions": [
        "Use the Circular segment calculator.",
        "Help me calculate circular segment."
      ],
      "retrieval_phrases": [
        "Circular segment",
        "circular segment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 90
          },
          "outputs": [
            {
              "label": "Segment area",
              "value": 2.5685834705770345
            },
            {
              "label": "Chord",
              "value": 4.242640687119285
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-213",
      "name": "Annulus area",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Subtract the inner circle area from the outer circle area.",
      "url": "/calculators/annulus-area/",
      "version": "4afabca2efa83a74bba5065d2cc8819eeef30d339a76e252657a87c4150aea0b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Outer radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Inner radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ring area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Combined boundary length",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Subtract the inner circle area from the outer circle area."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ring area",
          "text": "π × (a × a-b × b)"
        },
        {
          "label": "Combined boundary length",
          "text": "2 × π × (a+b)"
        }
      ],
      "example_questions": [
        "Use the Annulus area calculator.",
        "Help me calculate annulus area."
      ],
      "retrieval_phrases": [
        "Annulus area",
        "annulus area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 3
          },
          "outputs": [
            {
              "label": "Ring area",
              "value": 50.26548245743669
            },
            {
              "label": "Combined boundary length",
              "value": 50.26548245743669
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-214",
      "name": "Arc length",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Convert degrees to radians before multiplying by radius.",
      "url": "/calculators/arc-length/",
      "version": "33465e7eba17dc2486cd54803a1744ec3ce6b8eeb3e60870e524a6b583fd4540",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Arc length",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Convert degrees to radians before multiplying by radius."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Arc length",
          "text": "a × b × π ÷ 180"
        }
      ],
      "example_questions": [
        "Use the Arc length calculator.",
        "Help me calculate arc length."
      ],
      "retrieval_phrases": [
        "Arc length",
        "arc length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 60
          },
          "outputs": [
            {
              "label": "Arc length",
              "value": 3.141592653589793
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-215",
      "name": "Chord length",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Chord length is the straight distance between arc endpoints.",
      "url": "/calculators/chord-length/",
      "version": "0d999968d5141d91cdbb16869031bde1c6465b79fa5ef054beed0f044112da56",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Central angle (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Chord length",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Chord length is the straight distance between arc endpoints."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Chord length",
          "text": "2 × a × sin(b × π ÷ 360)"
        }
      ],
      "example_questions": [
        "Use the Chord length calculator.",
        "Help me calculate chord length."
      ],
      "retrieval_phrases": [
        "Chord length",
        "chord length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 60
          },
          "outputs": [
            {
              "label": "Chord length",
              "value": 4.999999999999999
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-216",
      "name": "Rectangular prism",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "All dimensions must share a unit. Volume is in cubic units.",
      "url": "/calculators/rectangular-prism/",
      "version": "690191cb75edb555910ee4ec30529c1c4dd8e766563de51df6c2770e97949792",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Length",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Height",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Surface area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Space diagonal",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All dimensions must share a unit. Volume is in cubic units."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "a × b × c"
        },
        {
          "label": "Surface area",
          "text": "2 × (a × b+a × c+b × c)"
        },
        {
          "label": "Space diagonal",
          "text": "hypot(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Rectangular prism calculator.",
        "Help me calculate rectangular prism."
      ],
      "retrieval_phrases": [
        "Rectangular prism",
        "rectangular prism"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3,
            "c": 4
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 24
            },
            {
              "label": "Surface area",
              "value": 52
            },
            {
              "label": "Space diagonal",
              "value": 5.385164807134504
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-217",
      "name": "Cylinder",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "A right circular cylinder, including both circular ends in surface area.",
      "url": "/calculators/cylinder/",
      "version": "7891314c6d4dc231ed134b7f4c88d5470fe1ee7e10b0ca8ea77d4fc5dd5df7a1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Height",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total surface area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A right circular cylinder, including both circular ends in surface area."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "π × a × a × b"
        },
        {
          "label": "Total surface area",
          "text": "2 × π × a × (a+b)"
        }
      ],
      "example_questions": [
        "Use the Cylinder calculator.",
        "Help me calculate cylinder."
      ],
      "retrieval_phrases": [
        "Cylinder",
        "cylinder"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 37.69911184307752
            },
            {
              "label": "Total surface area",
              "value": 62.83185307179586
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-218",
      "name": "Cone",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "A right circular cone. Slant height is not the perpendicular height.",
      "url": "/calculators/cone/",
      "version": "89e086769c824dae11a61941e1eed6b963ff964481a7533ddb7ca02bd48631b7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Slant height",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Surface area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A right circular cone. Slant height is not the perpendicular height."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "π × a × a × b ÷ 3"
        },
        {
          "label": "Slant height",
          "text": "hypot(a,b)"
        },
        {
          "label": "Surface area",
          "text": "π × a × (a+hypot(a,b))"
        }
      ],
      "example_questions": [
        "Use the Cone calculator.",
        "Help me calculate cone."
      ],
      "retrieval_phrases": [
        "Cone",
        "cone"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 4
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 37.69911184307752
            },
            {
              "label": "Slant height",
              "value": 5
            },
            {
              "label": "Surface area",
              "value": 75.39822368615503
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-219",
      "name": "Sphere",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Radius is measured from the sphere centre to its surface.",
      "url": "/calculators/sphere/",
      "version": "6ae5d3cb21bd6696ae0e4bbca4ec96894f8fa71515ef842be33385f0cf9da6d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Surface area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Radius is measured from the sphere centre to its surface."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "4 ÷ 3 × π × a^3"
        },
        {
          "label": "Surface area",
          "text": "4 × π × a × a"
        }
      ],
      "example_questions": [
        "Use the Sphere calculator.",
        "Help me calculate sphere."
      ],
      "retrieval_phrases": [
        "Sphere",
        "sphere"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 113.09733552923254
            },
            {
              "label": "Surface area",
              "value": 113.09733552923255
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-220",
      "name": "Hemisphere",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "A hemisphere is half a sphere; total surface area includes the flat circular base.",
      "url": "/calculators/hemisphere/",
      "version": "aba090e403bb34a636eec988f2b226be2bc71b487340592f15c13641a9155a3e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Curved area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Area including base",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A hemisphere is half a sphere; total surface area includes the flat circular base."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "2 ÷ 3 × π × a^3"
        },
        {
          "label": "Curved area",
          "text": "2 × π × a × a"
        },
        {
          "label": "Area including base",
          "text": "3 × π × a × a"
        }
      ],
      "example_questions": [
        "Use the Hemisphere calculator.",
        "Help me calculate hemisphere."
      ],
      "retrieval_phrases": [
        "Hemisphere",
        "hemisphere"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 56.54866776461627
            },
            {
              "label": "Curved area",
              "value": 56.548667764616276
            },
            {
              "label": "Area including base",
              "value": 84.82300164692441
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-221",
      "name": "Cone frustum",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "A right circular cone frustum with parallel circular ends.",
      "url": "/calculators/cone-frustum/",
      "version": "4c4efe704e674afe061c1f1fd49e33d0ce600bc4216b4591e9693af87db33fe1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bottom radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Top radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Height",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Slant height",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A right circular cone frustum with parallel circular ends."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "π × c ÷ 3 × (a × a+a × b+b × b)"
        },
        {
          "label": "Slant height",
          "text": "hypot(a-b,c)"
        }
      ],
      "example_questions": [
        "Use the Cone frustum calculator.",
        "Help me calculate cone frustum."
      ],
      "retrieval_phrases": [
        "Cone frustum",
        "cone frustum"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 1,
            "c": 4
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 54.454272662223076
            },
            {
              "label": "Slant height",
              "value": 4.47213595499958
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-222",
      "name": "Pyramid volume",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Base area is in squared units, while height is in the corresponding length unit.",
      "url": "/calculators/pyramid-volume/",
      "version": "f553e4922ad51d50a50490dfca88b452a72e536d8cab570317bfd2706c46fdbe",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Base area",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Base area is in squared units, while height is in the corresponding length unit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "a × b ÷ 3"
        }
      ],
      "example_questions": [
        "Use the Pyramid volume calculator.",
        "Help me calculate pyramid volume."
      ],
      "retrieval_phrases": [
        "Pyramid volume",
        "pyramid volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 6
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 24
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-223",
      "name": "Triangular prism",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "The prism has a constant triangular cross-section. Side lengths must form a valid triangle.",
      "url": "/calculators/triangular-prism/",
      "version": "7950d00784e71a846cf1523a6b3cd04c5b2cf6d8e52638d77d7e868c00c3fbd0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Triangle side A",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Triangle side B",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Triangle side C",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Prism length",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Surface area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The prism has a constant triangular cross-section. Side lengths must form a valid triangle."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "triangleArea(a,b,c) × d"
        },
        {
          "label": "Surface area",
          "text": "2 × triangleArea(a,b,c)+(a+b+c) × d"
        }
      ],
      "example_questions": [
        "Use the Triangular prism calculator.",
        "Help me calculate triangular prism."
      ],
      "retrieval_phrases": [
        "Triangular prism",
        "triangular prism"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 4,
            "c": 5,
            "d": 10
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 60
            },
            {
              "label": "Surface area",
              "value": 132
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-224",
      "name": "Capsule volume",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "A capsule combines a cylinder with two hemispherical ends. Enter only the straight cylindrical length.",
      "url": "/calculators/capsule-volume/",
      "version": "57c3dff9073b5b69c7844393ae0aac42c1f29d9c3debb032f2c5486924490e0b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cylindrical section length",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Surface area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A capsule combines a cylinder with two hemispherical ends. Enter only the straight cylindrical length."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume",
          "text": "π × a × a × b+4 ÷ 3 × π × a^3"
        },
        {
          "label": "Surface area",
          "text": "2 × π × a × b+4 × π × a × a"
        }
      ],
      "example_questions": [
        "Use the Capsule volume calculator.",
        "Help me calculate capsule volume."
      ],
      "retrieval_phrases": [
        "Capsule volume",
        "capsule volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3
          },
          "outputs": [
            {
              "label": "Volume",
              "value": 71.20943348136865
            },
            {
              "label": "Surface area",
              "value": 87.96459430051421
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-225",
      "name": "Coordinate polygon",
      "category": "Geometry and measurement",
      "status": "available",
      "purpose": "Uses the shoelace formula for a simple polygon. Vertices must follow the boundary; self-intersecting paths are rejected.",
      "url": "/calculators/coordinate-polygon/",
      "version": "20a2518abe2aba989a0729f7411c5d54dcf93fbbf50620206980bfcbff7c871f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Ordered vertices x,y (one per line)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Perimeter",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the shoelace formula for a simple polygon. Vertices must follow the boundary; self-intersecting paths are rejected."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area",
          "text": "Join the final vertex back to the first. Area = abs(sum of xᵢ × yᵢ₊₁ − xᵢ₊₁ × yᵢ)/2 (shoelace rule)."
        },
        {
          "label": "Perimeter",
          "text": "Add sqrt((xᵢ₊₁−xᵢ)^2 + (yᵢ₊₁−yᵢ)^2) for every edge, including the closing edge."
        }
      ],
      "example_questions": [
        "Use the Coordinate polygon calculator.",
        "Help me calculate coordinate polygon."
      ],
      "retrieval_phrases": [
        "Coordinate polygon",
        "coordinate polygon"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,0\n4,0\n4,3\n0,3"
          },
          "outputs": [
            {
              "label": "Area",
              "value": 12
            },
            {
              "label": "Perimeter",
              "value": 14
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-226",
      "name": "Quadratic equation",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Solves ax² + bx + c = 0, including complex roots. The quadratic coefficient must be nonzero.",
      "url": "/calculators/quadratic-equation/",
      "version": "c9a5cbf582bfb8ab253c5c532ae4546b2b877bf1b942ac281415ba0889efad61",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficient a",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Coefficient b",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Coefficient c",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Roots",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Solves ax² + bx + c = 0, including complex roots. The quadratic coefficient must be nonzero."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Roots",
          "text": "quadraticRoots(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Quadratic equation calculator.",
        "Help me calculate quadratic equation."
      ],
      "retrieval_phrases": [
        "Quadratic equation",
        "quadratic equation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": -3,
            "c": 2
          },
          "outputs": [
            {
              "label": "Roots",
              "value": "2, 1"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-227",
      "name": "Linear equation",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Solves ax + b = c. A zero coefficient is classified separately rather than divided by zero.",
      "url": "/calculators/linear-equation/",
      "version": "b89c6775d9fc384c7ab321d95124a0001090858b38bf8b57e2bd40af7bddaf58",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficient a",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Coefficient b",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Right side c",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Solution",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Solves ax + b = c. A zero coefficient is classified separately rather than divided by zero."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Solution",
          "text": "When a ≠ 0, x = (c−b)/a. When a = 0, every value is a solution if b = c; otherwise there is no solution."
        }
      ],
      "example_questions": [
        "Use the Linear equation calculator.",
        "Help me calculate linear equation."
      ],
      "retrieval_phrases": [
        "Linear equation",
        "linear equation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3,
            "c": 11
          },
          "outputs": [
            {
              "label": "Solution",
              "value": 4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-228",
      "name": "Two-variable linear system",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Solves two linear equations. Singular systems are reported without a unique numeric solution.",
      "url": "/calculators/two-variable-linear-system/",
      "version": "edd9099ef838c4a96133f6c1e9efa8fdf0ea9158d3e12c9762d75656ab112e7c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "x coefficient 1",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "y coefficient 1",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Right side 1",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "x coefficient 2",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "y coefficient 2",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "f",
          "label": "Right side 2",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Solution",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Solves two linear equations. Singular systems are reported without a unique numeric solution."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Solution",
          "text": "solveTwoEquations(a,b,c,d,e,f)"
        }
      ],
      "example_questions": [
        "Use the Two-variable linear system calculator.",
        "Help me calculate two-variable linear system."
      ],
      "retrieval_phrases": [
        "Two-variable linear system",
        "two variable linear system"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 1,
            "c": 5,
            "d": 1,
            "e": -1,
            "f": 1
          },
          "outputs": [
            {
              "label": "Solution",
              "value": "x = 3; y = 2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-229",
      "name": "Three-variable linear system",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Uses pivoted elimination. Very ill-conditioned systems may be rejected to avoid misleading precision.",
      "url": "/calculators/three-variable-linear-system/",
      "version": "64b0846095ddf982d28210ea94ea3d16802f4a11545b2ebf5e12f22a702705da",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rows: x coefficient,y coefficient,z coefficient,right side",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Solution",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses pivoted elimination. Very ill-conditioned systems may be rejected to avoid misleading precision."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Solution",
          "text": "solveThreeEquations(a)"
        }
      ],
      "example_questions": [
        "Use the Three-variable linear system calculator.",
        "Help me calculate three-variable linear system."
      ],
      "retrieval_phrases": [
        "Three-variable linear system",
        "three variable linear system"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,0,0,2\n0,1,0,3\n0,0,1,4"
          },
          "outputs": [
            {
              "label": "Solution",
              "value": "2, 3, 4"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-230",
      "name": "Polynomial evaluation",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Evaluates a polynomial with Horner’s method. Include zero coefficients for missing powers.",
      "url": "/calculators/polynomial-evaluation/",
      "version": "e9b08e0eccc6366357478433c6984b1ddcc3c6ce75d522261dd2af1ee1c7c2e5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficients, highest degree first",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "x",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Value",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Evaluates a polynomial with Horner’s method. Include zero coefficients for missing powers."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Value",
          "text": "polynomial(a,b)"
        }
      ],
      "example_questions": [
        "Use the Polynomial evaluation calculator.",
        "Help me calculate polynomial evaluation."
      ],
      "retrieval_phrases": [
        "Polynomial evaluation",
        "polynomial evaluation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3,4",
            "b": 2
          },
          "outputs": [
            {
              "label": "Value",
              "value": 18
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-231",
      "name": "Polynomial derivative",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "The power rule multiplies each coefficient by its exponent and reduces that exponent by one.",
      "url": "/calculators/polynomial-derivative/",
      "version": "5c780d7970e03aed7391ece7ded863caeedb4148e54abec5a44dbde19eb4e37c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficients, highest degree first",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Derivative coefficients",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The power rule multiplies each coefficient by its exponent and reduces that exponent by one."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Derivative coefficients",
          "text": "For each coefficient of x^k, multiply it by k to get the coefficient of x^(k−1). Omit the original constant term. A constant polynomial has derivative zero."
        }
      ],
      "example_questions": [
        "Use the Polynomial derivative calculator.",
        "Help me calculate polynomial derivative."
      ],
      "retrieval_phrases": [
        "Polynomial derivative",
        "polynomial derivative"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,2,1"
          },
          "outputs": [
            {
              "label": "Derivative coefficients",
              "value": "6, 2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-232",
      "name": "Polynomial integral",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Integrates a polynomial term by term between the given bounds; no arbitrary integration constant enters a definite integral.",
      "url": "/calculators/polynomial-integral/",
      "version": "c072fde8599a9741479db693983298969c51a8c91a8e884b8296cbd7596ec49b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficients, highest degree first",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Lower bound",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Upper bound",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Definite integral",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Integrates a polynomial term by term between the given bounds; no arbitrary integration constant enters a definite integral."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Definite integral",
          "text": "antiderivative(a,c)-antiderivative(a,b)"
        }
      ],
      "example_questions": [
        "Use the Polynomial integral calculator.",
        "Help me calculate polynomial integral."
      ],
      "retrieval_phrases": [
        "Polynomial integral",
        "polynomial integral"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,0",
            "b": 0,
            "c": 2
          },
          "outputs": [
            {
              "label": "Definite integral",
              "value": 4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-233",
      "name": "Exponent calculator",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Real-number power only. Negative bases with noninteger exponents may be outside the supported real domain.",
      "url": "/calculators/exponent-calculator/",
      "version": "e810b502a5a5e18e6a32755c93d77e6e4a3718a2c6e94dfaa5b1a05ac29593a9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Base",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Exponent",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Power",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Real-number power only. Negative bases with noninteger exponents may be outside the supported real domain."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Power",
          "text": "a^b"
        }
      ],
      "example_questions": [
        "Use the Exponent calculator calculator.",
        "Help me calculate exponent calculator."
      ],
      "retrieval_phrases": [
        "Exponent calculator",
        "exponent calculator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 10
          },
          "outputs": [
            {
              "label": "Power",
              "value": 1024
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-234",
      "name": "Nth root",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Negative numbers have real roots only for odd integer root degrees.",
      "url": "/calculators/nth-root/",
      "version": "43b1ab31137ef3f44e7364ef2acfa740c485d63e10a4c9f4891c084d58f5497f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Number",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Root degree",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Real root",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Negative numbers have real roots only for odd integer root degrees."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Real root",
          "text": "For a ≥ 0 use a^(1/b). For negative a and odd integer b use −((−a)^(1/b)). Reject even roots of negative values."
        }
      ],
      "example_questions": [
        "Use the Nth root calculator.",
        "Help me calculate nth root."
      ],
      "retrieval_phrases": [
        "Nth root",
        "nth root"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 27,
            "b": 3
          },
          "outputs": [
            {
              "label": "Real root",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-235",
      "name": "Logarithm",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Both arguments must be positive and the base cannot equal one.",
      "url": "/calculators/logarithm/",
      "version": "d985012896321425a375d1e935226bf55d6bc0adb6ac590bb5e599afd6c261d2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Number",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Base",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Logarithm",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Both arguments must be positive and the base cannot equal one."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Logarithm",
          "text": "ln(a) ÷ ln(b)"
        }
      ],
      "example_questions": [
        "Use the Logarithm calculator.",
        "Help me calculate logarithm."
      ],
      "retrieval_phrases": [
        "Logarithm",
        "logarithm"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10
          },
          "outputs": [
            {
              "label": "Logarithm",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-236",
      "name": "Exponential growth and decay",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "This is discrete growth per period, not a continuous e-based growth rate.",
      "url": "/calculators/exponential-growth-and-decay/",
      "version": "da7b0f1ee62318bea302bb0f3b7e9bc502b5feb6caf29984fda46d67132e13ae",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial amount",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Growth per period (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Periods",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final amount",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This is discrete growth per period, not a continuous e-based growth rate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final amount",
          "text": "a × (1+b ÷ 100)^c"
        }
      ],
      "example_questions": [
        "Use the Exponential growth and decay calculator.",
        "Help me calculate exponential growth and decay."
      ],
      "retrieval_phrases": [
        "Exponential growth and decay",
        "exponential growth and decay"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Final amount",
              "value": 121.00000000000001
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-237",
      "name": "Doubling time",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Assumes a positive constant discrete growth rate. Fractional periods interpolate the exponential model.",
      "url": "/calculators/doubling-time/",
      "version": "f7342fa98244d043d37b039088d6dde297420945d8363ef5cd331d94ca040eec",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Growth per period (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Doubling time (periods)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes a positive constant discrete growth rate. Fractional periods interpolate the exponential model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Doubling time (periods)",
          "text": "ln(2) ÷ ln(1+a ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Doubling time calculator.",
        "Help me calculate doubling time."
      ],
      "retrieval_phrases": [
        "Doubling time",
        "doubling time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100
          },
          "outputs": [
            {
              "label": "Doubling time (periods)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-238",
      "name": "Half-life decay",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Half-life and elapsed time must use the same time unit.",
      "url": "/calculators/half-life-decay/",
      "version": "615727797b01d9f8c3a0c15c51f83546ef92faf75bd5c5dd25903baa9815f91c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial amount",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Half-life",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Elapsed time",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Remaining amount",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Decayed amount",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Half-life and elapsed time must use the same time unit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Remaining amount",
          "text": "a × 2^(-c ÷ b)"
        },
        {
          "label": "Decayed amount",
          "text": "a-a × 2^(-c ÷ b)"
        }
      ],
      "example_questions": [
        "Use the Half-life decay calculator.",
        "Help me calculate half-life decay."
      ],
      "retrieval_phrases": [
        "Half-life decay",
        "half life decay"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 20
          },
          "outputs": [
            {
              "label": "Remaining amount",
              "value": 25
            },
            {
              "label": "Decayed amount",
              "value": 75
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-239",
      "name": "Arithmetic sequence",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "The first term is term one, not term zero.",
      "url": "/calculators/arithmetic-sequence/",
      "version": "e3a0e768ad25d0c911d2cf109a8ae05b0faa5e33e8a1339b79a03d898cea5fa9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First term",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Common difference",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Term count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Nth term",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sum",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The first term is term one, not term zero."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Nth term",
          "text": "a+(c-1) × b"
        },
        {
          "label": "Sum",
          "text": "c ÷ 2 × (2 × a+(c-1) × b)"
        }
      ],
      "example_questions": [
        "Use the Arithmetic sequence calculator.",
        "Help me calculate arithmetic sequence."
      ],
      "retrieval_phrases": [
        "Arithmetic sequence",
        "arithmetic sequence"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3,
            "c": 4
          },
          "outputs": [
            {
              "label": "Nth term",
              "value": 11
            },
            {
              "label": "Sum",
              "value": 26
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-240",
      "name": "Geometric sequence",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "A finite geometric sequence. Ratio one uses the constant-sequence limit.",
      "url": "/calculators/geometric-sequence/",
      "version": "d0dad663233d3bacbd9d5b5f4c79b1ec3c49b54b0803125bd52edec36463ccfa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First term",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Common ratio",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Term count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Nth term",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sum",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A finite geometric sequence. Ratio one uses the constant-sequence limit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Nth term",
          "text": "a × b^(c−1)"
        },
        {
          "label": "Sum",
          "text": "a × (1−b^c)/(1−b), or a × c when b = 1."
        }
      ],
      "example_questions": [
        "Use the Geometric sequence calculator.",
        "Help me calculate geometric sequence."
      ],
      "retrieval_phrases": [
        "Geometric sequence",
        "geometric sequence"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3,
            "c": 4
          },
          "outputs": [
            {
              "label": "Nth term",
              "value": 54
            },
            {
              "label": "Sum",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-241",
      "name": "Factorial",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Returns an exact integer using BigInt. Zero factorial is one.",
      "url": "/calculators/factorial/",
      "version": "0c66f3ec4b4cc08dfc60a478c86eb81b28cc938b656f62b6fb50f45a74aa7614",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Integer",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Factorial",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Returns an exact integer using BigInt. Zero factorial is one."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Factorial",
          "text": "factorial(a)"
        }
      ],
      "example_questions": [
        "Use the Factorial calculator.",
        "Help me calculate factorial."
      ],
      "retrieval_phrases": [
        "Factorial",
        "factorial"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5
          },
          "outputs": [
            {
              "label": "Factorial",
              "value": "120"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-242",
      "name": "Permutations",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Ordered selections without replacement.",
      "url": "/calculators/permutations/",
      "version": "cc7ef1ae3ebe82990c97ddabbae52f151c7cfeb82766c2d052939451bf96e8a8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pool size",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Selected items",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Permutations",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ordered selections without replacement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Permutations",
          "text": "(factorial(a) ÷ factorial(a-b))"
        }
      ],
      "example_questions": [
        "Use the Permutations calculator.",
        "Help me calculate permutations."
      ],
      "retrieval_phrases": [
        "Permutations",
        "permutations"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 2
          },
          "outputs": [
            {
              "label": "Permutations",
              "value": "20"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-243",
      "name": "Combinations",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Unordered selections without replacement.",
      "url": "/calculators/combinations/",
      "version": "964ae545a96020fc78dfa5e0765db6aa9ded53755a6504297689b7f55c8b4e15",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pool size",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Selected items",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Combinations",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Unordered selections without replacement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Combinations",
          "text": "combinations(a,b)"
        }
      ],
      "example_questions": [
        "Use the Combinations calculator.",
        "Help me calculate combinations."
      ],
      "retrieval_phrases": [
        "Combinations",
        "combinations"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 2
          },
          "outputs": [
            {
              "label": "Combinations",
              "value": "10"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-244",
      "name": "Greatest common divisor",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "The greatest common divisor is non-negative. GCD of all zeros is zero.",
      "url": "/calculators/greatest-common-divisor/",
      "version": "2a805bbe4016a517cf844011750f8a968445c54e59a8d765e9f5b17903800a7c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Integers",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "GCD",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The greatest common divisor is non-negative. GCD of all zeros is zero."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "GCD",
          "text": "Apply Euclid’s algorithm to each pair: repeatedly replace (x, y) with (y, remainder(x/y)) until y = 0. Use non-negative magnitudes and fold across the list. All zeros return zero."
        }
      ],
      "example_questions": [
        "Use the Greatest common divisor calculator.",
        "Help me calculate greatest common divisor."
      ],
      "retrieval_phrases": [
        "Greatest common divisor",
        "greatest common divisor"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "12,18,30"
          },
          "outputs": [
            {
              "label": "GCD",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-245",
      "name": "Least common multiple",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "LCM uses exact-safe integer inputs; results outside JavaScript’s safe range are rejected.",
      "url": "/calculators/least-common-multiple/",
      "version": "63e8f32c954681732e1317e4ec81f8a2268fb8e7b33cb15655a70b7d56f864dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Integers",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "LCM",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "LCM uses exact-safe integer inputs; results outside JavaScript’s safe range are rejected."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "LCM",
          "text": "leastCommonMultiple(a)"
        }
      ],
      "example_questions": [
        "Use the Least common multiple calculator.",
        "Help me calculate least common multiple."
      ],
      "retrieval_phrases": [
        "Least common multiple",
        "least common multiple"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,6,10"
          },
          "outputs": [
            {
              "label": "LCM",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-246",
      "name": "Prime factorisation",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Trial division is bounded to keep the interface responsive. One has no prime factors.",
      "url": "/calculators/prime-factorisation/",
      "version": "de40e63d158f8d86bed887bad71ea16d1bb28b3aa31050bf0a5c8302da575f49",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Integer",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Prime factors",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Trial division is bounded to keep the interface responsive. One has no prime factors."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Prime factors",
          "text": "primeFactors(a)"
        }
      ],
      "example_questions": [
        "Use the Prime factorisation calculator.",
        "Help me calculate prime factorisation."
      ],
      "retrieval_phrases": [
        "Prime factorisation",
        "prime factorisation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 360
          },
          "outputs": [
            {
              "label": "Prime factors",
              "value": "2³ × 3² × 5"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-247",
      "name": "Modulo and remainder",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Uses a non-negative Euclidean remainder with a positive divisor, including negative dividends.",
      "url": "/calculators/modulo-and-remainder/",
      "version": "12941b705bd6b2d412d65650a5ad8c289ddfba38a617572d34e11edc513da976",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Dividend",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Positive divisor",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Euclidean remainder",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Floor quotient",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a non-negative Euclidean remainder with a positive divisor, including negative dividends."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Euclidean remainder",
          "text": "((a rem b)+b) rem b"
        },
        {
          "label": "Floor quotient",
          "text": "floor(a ÷ b)"
        }
      ],
      "example_questions": [
        "Use the Modulo and remainder calculator.",
        "Help me calculate modulo and remainder."
      ],
      "retrieval_phrases": [
        "Modulo and remainder",
        "modulo and remainder"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 17,
            "b": 5
          },
          "outputs": [
            {
              "label": "Euclidean remainder",
              "value": 2
            },
            {
              "label": "Floor quotient",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-248",
      "name": "Number-base converter",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Supports bases 2–36 and signed integers using exact BigInt arithmetic.",
      "url": "/calculators/number-base-converter/",
      "version": "c131f9441dda32a14496437be2dc3905fb9679c763f10b92eb191f2150b23a15",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Integer text",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Source base",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Target base",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Converted integer",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supports bases 2–36 and signed integers using exact BigInt arithmetic."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Converted integer",
          "text": "convertBase(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Number-base converter calculator.",
        "Help me calculate number-base converter."
      ],
      "retrieval_phrases": [
        "Number-base converter",
        "number base converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "FF",
            "b": 16,
            "c": 10
          },
          "outputs": [
            {
              "label": "Converted integer",
              "value": "255"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-249",
      "name": "Matrix operations",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "This first version supports determinant and transpose for square matrices up to 6 × 6. Other matrix operations are not included.",
      "url": "/calculators/matrix-operations/",
      "version": "171eabb8ce64e870d29030a533d631f875d5aa95ff9694dde7fd72c69a14613a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Matrix rows, comma-separated",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Determinant",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Transpose",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This first version supports determinant and transpose for square matrices up to 6 × 6. Other matrix operations are not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Determinant",
          "text": "determinant(a)"
        },
        {
          "label": "Transpose",
          "text": "transpose(a)"
        }
      ],
      "example_questions": [
        "Use the Matrix operations calculator.",
        "Help me calculate matrix operations."
      ],
      "retrieval_phrases": [
        "Matrix operations",
        "matrix operations"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2\n3,4"
          },
          "outputs": [
            {
              "label": "Determinant",
              "value": -2
            },
            {
              "label": "Transpose",
              "value": "1, 3; 2, 4"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-250",
      "name": "Complex arithmetic",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Treats inputs as a + bi and c + di. Division by zero is rejected.",
      "url": "/calculators/complex-arithmetic/",
      "version": "376864b50be185c98205393d0cfd36376c73f50dd4d3f584b33630a23c1f8d36",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First real part",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "First imaginary part",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Second real part",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Second imaginary part",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Operation (+, -, *, /)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Complex result",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Treats inputs as a + bi and c + di. Division by zero is rejected."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Complex result",
          "text": "complexArithmetic(a,b,c,d,e)"
        }
      ],
      "example_questions": [
        "Use the Complex arithmetic calculator.",
        "Help me calculate complex arithmetic."
      ],
      "retrieval_phrases": [
        "Complex arithmetic",
        "complex arithmetic"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 2,
            "c": 3,
            "d": 4,
            "e": "+"
          },
          "outputs": [
            {
              "label": "Complex result",
              "value": "4 + 6i"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-326",
      "name": "Appliance electricity cost",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Uses constant power and the entered unit tariff. Standing charges and cycling behaviour are excluded.",
      "url": "/calculators/appliance-electricity-cost/",
      "version": "0ab81ec4b054ec5c651ba0d581ee5c563ed5639003f87e97d6ede8e1b0f60650",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Power (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hours per day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Energy cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Energy (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses constant power and the entered unit tariff. Standing charges and cycling behaviour are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Energy cost (£)",
          "text": "a ÷ 1000 × b × c × d"
        },
        {
          "label": "Energy (kWh)",
          "text": "a ÷ 1000 × b × c"
        }
      ],
      "example_questions": [
        "Use the Appliance electricity cost calculator.",
        "Help me calculate appliance electricity cost."
      ],
      "retrieval_phrases": [
        "Appliance electricity cost",
        "appliance electricity cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 2,
            "c": 30,
            "d": 0.25
          },
          "outputs": [
            {
              "label": "Energy cost (£)",
              "value": 15
            },
            {
              "label": "Energy (kWh)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-327",
      "name": "Electricity bill estimate",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Meter readings must be cumulative in kWh. Taxes or discounts absent from the entered tariff are excluded.",
      "url": "/calculators/electricity-bill-estimate/",
      "version": "a3231c4a6871b1aca2875e6245f1f77f2e4917bcb9ab659960b418dcc0d9c7d2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Start meter (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "End meter (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Standing charge (£/day)",
          "type": "number",
          "required": true,
          "unit": "GBP/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated bill (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Usage (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Meter readings must be cumulative in kWh. Taxes or discounts absent from the entered tariff are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated bill (£)",
          "text": "(b-a) × c+d × e"
        },
        {
          "label": "Usage (kWh)",
          "text": "b-a"
        }
      ],
      "example_questions": [
        "Use the Electricity bill estimate calculator.",
        "Help me calculate electricity bill estimate."
      ],
      "retrieval_phrases": [
        "Electricity bill estimate",
        "electricity bill estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 1300,
            "c": 0.25,
            "d": 0.5,
            "e": 30
          },
          "outputs": [
            {
              "label": "Estimated bill (£)",
              "value": 90
            },
            {
              "label": "Usage (kWh)",
              "value": 300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-328",
      "name": "Gas energy conversion",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Use the conversion factors on your bill. This tool does not provide a regional gas-billing standard.",
      "url": "/calculators/gas-energy-conversion/",
      "version": "b17e3befc71ce2ab6cf72e540661d2b26032dcbc79d6ef653e0230bc64edde7d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Meter volume (m³)",
          "type": "number",
          "required": true,
          "unit": "m3",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Calorific value (MJ/m³)",
          "type": "number",
          "required": true,
          "unit": "MJ/m³",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Volume correction factor",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Energy (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the conversion factors on your bill. This tool does not provide a regional gas-billing standard."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Energy (kWh)",
          "text": "a × b × c ÷ 3.6"
        }
      ],
      "example_questions": [
        "Use the Gas energy conversion calculator.",
        "Help me calculate gas energy conversion."
      ],
      "retrieval_phrases": [
        "Gas energy conversion",
        "gas energy conversion"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 39,
            "c": 1.02264
          },
          "outputs": [
            {
              "label": "Energy (kWh)",
              "value": 1107.86
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-329",
      "name": "Heating fuel comparison",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Fuel units and energy content must correspond. Efficiency is an assumption, not a measured performance guarantee.",
      "url": "/calculators/heating-fuel-comparison/",
      "version": "b0a30b5103fc59c583fcc2aa21554df11fe77322dfffd9aa4355c1a758bcc123",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fuel price per unit (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Energy content (kWh/unit)",
          "type": "number",
          "required": true,
          "unit": "kWh/unit",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Appliance efficiency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Delivered heat cost (£/kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fuel units and energy content must correspond. Efficiency is an assumption, not a measured performance guarantee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Delivered heat cost (£/kWh)",
          "text": "a ÷ (b × c ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Heating fuel comparison calculator.",
        "Help me calculate heating fuel comparison."
      ],
      "retrieval_phrases": [
        "Heating fuel comparison",
        "heating fuel comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 10,
            "c": 80
          },
          "outputs": [
            {
              "label": "Delivered heat cost (£/kWh)",
              "value": 0.125
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-330",
      "name": "Heat pump running cost",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Seasonal performance varies with system design, weather and temperatures. Enter a suitable assumption.",
      "url": "/calculators/heat-pump-running-cost/",
      "version": "661e528c0b060e91c01ee619a0ea090dc02dd0666f69d9b890fef82af0a6e5e9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Heat required (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Seasonal performance factor",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Electricity (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Electricity required (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Seasonal performance varies with system design, weather and temperatures. Enter a suitable assumption."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Electricity required (kWh)",
          "text": "a ÷ b"
        },
        {
          "label": "Estimated cost (£)",
          "text": "a ÷ b × c"
        }
      ],
      "example_questions": [
        "Use the Heat pump running cost calculator.",
        "Help me calculate heat pump running cost."
      ],
      "retrieval_phrases": [
        "Heat pump running cost",
        "heat pump running cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 3,
            "c": 0.25
          },
          "outputs": [
            {
              "label": "Electricity required (kWh)",
              "value": 3333.3333333333335
            },
            {
              "label": "Estimated cost (£)",
              "value": 833.3333333333334
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-331",
      "name": "Solar generation scenario",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "A simplified irradiance-equivalent estimate; it is not a roof-specific solar forecast.",
      "url": "/calculators/solar-generation-scenario/",
      "version": "22ac6ed1bb9b3f85bdae333acc1ff18f05e014aac0a1663190f8d2dd10938292",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "System rating (kW)",
          "type": "number",
          "required": true,
          "unit": "kW",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Equivalent sun hours/day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Performance factor (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Generation (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A simplified irradiance-equivalent estimate; it is not a roof-specific solar forecast."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Generation (kWh)",
          "text": "a × b × c × d ÷ 100"
        }
      ],
      "example_questions": [
        "Use the Solar generation scenario calculator.",
        "Help me calculate solar generation scenario."
      ],
      "retrieval_phrases": [
        "Solar generation scenario",
        "solar generation scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 3,
            "c": 30,
            "d": 80
          },
          "outputs": [
            {
              "label": "Generation (kWh)",
              "value": 288
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-332",
      "name": "Solar self-consumption",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Generation used on site offsets imports at the entered price. Excess is valued at the export price.",
      "url": "/calculators/solar-self-consumption/",
      "version": "8fbfe3da934017ea466d2566609878422aef25e092da740da14ecd425a9f9c22",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Generation (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Directly used (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Import price (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Export price (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated value (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Self-use (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Generation used on site offsets imports at the entered price. Excess is valued at the export price."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated value (£)",
          "text": "b × c + (a−b) × d"
        },
        {
          "label": "Self-use (%)",
          "text": "b/a × 100; the zero-generation convention is 0%."
        }
      ],
      "example_questions": [
        "Use the Solar self-consumption calculator.",
        "Help me calculate solar self-consumption."
      ],
      "retrieval_phrases": [
        "Solar self-consumption",
        "solar self consumption"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 600,
            "c": 0.25,
            "d": 0.05
          },
          "outputs": [
            {
              "label": "Estimated value (£)",
              "value": 170
            },
            {
              "label": "Self-use (%)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-333",
      "name": "Solar simple payback",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Simple payback ignores discounting, degradation, financing and replacement costs.",
      "url": "/calculators/solar-simple-payback/",
      "version": "7e0dfba5f7a13b7d2e6428406299ff715e47c000d14a2e8e4a1601c9406991af",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Installed cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual savings (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual maintenance (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Simple payback (years)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Simple payback ignores discounting, degradation, financing and replacement costs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Simple payback (years)",
          "text": "a/(b−c) when annual savings exceed annual maintenance. Otherwise report no positive net saving."
        }
      ],
      "example_questions": [
        "Use the Solar simple payback calculator.",
        "Help me calculate solar simple payback."
      ],
      "retrieval_phrases": [
        "Solar simple payback",
        "solar simple payback"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6000,
            "b": 800,
            "c": 50
          },
          "outputs": [
            {
              "label": "Simple payback (years)",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-334",
      "name": "Home battery economics",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Capacity is delivered discharge energy. Input energy is divided by round-trip efficiency. Ignores degradation, standby and financing.",
      "url": "/calculators/home-battery-economics/",
      "version": "5ce987cd24dcd82fa20e91e978b84bf0f2203bec2298fbe7238234871f98c128",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Usable capacity (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual cycles",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Round-trip efficiency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Low-price energy (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Avoided price (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Installed cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual arbitrage saving (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Simple payback (years)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Capacity is delivered discharge energy. Input energy is divided by round-trip efficiency. Ignores degradation, standby and financing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual arbitrage saving (£)",
          "text": "a × b × (e − d/(c/100))."
        },
        {
          "label": "Simple payback (years)",
          "text": "f / annual arbitrage saving if that saving is positive; otherwise report no positive saving."
        }
      ],
      "example_questions": [
        "Use the Home battery economics calculator.",
        "Help me calculate home battery economics."
      ],
      "retrieval_phrases": [
        "Home battery economics",
        "home battery economics"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 300,
            "c": 90,
            "d": 0.1,
            "e": 0.3,
            "f": 3000
          },
          "outputs": [
            {
              "label": "Annual arbitrage saving (£)",
              "value": 566.6666666666666
            },
            {
              "label": "Simple payback (years)",
              "value": 5.294117647058824
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-335",
      "name": "Battery runtime",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Constant-load energy estimate. Real batteries vary with discharge rate, temperature and ageing.",
      "url": "/calculators/battery-runtime/",
      "version": "764af7628c6ad618b1e2878706892a1f2375be287a00e9dd3316b670e8f852eb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Capacity (Wh)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Load (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable fraction (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Output efficiency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Runtime (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant-load energy estimate. Real batteries vary with discharge rate, temperature and ageing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Runtime (hours)",
          "text": "a × c ÷ 100 × d ÷ 100 ÷ b"
        }
      ],
      "example_questions": [
        "Use the Battery runtime calculator.",
        "Help me calculate battery runtime."
      ],
      "retrieval_phrases": [
        "Battery runtime",
        "battery runtime"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 100,
            "c": 80,
            "d": 90
          },
          "outputs": [
            {
              "label": "Runtime (hours)",
              "value": 7.2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-336",
      "name": "Battery recharge time",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Assumes constant charging power; actual tapering and thermal limits can lengthen charging.",
      "url": "/calculators/battery-recharge-time/",
      "version": "cb53ec66bed33e9903c7f536c56e48229325a93560e23b7058ddd119074cd68a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Capacity (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting charge (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target charge (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Charger input (kW)",
          "type": "number",
          "required": true,
          "unit": "kW",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Efficiency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ideal time (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes constant charging power; actual tapering and thermal limits can lengthen charging."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ideal time (hours)",
          "text": "a × (c-b) ÷ 100 ÷ (d × e ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Battery recharge time calculator.",
        "Help me calculate battery recharge time."
      ],
      "retrieval_phrases": [
        "Battery recharge time",
        "battery recharge time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 20,
            "c": 80,
            "d": 7,
            "e": 90
          },
          "outputs": [
            {
              "label": "Ideal time (hours)",
              "value": 5.714285714285714
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-337",
      "name": "Energy unit converter",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "One watt-hour is 3,600 joules. This page converts from kWh to common energy units.",
      "url": "/calculators/energy-unit-converter/",
      "version": "bf9fcea1c2b7e6678ad3ce7798ce65457391c12dc969bf9a403b55a06d035c3c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Energy (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Joules",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Watt-hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Megajoules",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One watt-hour is 3,600 joules. This page converts from kWh to common energy units."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Joules",
          "text": "a × 3600000"
        },
        {
          "label": "Watt-hours",
          "text": "a × 1000"
        },
        {
          "label": "Megajoules",
          "text": "a × 3.6"
        }
      ],
      "example_questions": [
        "Use the Energy unit converter calculator.",
        "Help me calculate energy unit converter."
      ],
      "retrieval_phrases": [
        "Energy unit converter",
        "energy unit converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1
          },
          "outputs": [
            {
              "label": "Joules",
              "value": 3600000
            },
            {
              "label": "Watt-hours",
              "value": 1000
            },
            {
              "label": "Megajoules",
              "value": 3.6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-338",
      "name": "Heating degree days",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Sum positive differences between the base and each daily mean. Uses the daily-mean method.",
      "url": "/calculators/heating-degree-days/",
      "version": "6e9be8a1e49237eecee99c5593500c8231d0ee4490f678e72508f93c6fcc5c6a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Daily mean temperatures (°C)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Base temperature (°C)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Heating degree days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sum positive differences between the base and each daily mean. Uses the daily-mean method."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Heating degree days",
          "text": "For each daily mean temperature x in a, use max(0, b−x); add all days."
        }
      ],
      "example_questions": [
        "Use the Heating degree days calculator.",
        "Help me calculate heating degree days."
      ],
      "retrieval_phrases": [
        "Heating degree days",
        "heating degree days"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,12,20",
            "b": 18
          },
          "outputs": [
            {
              "label": "Heating degree days",
              "value": 14
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-339",
      "name": "Cooling degree days",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Sum positive daily mean temperatures above the chosen base.",
      "url": "/calculators/cooling-degree-days/",
      "version": "1978f288cd887735bd4d6806d3cb1c8e21c6134f66c0a5024aaa427488b47bf5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Daily mean temperatures (°C)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Base temperature (°C)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cooling degree days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sum positive daily mean temperatures above the chosen base."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cooling degree days",
          "text": "For each daily mean temperature x in a, use max(0, x−b); add all days."
        }
      ],
      "example_questions": [
        "Use the Cooling degree days calculator.",
        "Help me calculate cooling degree days."
      ],
      "retrieval_phrases": [
        "Cooling degree days",
        "cooling degree days"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,25,15",
            "b": 18
          },
          "outputs": [
            {
              "label": "Cooling degree days",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-340",
      "name": "Water heating energy",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Approximates water at 1 kg/L with specific heat 4.186 kJ/(kg·K); phase changes and ongoing losses are excluded.",
      "url": "/calculators/water-heating-energy/",
      "version": "8b1ed529d8762baf04bb2891ee3dfe04059d643d9cf885c17389de11967ef17f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Water volume (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting temperature (°C)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Target temperature (°C)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Efficiency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Input energy (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Approximates water at 1 kg/L with specific heat 4.186 kJ/(kg·K); phase changes and ongoing losses are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Input energy (kWh)",
          "text": "a × 4.186 × (c-b) ÷ 3600 ÷ (d ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Water heating energy calculator.",
        "Help me calculate water heating energy."
      ],
      "retrieval_phrases": [
        "Water heating energy",
        "water heating energy"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 60,
            "d": 100
          },
          "outputs": [
            {
              "label": "Input energy (kWh)",
              "value": 5.813888888888889
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-341",
      "name": "Hot-water mixing",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Ideal energy balance for water, neglecting heat loss and density change.",
      "url": "/calculators/hot-water-mixing/",
      "version": "282dd797ddb4091afa4c43eb01bb711db6ed562055dac92ddbf5eb44a8f30c1a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Hot temperature (°C)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Cold temperature (°C)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Target temperature (°C)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Final volume (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hot water (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cold water (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal energy balance for water, neglecting heat loss and density change."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hot water (L)",
          "text": "d × (c-b) ÷ (a-b)"
        },
        {
          "label": "Cold water (L)",
          "text": "d × (a-c) ÷ (a-b)"
        }
      ],
      "example_questions": [
        "Use the Hot-water mixing calculator.",
        "Help me calculate hot-water mixing."
      ],
      "retrieval_phrases": [
        "Hot-water mixing",
        "hot water mixing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 10,
            "c": 40,
            "d": 100
          },
          "outputs": [
            {
              "label": "Hot water (L)",
              "value": 60
            },
            {
              "label": "Cold water (L)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-342",
      "name": "Shower water cost",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Heat energy per litre is supplied by you and should include heater efficiency. Standing charges are excluded.",
      "url": "/calculators/shower-water-cost/",
      "version": "55d108046557711a2ec0c1b82334d15c0b14f257b55fd606f853663b694f8368",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Flow (L/min)",
          "type": "number",
          "required": true,
          "unit": "L/min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Showers",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Water (£/m³)",
          "type": "number",
          "required": true,
          "unit": "GBP/m³",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Heat energy per litre (kWh/L)",
          "type": "number",
          "required": true,
          "unit": "kWh/L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Energy (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Water and heating cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Heat energy per litre is supplied by you and should include heater efficiency. Standing charges are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Water and heating cost (£)",
          "text": "a × b × c ÷ 1000 × d+a × b × c × e × f"
        }
      ],
      "example_questions": [
        "Use the Shower water cost calculator.",
        "Help me calculate shower water cost."
      ],
      "retrieval_phrases": [
        "Shower water cost",
        "shower water cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 5,
            "c": 30,
            "d": 3,
            "e": 0.035,
            "f": 0.25
          },
          "outputs": [
            {
              "label": "Water and heating cost (£)",
              "value": 17.625
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-343",
      "name": "Leaking tap loss",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Uses a measured volume rate, not a universal assumed drop size.",
      "url": "/calculators/leaking-tap-loss/",
      "version": "a43a5bc02f72270fed3a144cdb5d49114dd45d8abbe835d7371c29cbb3834066",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured leak (mL/min)",
          "type": "number",
          "required": true,
          "unit": "mL/min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Water (£/m³)",
          "type": "number",
          "required": true,
          "unit": "GBP/m³",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Lost water (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a measured volume rate, not a universal assumed drop size."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Lost water (L)",
          "text": "a × 60 × 24 × b ÷ 1000"
        },
        {
          "label": "Cost (£)",
          "text": "a × 60 × 24 × b ÷ 1e6 × c"
        }
      ],
      "example_questions": [
        "Use the Leaking tap loss calculator.",
        "Help me calculate leaking tap loss."
      ],
      "retrieval_phrases": [
        "Leaking tap loss",
        "leaking tap loss"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 30,
            "c": 3
          },
          "outputs": [
            {
              "label": "Lost water (L)",
              "value": 432
            },
            {
              "label": "Cost (£)",
              "value": 1.296
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-344",
      "name": "LED replacement savings",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Compares electricity cost only, excluding lifetime differences and replacement labour.",
      "url": "/calculators/led-replacement-savings/",
      "version": "53f3dad9e7f5461bb18d51776a46f1913efa4b6a8ca1e6386d5361e8f271a753",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Old power (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New power (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Replacement cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual saving (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Payback (years)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares electricity cost only, excluding lifetime differences and replacement labour."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual saving (£)",
          "text": "(a−b)/1000 × c × d."
        },
        {
          "label": "Payback (years)",
          "text": "e / annual saving if old power exceeds new power and hours × tariff is positive; otherwise report no positive saving."
        }
      ],
      "example_questions": [
        "Use the LED replacement savings calculator.",
        "Help me calculate led replacement savings."
      ],
      "retrieval_phrases": [
        "LED replacement savings",
        "led replacement savings"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 10,
            "c": 1000,
            "d": 0.25,
            "e": 5
          },
          "outputs": [
            {
              "label": "Annual saving (£)",
              "value": 12.5
            },
            {
              "label": "Payback (years)",
              "value": 0.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-345",
      "name": "Standby power cost",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Assumes every device draws the stated standby power for the full interval.",
      "url": "/calculators/standby-power-cost/",
      "version": "cc438eeab70a2a4d771741f5767dbbdd36e99ed6e5a3f11c2ba5a501e470e6e3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Standby power per device (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Devices",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hours per day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Standby cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes every device draws the stated standby power for the full interval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Standby cost (£)",
          "text": "a × b × c × d ÷ 1000 × e"
        }
      ],
      "example_questions": [
        "Use the Standby power cost calculator.",
        "Help me calculate standby power cost."
      ],
      "retrieval_phrases": [
        "Standby power cost",
        "standby power cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 4,
            "c": 20,
            "d": 365,
            "e": 0.25
          },
          "outputs": [
            {
              "label": "Standby cost (£)",
              "value": 36.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-346",
      "name": "Insulation heat-loss scenario",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Steady-state conduction through one surface only. Ignores thermal bridges, infiltration and changing weather.",
      "url": "/calculators/insulation-heat-loss-scenario/",
      "version": "50babf72d55f375477364445d6d631d984c1efeac6de6c0a1bb2473abf794beb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Surface area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Old U-value (W/m²K)",
          "type": "number",
          "required": true,
          "unit": "W/m²K",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "New U-value (W/m²K)",
          "type": "number",
          "required": true,
          "unit": "W/m²K",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Temperature difference (K)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Duration (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Avoided heat loss (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady-state conduction through one surface only. Ignores thermal bridges, infiltration and changing weather."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Avoided heat loss (kWh)",
          "text": "a × (b-c) × d × e ÷ 1000"
        }
      ],
      "example_questions": [
        "Use the Insulation heat-loss scenario calculator.",
        "Help me calculate insulation heat-loss scenario."
      ],
      "retrieval_phrases": [
        "Insulation heat-loss scenario",
        "insulation heat loss scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 2,
            "c": 0.5,
            "d": 20,
            "e": 1000
          },
          "outputs": [
            {
              "label": "Avoided heat loss (kWh)",
              "value": 3000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-347",
      "name": "Ventilation heat-loss estimate",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "No heat recovery or latent heat is included. This is not ventilation design advice.",
      "url": "/calculators/ventilation-heat-loss-estimate/",
      "version": "1038c3ef9c8e740a633ff04f2098b5d738f52869ba1afe3fbebec51b28aad018",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Airflow (m³/hour)",
          "type": "number",
          "required": true,
          "unit": "m³/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Air density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": "kg/m³",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Heat capacity (J/kgK)",
          "type": "number",
          "required": true,
          "unit": "J/kgK",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Temperature difference (K)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sensible heat loss (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "No heat recovery or latent heat is included. This is not ventilation design advice."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sensible heat loss (W)",
          "text": "a ÷ 3600 × b × c × d"
        }
      ],
      "example_questions": [
        "Use the Ventilation heat-loss estimate calculator.",
        "Help me calculate ventilation heat-loss estimate."
      ],
      "retrieval_phrases": [
        "Ventilation heat-loss estimate",
        "ventilation heat loss estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 1.2,
            "c": 1005,
            "d": 20
          },
          "outputs": [
            {
              "label": "Sensible heat loss (W)",
              "value": 670
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-348",
      "name": "Carbon footprint from entered factors",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Each activity must use the unit matching its factor. Factors are user-supplied, not a verified emissions inventory.",
      "url": "/calculators/carbon-footprint-from-entered-factors/",
      "version": "c62fd732714daca8b97d5b0725a604c80da4b03ddb35e5657386d52126674959",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Activity quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Emission factors (kg CO₂e/unit)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Emissions (kg CO₂e)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each activity must use the unit matching its factor. Factors are user-supplied, not a verified emissions inventory."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Emissions (kg CO₂e)",
          "text": "Multiply each activity quantity in a by its corresponding emission factor in b; add the results."
        }
      ],
      "example_questions": [
        "Use the Carbon footprint from entered factors calculator.",
        "Help me calculate carbon footprint from entered factors."
      ],
      "retrieval_phrases": [
        "Carbon footprint from entered factors",
        "carbon footprint from entered factors"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "0.2,0.5"
          },
          "outputs": [
            {
              "label": "Emissions (kg CO₂e)",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-349",
      "name": "Waste diversion rate",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "All quantities must use the same mass unit. Energy recovery is not included unless you explicitly classify it.",
      "url": "/calculators/waste-diversion-rate/",
      "version": "22f404fb6890570600481a19e4494d91403e9df6340bc32274a4c57addb63924",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Reused mass",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Recycled mass",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Disposed mass",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Diversion (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All quantities must use the same mass unit. Energy recovery is not included unless you explicitly classify it."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Diversion (%)",
          "text": "(a+b) ÷ (a+b+c) × 100"
        }
      ],
      "example_questions": [
        "Use the Waste diversion rate calculator.",
        "Help me calculate waste diversion rate."
      ],
      "retrieval_phrases": [
        "Waste diversion rate",
        "waste diversion rate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 50,
            "c": 30
          },
          "outputs": [
            {
              "label": "Diversion (%)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-350",
      "name": "Water storage autonomy",
      "category": "Energy and household resources",
      "status": "available",
      "purpose": "Constant consumption and refill model; timing and minimum reserve are not included.",
      "url": "/calculators/water-storage-autonomy/",
      "version": "0b0c37582662b4d1f3130665f1a4d82913a6949ded16df21b421031f8f3075de",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Usable tank volume (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Daily consumption (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Daily refill (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Days of supply",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant consumption and refill model; timing and minimum reserve are not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Days of supply",
          "text": "a/(b−c) if daily consumption exceeds refill. Otherwise report no depletion under these assumptions."
        }
      ],
      "example_questions": [
        "Use the Water storage autonomy calculator.",
        "Help me calculate water storage autonomy."
      ],
      "retrieval_phrases": [
        "Water storage autonomy",
        "water storage autonomy"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 100,
            "c": 0
          },
          "outputs": [
            {
              "label": "Days of supply",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Traceable units and assumptions; user-supplied tariffs; efficiency and loss accounting; engineering review for physical models.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-351",
      "name": "Journey time",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Use an achievable overall moving speed. Traffic forecasts are not fetched.",
      "url": "/calculators/journey-time/",
      "version": "1a6e10db045b8f0e95bc5f3a0cb64975c7fa471bf298afc3b9d51f3198618a30",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Average speed (km/h)",
          "type": "number",
          "required": true,
          "unit": "km/h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Stop time (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Journey time (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use an achievable overall moving speed. Traffic forecasts are not fetched."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Journey time (hours)",
          "text": "a ÷ b+c ÷ 60"
        }
      ],
      "example_questions": [
        "Use the Journey time calculator.",
        "Help me calculate journey time."
      ],
      "retrieval_phrases": [
        "Journey time",
        "journey time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 60,
            "c": 30
          },
          "outputs": [
            {
              "label": "Journey time (hours)",
              "value": 2.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-352",
      "name": "Fuel trip cost",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Use real trip consumption where possible; speed, load and weather can affect economy.",
      "url": "/calculators/fuel-trip-cost/",
      "version": "5d1faa564154b4c387bb149418262ae709fc2936ba8614bb4570456adc8e89cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consumption (L/100 km)",
          "type": "number",
          "required": true,
          "unit": "L/100 km",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fuel price (£/L)",
          "type": "number",
          "required": true,
          "unit": "GBP/L",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fuel cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Fuel (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use real trip consumption where possible; speed, load and weather can affect economy."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fuel cost (£)",
          "text": "a × b ÷ 100 × c"
        },
        {
          "label": "Fuel (L)",
          "text": "a × b ÷ 100"
        }
      ],
      "example_questions": [
        "Use the Fuel trip cost calculator.",
        "Help me calculate fuel trip cost."
      ],
      "retrieval_phrases": [
        "Fuel trip cost",
        "fuel trip cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 6,
            "c": 1.5
          },
          "outputs": [
            {
              "label": "Fuel cost (£)",
              "value": 27
            },
            {
              "label": "Fuel (L)",
              "value": 18
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-353",
      "name": "Fuel economy converter",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "US and imperial gallons have different volumes. These constants use the corresponding gallon and international mile definitions.",
      "url": "/calculators/fuel-economy-converter/",
      "version": "579bf9b90d3c1041a2101d8778d50122a0ce6824c3ee78fcf42d444694c19722",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Consumption (L/100 km)",
          "type": "number",
          "required": true,
          "unit": "L/100 km",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "US MPG",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Imperial MPG",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "US and imperial gallons have different volumes. These constants use the corresponding gallon and international mile definitions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "US MPG",
          "text": "235.214583 ÷ a"
        },
        {
          "label": "Imperial MPG",
          "text": "282.480936 ÷ a"
        }
      ],
      "example_questions": [
        "Use the Fuel economy converter calculator.",
        "Help me calculate fuel economy converter."
      ],
      "retrieval_phrases": [
        "Fuel economy converter",
        "fuel economy converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 8
          },
          "outputs": [
            {
              "label": "US MPG",
              "value": 29.401822875
            },
            {
              "label": "Imperial MPG",
              "value": 35.310117
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-354",
      "name": "Road trip cost split",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Splits entered costs equally; depreciation and wear are not included unless added to the costs.",
      "url": "/calculators/road-trip-cost-split/",
      "version": "0e7a0aef90667e44d2b4451e3aa9490a03d9aa0edf86276a27076238157bad98",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fuel (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tolls (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Parking (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "People",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Per person (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Trip total (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Splits entered costs equally; depreciation and wear are not included unless added to the costs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Per person (£)",
          "text": "(a+b+c) ÷ d"
        },
        {
          "label": "Trip total (£)",
          "text": "a+b+c"
        }
      ],
      "example_questions": [
        "Use the Road trip cost split calculator.",
        "Help me calculate road trip cost split."
      ],
      "retrieval_phrases": [
        "Road trip cost split",
        "road trip cost split"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 10,
            "c": 10,
            "d": 4
          },
          "outputs": [
            {
              "label": "Per person (£)",
              "value": 20
            },
            {
              "label": "Trip total (£)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-355",
      "name": "Commute cost",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Assumes the same monthly pattern for the annual equivalent.",
      "url": "/calculators/commute-cost/",
      "version": "aff5a91561146cf5d9003e0421af47bf61ef9f07695f32d21da9b3a1ed5a859d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Daily round-trip distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Commute days/month",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Running cost (£/km)",
          "type": "number",
          "required": true,
          "unit": "GBP/km",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Daily parking and tolls (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly commute (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Annual equivalent (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the same monthly pattern for the annual equivalent."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly commute (£)",
          "text": "(a × c+d) × b"
        },
        {
          "label": "Annual equivalent (£)",
          "text": "(a × c+d) × b × 12"
        }
      ],
      "example_questions": [
        "Use the Commute cost calculator.",
        "Help me calculate commute cost."
      ],
      "retrieval_phrases": [
        "Commute cost",
        "commute cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 20,
            "c": 0.2,
            "d": 5
          },
          "outputs": [
            {
              "label": "Monthly commute (£)",
              "value": 260
            },
            {
              "label": "Annual equivalent (£)",
              "value": 3120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-356",
      "name": "EV trip energy",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Loss is the fraction of purchased energy not reaching the battery.",
      "url": "/calculators/ev-trip-energy/",
      "version": "993714307357760921bddd41b4b4b14f5fd8fc4cc768dba8e9a83e0592a216db",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consumption (kWh/100 km)",
          "type": "number",
          "required": true,
          "unit": "kWh/100 km",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Charging loss (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Battery energy (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Purchased energy (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Loss is the fraction of purchased energy not reaching the battery."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Battery energy (kWh)",
          "text": "a × b ÷ 100"
        },
        {
          "label": "Purchased energy (kWh)",
          "text": "a × b ÷ 100 ÷ (1-c ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the EV trip energy calculator.",
        "Help me calculate ev trip energy."
      ],
      "retrieval_phrases": [
        "EV trip energy",
        "ev trip energy"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 15,
            "c": 10
          },
          "outputs": [
            {
              "label": "Battery energy (kWh)",
              "value": 30
            },
            {
              "label": "Purchased energy (kWh)",
              "value": 33.333333333333336
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-357",
      "name": "EV charging cost",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Use metered purchased energy; idle, parking and subscription fees are not automatically included.",
      "url": "/calculators/ev-charging-cost/",
      "version": "7cecf8636eef8412cf965628cd8145a7fdea2c2367c55a6d0cce091965adeb68",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Purchased energy (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Session fee (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Charge cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use metered purchased energy; idle, parking and subscription fees are not automatically included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Charge cost (£)",
          "text": "a × b+c"
        }
      ],
      "example_questions": [
        "Use the EV charging cost calculator.",
        "Help me calculate ev charging cost."
      ],
      "retrieval_phrases": [
        "EV charging cost",
        "ev charging cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 0.3,
            "c": 1
          },
          "outputs": [
            {
              "label": "Charge cost (£)",
              "value": 13
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-358",
      "name": "EV range estimate",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Assumes constant consumption and excludes the entered reserve.",
      "url": "/calculators/ev-range-estimate/",
      "version": "20ab138fdb04719b5f7ff17500b2e5b9f616610d7c617d16a44adddb426d172d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Usable battery (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current charge (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reserve charge (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Consumption (kWh/100 km)",
          "type": "number",
          "required": true,
          "unit": "kWh/100 km",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated range (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes constant consumption and excludes the entered reserve."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated range (km)",
          "text": "a × (b-c) ÷ 100 ÷ d × 100"
        }
      ],
      "example_questions": [
        "Use the EV range estimate calculator.",
        "Help me calculate ev range estimate."
      ],
      "retrieval_phrases": [
        "EV range estimate",
        "ev range estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 80,
            "c": 10,
            "d": 15
          },
          "outputs": [
            {
              "label": "Estimated range (km)",
              "value": 280
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-359",
      "name": "Charging stop planner",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "A simplified distance budget; it does not locate chargers or model charging curves.",
      "url": "/calculators/charging-stop-planner/",
      "version": "41a35639a37082d42ad65c7dd88e83f5354472facaa7bf311bcbabd2d1f41e93",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Journey (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting usable range (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Range added per stop (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Minutes per stop",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required stops",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Charging minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A simplified distance budget; it does not locate chargers or model charging curves."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required stops",
          "text": "max(0,roundUp((a-b) ÷ c))"
        },
        {
          "label": "Charging minutes",
          "text": "max(0,roundUp((a-b) ÷ c)) × d"
        }
      ],
      "example_questions": [
        "Use the Charging stop planner calculator.",
        "Help me calculate charging stop planner."
      ],
      "retrieval_phrases": [
        "Charging stop planner",
        "charging stop planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 600,
            "b": 250,
            "c": 200,
            "d": 30
          },
          "outputs": [
            {
              "label": "Required stops",
              "value": 2
            },
            {
              "label": "Charging minutes",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-360",
      "name": "Car ownership cost",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Include fuel, insurance, servicing and financing cost in the annual figure. No future resale value is predicted.",
      "url": "/calculators/car-ownership-cost/",
      "version": "aa3eb651ddff858dd87dbafe062b3fb028063a3c77a6c67eef8015d517bffa71",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Purchase (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected resale (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Other annual ownership costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Years owned",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Annual distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total ownership cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Monthly cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cost per km (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Include fuel, insurance, servicing and financing cost in the annual figure. No future resale value is predicted."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total ownership cost (£)",
          "text": "a−b+c × d"
        },
        {
          "label": "Monthly cost (£)",
          "text": "Total ownership cost / (12 × d)."
        },
        {
          "label": "Cost per km (£)",
          "text": "Total ownership cost / (d × e); undefined when annual distance e = 0."
        }
      ],
      "example_questions": [
        "Use the Car ownership cost calculator.",
        "Help me calculate car ownership cost."
      ],
      "retrieval_phrases": [
        "Car ownership cost",
        "car ownership cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20000,
            "b": 10000,
            "c": 3000,
            "d": 5,
            "e": 10000
          },
          "outputs": [
            {
              "label": "Total ownership cost (£)",
              "value": 25000
            },
            {
              "label": "Monthly cost (£)",
              "value": 416.6666666666667
            },
            {
              "label": "Cost per km (£)",
              "value": 0.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-361",
      "name": "Vehicle depreciation",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Constant percentage depreciation is a scenario, not a vehicle valuation.",
      "url": "/calculators/vehicle-depreciation/",
      "version": "54539a06289c8455896cd71742fccb5918f9043a3c17059239ec9e679277fa9e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial value (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual depreciation (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Years",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Projected value (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Value lost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant percentage depreciation is a scenario, not a vehicle valuation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Projected value (£)",
          "text": "a × (1-b ÷ 100)^c"
        },
        {
          "label": "Value lost (£)",
          "text": "a-a × (1-b ÷ 100)^c"
        }
      ],
      "example_questions": [
        "Use the Vehicle depreciation calculator.",
        "Help me calculate vehicle depreciation."
      ],
      "retrieval_phrases": [
        "Vehicle depreciation",
        "vehicle depreciation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20000,
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Projected value (£)",
              "value": 16200.000000000002
            },
            {
              "label": "Value lost (£)",
              "value": 3799.999999999998
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-362",
      "name": "Carpool contribution",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Allocate cost in proportion to the entered weights; include the driver as a participant if appropriate.",
      "url": "/calculators/carpool-contribution/",
      "version": "18968db1d180e27764ba1f680944a1fd67a607f47af666b4bcaeca55826849f8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Trip cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Passenger distance weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Contributions (£)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Allocate cost in proportion to the entered weights; include the driver as a participant if appropriate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Contributions (£)",
          "text": "For each passenger weight w in b: a × w/sum(b)."
        }
      ],
      "example_questions": [
        "Use the Carpool contribution calculator.",
        "Help me calculate carpool contribution."
      ],
      "retrieval_phrases": [
        "Carpool contribution",
        "carpool contribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": "1,2,3"
          },
          "outputs": [
            {
              "label": "Contributions (£)",
              "value": "10, 20, 30"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-363",
      "name": "Taxi fare estimate",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "A simple distance-plus-waiting tariff. Actual meters may switch between distance and time charging.",
      "url": "/calculators/taxi-fare-estimate/",
      "version": "d0d715026dc6d0665987188bcb1bc7a4fd277f2af67fd57fbe4d1d581dc23c9c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Base fare (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rate (£/km)",
          "type": "number",
          "required": true,
          "unit": "GBP/km",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Waiting (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Wait rate (£/minute)",
          "type": "number",
          "required": true,
          "unit": "GBP/minute",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Surcharge (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated fare (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A simple distance-plus-waiting tariff. Actual meters may switch between distance and time charging."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated fare (£)",
          "text": "a+b × c+d × e+f"
        }
      ],
      "example_questions": [
        "Use the Taxi fare estimate calculator.",
        "Help me calculate taxi fare estimate."
      ],
      "retrieval_phrases": [
        "Taxi fare estimate",
        "taxi fare estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 10,
            "c": 1.5,
            "d": 5,
            "e": 0.2,
            "f": 0
          },
          "outputs": [
            {
              "label": "Estimated fare (£)",
              "value": 19
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-364",
      "name": "Travel budget",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Transport and accommodation are group totals; daily spending is per person.",
      "url": "/calculators/travel-budget/",
      "version": "da9336c5d02dc3b528d1db92a0f7d66ccc00fbacba938fe4a0e62b0eca800797",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Transport total (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Nights",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Accommodation per night (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Daily spending per person (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "People",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Trip total (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Per person (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Transport and accommodation are group totals; daily spending is per person."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Trip total (£)",
          "text": "a+b × c+d × e × f"
        },
        {
          "label": "Per person (£)",
          "text": "(a+b × c+d × e × f) ÷ f"
        }
      ],
      "example_questions": [
        "Use the Travel budget calculator.",
        "Help me calculate travel budget."
      ],
      "retrieval_phrases": [
        "Travel budget",
        "travel budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 400,
            "b": 5,
            "c": 100,
            "d": 40,
            "e": 6,
            "f": 2
          },
          "outputs": [
            {
              "label": "Trip total (£)",
              "value": 1380
            },
            {
              "label": "Per person (£)",
              "value": 690
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-365",
      "name": "Accommodation price comparison",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Enter all mandatory charges explicitly. Currency conversion is not included.",
      "url": "/calculators/accommodation-price-comparison/",
      "version": "ec8c962d6fae7c4f001847dba2f1824695e22846544ff66e9e3f6525f48e0ece",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Nightly price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Nights",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Cleaning (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other fees and taxes (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Stay total (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Effective nightly (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter all mandatory charges explicitly. Currency conversion is not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Stay total (£)",
          "text": "a × b+c+d"
        },
        {
          "label": "Effective nightly (£)",
          "text": "(a × b+c+d) ÷ b"
        }
      ],
      "example_questions": [
        "Use the Accommodation price comparison calculator.",
        "Help me calculate accommodation price comparison."
      ],
      "retrieval_phrases": [
        "Accommodation price comparison",
        "accommodation price comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 3,
            "c": 40,
            "d": 20
          },
          "outputs": [
            {
              "label": "Stay total (£)",
              "value": 360
            },
            {
              "label": "Effective nightly (£)",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-366",
      "name": "Travel spending allowance",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "A negative result means prepaid costs already exceed the budget.",
      "url": "/calculators/travel-spending-allowance/",
      "version": "5b6078d69ba3e522c66fd9c278e74990828664ac06860f7c5b5150fceca77ca1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Budget (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Prepaid costs (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Trip days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Daily allowance (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A negative result means prepaid costs already exceed the budget."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Daily allowance (£)",
          "text": "(a-b) ÷ c"
        }
      ],
      "example_questions": [
        "Use the Travel spending allowance calculator.",
        "Help me calculate travel spending allowance."
      ],
      "retrieval_phrases": [
        "Travel spending allowance",
        "travel spending allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 400,
            "c": 5
          },
          "outputs": [
            {
              "label": "Daily allowance (£)",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-367",
      "name": "Luggage allowance",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Uses a pooled allowance and a linear excess-weight fee. Airline per-bag and size rules may differ.",
      "url": "/calculators/luggage-allowance/",
      "version": "6ad1ecae904ef648a4ee20c0cc83fc22f51f924964619420ec1bfdc2198134d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bag weights (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Allowance (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fee per excess kg (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Excess weight (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Linear excess fee (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a pooled allowance and a linear excess-weight fee. Airline per-bag and size rules may differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Excess weight (kg)",
          "text": "max(0,sum(a)-b)"
        },
        {
          "label": "Linear excess fee (£)",
          "text": "max(0,sum(a)-b) × c"
        }
      ],
      "example_questions": [
        "Use the Luggage allowance calculator.",
        "Help me calculate luggage allowance."
      ],
      "retrieval_phrases": [
        "Luggage allowance",
        "luggage allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "15,18",
            "b": 30,
            "c": 10
          },
          "outputs": [
            {
              "label": "Excess weight (kg)",
              "value": 3
            },
            {
              "label": "Linear excess fee (£)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-368",
      "name": "Airline points redemption value",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Compares avoided cash fare with points spent, excluding points earned and cancellation differences.",
      "url": "/calculators/airline-points-redemption-value/",
      "version": "84777571c58dda949d89ad874d6bb7427b0f8c7152fd18b1c37efd3c1ec0cf59",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cash fare (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Award taxes and charges (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Points required",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pence per point",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares avoided cash fare with points spent, excluding points earned and cancellation differences."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pence per point",
          "text": "(a-b) ÷ c × 100"
        }
      ],
      "example_questions": [
        "Use the Airline points redemption value calculator.",
        "Help me calculate airline points redemption value."
      ],
      "retrieval_phrases": [
        "Airline points redemption value",
        "airline points redemption value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 100,
            "c": 20000
          },
          "outputs": [
            {
              "label": "Pence per point",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-369",
      "name": "Great-circle distance",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Spherical Earth with mean radius 6,371 km. This is not road distance or a navigation solution.",
      "url": "/calculators/great-circle-distance/",
      "version": "608fda44edf2671fbc34b7f7d4a84f38c98c1a5c0157f50a0676b105645e7b56",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Latitude A (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Longitude A (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Latitude B (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Longitude B (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Great-circle distance (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Spherical Earth with mean radius 6,371 km. This is not road distance or a navigation solution."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Great-circle distance (km)",
          "text": "greatCircleDistance(a,b,c,d)"
        }
      ],
      "example_questions": [
        "Use the Great-circle distance calculator.",
        "Help me calculate great-circle distance."
      ],
      "retrieval_phrases": [
        "Great-circle distance",
        "great circle distance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0,
            "b": 0,
            "c": 0,
            "d": 90
          },
          "outputs": [
            {
              "label": "Great-circle distance (km)",
              "value": 10007.543398010284
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-370",
      "name": "Map scale distance",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Scale 1:n means one map unit represents n ground units. Assumes no distortion from resizing.",
      "url": "/calculators/map-scale-distance/",
      "version": "02fc8feb5916ba04c2a73be98784df5d397fa4c56299e7466d42397f2962229a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Map distance (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Scale denominator",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ground distance (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Scale 1:n means one map unit represents n ground units. Assumes no distortion from resizing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ground distance (km)",
          "text": "a × b ÷ 100000"
        }
      ],
      "example_questions": [
        "Use the Map scale distance calculator.",
        "Help me calculate map scale distance."
      ],
      "retrieval_phrases": [
        "Map scale distance",
        "map scale distance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 50000
          },
          "outputs": [
            {
              "label": "Ground distance (km)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-371",
      "name": "Nautical travel time",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "One knot is one nautical mile per hour. Currents, routing and safety margins are excluded.",
      "url": "/calculators/nautical-travel-time/",
      "version": "ebb25e147643bff86cf73aba56af89f6f8669a3f4ddd2edfbc06d87847319057",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (nautical miles)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Speed (knots)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Travel time (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One knot is one nautical mile per hour. Currents, routing and safety margins are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Travel time (hours)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Nautical travel time calculator.",
        "Help me calculate nautical travel time."
      ],
      "retrieval_phrases": [
        "Nautical travel time",
        "nautical travel time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 10
          },
          "outputs": [
            {
              "label": "Travel time (hours)",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-372",
      "name": "Wind component",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Directions are clockwise from north. Positive headwind opposes the heading; educational vector decomposition only.",
      "url": "/calculators/wind-component/",
      "version": "2a453c1365db09d806913191a6f76fc4094c192f792c16baa880ec842eb3d5c8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Wind speed",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Wind from direction (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Heading (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Headwind component",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Crosswind component",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Directions are clockwise from north. Positive headwind opposes the heading; educational vector decomposition only."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Headwind component",
          "text": "a × cos((b-c) × π ÷ 180)"
        },
        {
          "label": "Crosswind component",
          "text": "a × sin((b-c) × π ÷ 180)"
        }
      ],
      "example_questions": [
        "Use the Wind component calculator.",
        "Help me calculate wind component."
      ],
      "retrieval_phrases": [
        "Wind component",
        "wind component"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 0,
            "c": 0
          },
          "outputs": [
            {
              "label": "Headwind component",
              "value": 10
            },
            {
              "label": "Crosswind component",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-373",
      "name": "Stopping distance model",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Constant-deceleration model; real braking depends on tyres, road, slope and driver behaviour. Do not use as a safety guarantee.",
      "url": "/calculators/stopping-distance-model/",
      "version": "5f3dcabb375e7be7fb0eca60e3b80dd371e06c43e2bfc12966ba59d7389d8b5f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Speed (km/h)",
          "type": "number",
          "required": true,
          "unit": "km/h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Reaction time (s)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Braking deceleration (m/s²)",
          "type": "number",
          "required": true,
          "unit": "m/s²",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total stopping distance (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Reaction distance (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant-deceleration model; real braking depends on tyres, road, slope and driver behaviour. Do not use as a safety guarantee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total stopping distance (m)",
          "text": "a ÷ 3.6 × b+(a ÷ 3.6)^2 ÷ (2 × c)"
        },
        {
          "label": "Reaction distance (m)",
          "text": "a ÷ 3.6 × b"
        }
      ],
      "example_questions": [
        "Use the Stopping distance model calculator.",
        "Help me calculate stopping distance model."
      ],
      "retrieval_phrases": [
        "Stopping distance model",
        "stopping distance model"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 36,
            "b": 1,
            "c": 5
          },
          "outputs": [
            {
              "label": "Total stopping distance (m)",
              "value": 20
            },
            {
              "label": "Reaction distance (m)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-374",
      "name": "Traffic flow",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Assumes the count covers all entered lanes and the observation window is representative.",
      "url": "/calculators/traffic-flow/",
      "version": "336d8ff74b77bcec1b8d4c5b4afdf2bbf7fb2964140b8a4b9658d2c9c0d95517",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Vehicles counted",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Observation minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Lanes",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Vehicles per hour per lane",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Average total headway (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the count covers all entered lanes and the observation window is representative."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Vehicles per hour per lane",
          "text": "a / (b/60) / c"
        },
        {
          "label": "Average total headway (s)",
          "text": "b × 60/a; undefined when no vehicles are counted."
        }
      ],
      "example_questions": [
        "Use the Traffic flow calculator.",
        "Help me calculate traffic flow."
      ],
      "retrieval_phrases": [
        "Traffic flow",
        "traffic flow"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Vehicles per hour per lane",
              "value": 300
            },
            {
              "label": "Average total headway (s)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-375",
      "name": "Parking cost comparison",
      "category": "Travel and transport",
      "status": "available",
      "purpose": "Rounds any part-hour up and applies one daily cap. Multi-day and stepped tariffs are not supported in this version.",
      "url": "/calculators/parking-cost-comparison/",
      "version": "5dad728b11826d4000b52cce9d9d0068c85200865a4a45f5d53a1264bd53eaa7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Duration (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hourly rate (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Daily cap (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Parking charge (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rounds any part-hour up and applies one daily cap. Multi-day and stepped tariffs are not supported in this version."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Parking charge (£)",
          "text": "min(roundUp(a) × b,c)"
        }
      ],
      "example_questions": [
        "Use the Parking cost comparison calculator.",
        "Help me calculate parking cost comparison."
      ],
      "retrieval_phrases": [
        "Parking cost comparison",
        "parking cost comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 2,
            "c": 8
          },
          "outputs": [
            {
              "label": "Parking charge (£)",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-376",
      "name": "Recipe scaling",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Every ingredient scales by the same serving ratio. Baking time and seasoning may not scale linearly.",
      "url": "/calculators/recipe-scaling/",
      "version": "ede300d13701e32984b408ef13e2863bcf0389f7292925ee7404432b704ce08c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original servings",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired servings",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Ingredient quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Scaled quantities",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Every ingredient scales by the same serving ratio. Baking time and seasoning may not scale linearly."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Scaled quantities",
          "text": "For each ingredient quantity x in c: x × b/a."
        }
      ],
      "example_questions": [
        "Use the Recipe scaling calculator.",
        "Help me calculate recipe scaling."
      ],
      "retrieval_phrases": [
        "Recipe scaling",
        "recipe scaling"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 6,
            "c": "100,200,50"
          },
          "outputs": [
            {
              "label": "Scaled quantities",
              "value": "150, 300, 75"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-377",
      "name": "Bakers percentages",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Flour is the 100% reference, so all ingredient percentages need not sum to 100.",
      "url": "/calculators/bakers-percentages/",
      "version": "c03aecd473259992d8d5d121d7091348b065579b31fb25a8368af8a3825483be",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Flour mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Other ingredient masses (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bakers percentages",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Flour is the 100% reference, so all ingredient percentages need not sum to 100."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bakers percentages",
          "text": "For each ingredient mass x in b: x/a × 100. Flour a is the 100% reference."
        }
      ],
      "example_questions": [
        "Use the Bakers percentages calculator.",
        "Help me calculate bakers percentages."
      ],
      "retrieval_phrases": [
        "Bakers percentages",
        "bakers percentages"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": "350,10,5"
          },
          "outputs": [
            {
              "label": "Bakers percentages",
              "value": "70, 2, 1"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-378",
      "name": "Dough hydration",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Include flour and water contributed by starter or preferment. This simple metric excludes other liquid ingredients.",
      "url": "/calculators/dough-hydration/",
      "version": "ad90b2c733ede6081388f8c35fccafaf79dda745beb4b7ef7ad994af372d1ddf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total flour (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Total water (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hydration (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Include flour and water contributed by starter or preferment. This simple metric excludes other liquid ingredients."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hydration (%)",
          "text": "b ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Dough hydration calculator.",
        "Help me calculate dough hydration."
      ],
      "retrieval_phrases": [
        "Dough hydration",
        "dough hydration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 350
          },
          "outputs": [
            {
              "label": "Hydration (%)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-379",
      "name": "Bread dough target weight",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Flour is fixed at 100 parts; distribute the target dough mass across all parts.",
      "url": "/calculators/bread-dough-target-weight/",
      "version": "8b059762c4ab004e4156793fd4facb32f3616d04ed077ff0ad7ecd795117d3b2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target dough mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Non-flour bakers percentages",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Flour (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Other ingredient masses (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Flour is fixed at 100 parts; distribute the target dough mass across all parts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Flour (g)",
          "text": "a/(1+sum(b)/100)"
        },
        {
          "label": "Other ingredient masses (g)",
          "text": "For each non-flour percentage x in b: calculated flour mass × x/100."
        }
      ],
      "example_questions": [
        "Use the Bread dough target weight calculator.",
        "Help me calculate bread dough target weight."
      ],
      "retrieval_phrases": [
        "Bread dough target weight",
        "bread dough target weight"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": "70,2,1"
          },
          "outputs": [
            {
              "label": "Flour (g)",
              "value": 578.0346820809249
            },
            {
              "label": "Other ingredient masses (g)",
              "value": "404.6242774566474, 11.560693641618498, 5.780346820809249"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-380",
      "name": "Sourdough feed ratio",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "A 1:2:2 feed uses two parts flour and two parts water for each part existing starter.",
      "url": "/calculators/sourdough-feed-ratio/",
      "version": "e78ee57c006bd8ae0234f4e3a9efc8dea2a7a4f253731e08c72f083b6a079994",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starter mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Flour feed multiple",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Water feed multiple",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Flour feed (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Water feed (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total starter after feed (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A 1:2:2 feed uses two parts flour and two parts water for each part existing starter."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Flour feed (g)",
          "text": "a × b"
        },
        {
          "label": "Water feed (g)",
          "text": "a × c"
        },
        {
          "label": "Total starter after feed (g)",
          "text": "a × (1+b+c)"
        }
      ],
      "example_questions": [
        "Use the Sourdough feed ratio calculator.",
        "Help me calculate sourdough feed ratio."
      ],
      "retrieval_phrases": [
        "Sourdough feed ratio",
        "sourdough feed ratio"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 2,
            "c": 2
          },
          "outputs": [
            {
              "label": "Flour feed (g)",
              "value": 40
            },
            {
              "label": "Water feed (g)",
              "value": 40
            },
            {
              "label": "Total starter after feed (g)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-381",
      "name": "Preferment contribution",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Divides the preferment into flour and water. Other preferment ingredients are ignored.",
      "url": "/calculators/preferment-contribution/",
      "version": "a5d1797015ee5773f42231168c848ca7cf5fde4338d6e938e47d675165fbd013",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Preferment mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hydration (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Total recipe flour (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total recipe water (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Preferment flour (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Additional flour (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional water (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Divides the preferment into flour and water. Other preferment ingredients are ignored."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Preferment flour (g)",
          "text": "a ÷ (1+b ÷ 100)"
        },
        {
          "label": "Additional flour (g)",
          "text": "c-a ÷ (1+b ÷ 100)"
        },
        {
          "label": "Additional water (g)",
          "text": "d-a × b ÷ (100+b)"
        }
      ],
      "example_questions": [
        "Use the Preferment contribution calculator.",
        "Help me calculate preferment contribution."
      ],
      "retrieval_phrases": [
        "Preferment contribution",
        "preferment contribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 100,
            "c": 500,
            "d": 350
          },
          "outputs": [
            {
              "label": "Preferment flour (g)",
              "value": 100
            },
            {
              "label": "Additional flour (g)",
              "value": 400
            },
            {
              "label": "Additional water (g)",
              "value": 250
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-382",
      "name": "Pizza dough portions",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "All non-flour percentages are baker’s percentages relative to flour mass.",
      "url": "/calculators/pizza-dough-portions/",
      "version": "da51ea219bbbf13ac2673d417c84afa91f1590608ca17ccb78a4ae1522d8e68a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pizzas",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dough per pizza (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hydration (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Salt (% of flour)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Yeast (% of flour)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Flour (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total dough (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All non-flour percentages are baker’s percentages relative to flour mass."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Flour (g)",
          "text": "a × b ÷ (1+(c+d+e) ÷ 100)"
        },
        {
          "label": "Total dough (g)",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "Use the Pizza dough portions calculator.",
        "Help me calculate pizza dough portions."
      ],
      "retrieval_phrases": [
        "Pizza dough portions",
        "pizza dough portions"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 250,
            "c": 65,
            "d": 2,
            "e": 1
          },
          "outputs": [
            {
              "label": "Flour (g)",
              "value": 595.2380952380952
            },
            {
              "label": "Total dough (g)",
              "value": 1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-383",
      "name": "Pizza size value",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Compares circular area only; crust, thickness and toppings can change value.",
      "url": "/calculators/pizza-size-value/",
      "version": "dedfe51ddbdfb3f8726f61ec9c2d16086b1778d71685f048aa96f204ce28fab2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pizza diameter (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area per pound (cm²/£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Pizza area (cm²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares circular area only; crust, thickness and toppings can change value."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area per pound (cm²/£)",
          "text": "π × (a ÷ 2)^2 ÷ b"
        },
        {
          "label": "Pizza area (cm²)",
          "text": "π × (a ÷ 2)^2"
        }
      ],
      "example_questions": [
        "Use the Pizza size value calculator.",
        "Help me calculate pizza size value."
      ],
      "retrieval_phrases": [
        "Pizza size value",
        "pizza size value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 10
          },
          "outputs": [
            {
              "label": "Area per pound (cm²/£)",
              "value": 70.68583470577035
            },
            {
              "label": "Pizza area (cm²)",
              "value": 706.8583470577034
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-384",
      "name": "Cake pan substitution",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Cylindrical pan volume ratio. Baking time and structural behaviour are not inferred.",
      "url": "/calculators/cake-pan-substitution/",
      "version": "d7374efb3a7032b824dc19b70d9a93e9675218c3bb6575e8e755c6e8bf22de9a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original round-pan diameter (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Original fill depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "New diameter (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "New fill depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Recipe multiplier",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Cylindrical pan volume ratio. Baking time and structural behaviour are not inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Recipe multiplier",
          "text": "c × c × d ÷ (a × a × b)"
        }
      ],
      "example_questions": [
        "Use the Cake pan substitution calculator.",
        "Help me calculate cake pan substitution."
      ],
      "retrieval_phrases": [
        "Cake pan substitution",
        "cake pan substitution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 5,
            "c": 25,
            "d": 5
          },
          "outputs": [
            {
              "label": "Recipe multiplier",
              "value": 1.5625
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-385",
      "name": "Batch oven scheduling",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "No changeover is added after the final load. Preheating and cooling are excluded.",
      "url": "/calculators/batch-oven-scheduling/",
      "version": "b0cdb8f5b258b8961068af77782d00ecb67c13b535c1fc5c960f8d475f032017",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Batches",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Batches per oven load",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Bake minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Changeover minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total oven minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "No changeover is added after the final load. Preheating and cooling are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total oven minutes",
          "text": "roundUp(a ÷ b) × c+max(0,roundUp(a ÷ b)-1) × d"
        }
      ],
      "example_questions": [
        "Use the Batch oven scheduling calculator.",
        "Help me calculate batch oven scheduling."
      ],
      "retrieval_phrases": [
        "Batch oven scheduling",
        "batch oven scheduling"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 2,
            "c": 30,
            "d": 5
          },
          "outputs": [
            {
              "label": "Total oven minutes",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-386",
      "name": "Rice portion quantity",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Portion size and cooked yield are user choices, not nutritional prescriptions.",
      "url": "/calculators/rice-portion-quantity/",
      "version": "027119e8957b35dc5a990076579a8352d18d19fdd68d9c069143886164633413",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "People",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dry rice per person (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cooked mass multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Dry rice (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated cooked mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Portion size and cooked yield are user choices, not nutritional prescriptions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Dry rice (g)",
          "text": "a × b"
        },
        {
          "label": "Estimated cooked mass (g)",
          "text": "a × b × c"
        }
      ],
      "example_questions": [
        "Use the Rice portion quantity calculator.",
        "Help me calculate rice portion quantity."
      ],
      "retrieval_phrases": [
        "Rice portion quantity",
        "rice portion quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 75,
            "c": 3
          },
          "outputs": [
            {
              "label": "Dry rice (g)",
              "value": 300
            },
            {
              "label": "Estimated cooked mass (g)",
              "value": 900
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-387",
      "name": "Pasta portion quantity",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Yield depends on pasta type and cooking. Enter an observed multiplier if available.",
      "url": "/calculators/pasta-portion-quantity/",
      "version": "9704f0e42f52e835c797e08fb7d53d60d07678f37ba82bb13f7580e2061ce0dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "People",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dry pasta per person (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cooked mass multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Dry pasta (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated cooked mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Yield depends on pasta type and cooking. Enter an observed multiplier if available."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Dry pasta (g)",
          "text": "a × b"
        },
        {
          "label": "Estimated cooked mass (g)",
          "text": "a × b × c"
        }
      ],
      "example_questions": [
        "Use the Pasta portion quantity calculator.",
        "Help me calculate pasta portion quantity."
      ],
      "retrieval_phrases": [
        "Pasta portion quantity",
        "pasta portion quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 100,
            "c": 2.5
          },
          "outputs": [
            {
              "label": "Dry pasta (g)",
              "value": 400
            },
            {
              "label": "Estimated cooked mass (g)",
              "value": 1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-388",
      "name": "Coffee brew ratio",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "A ratio of 16 means sixteen grams of water per gram of coffee.",
      "url": "/calculators/coffee-brew-ratio/",
      "version": "4a5a5149c6dcf8e715fb08040229ee1c320bdc5b7ac63e6cf2630dea61180226",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Water (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Water-to-coffee ratio",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Coffee (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A ratio of 16 means sixteen grams of water per gram of coffee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Coffee (g)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Coffee brew ratio calculator.",
        "Help me calculate coffee brew ratio."
      ],
      "retrieval_phrases": [
        "Coffee brew ratio",
        "coffee brew ratio"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 16
          },
          "outputs": [
            {
              "label": "Coffee (g)",
              "value": 31.25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-389",
      "name": "Espresso brew ratio",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "A result of two corresponds to a 1:2 dose-to-beverage mass ratio.",
      "url": "/calculators/espresso-brew-ratio/",
      "version": "a4294ef59502decc0b9e00fe7eeca57c52c3f9d21cb3d460f0ae01d7c0a228f8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Coffee dose (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Beverage mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Brew ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A result of two corresponds to a 1:2 dose-to-beverage mass ratio."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Brew ratio",
          "text": "b ÷ a"
        }
      ],
      "example_questions": [
        "Use the Espresso brew ratio calculator.",
        "Help me calculate espresso brew ratio."
      ],
      "retrieval_phrases": [
        "Espresso brew ratio",
        "espresso brew ratio"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 18,
            "b": 36
          },
          "outputs": [
            {
              "label": "Brew ratio",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-390",
      "name": "Tea batch quantity",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Brewing temperature and steep time are outside this quantity calculator.",
      "url": "/calculators/tea-batch-quantity/",
      "version": "4a62bd9ea9bfe27479fc20c7301f1413ed2df4f81a2d5b0426a356eaa8c57f14",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Servings",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Water per serving (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Leaves per litre (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Water (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Tea leaves (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Brewing temperature and steep time are outside this quantity calculator."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Water (L)",
          "text": "a × b ÷ 1000"
        },
        {
          "label": "Tea leaves (g)",
          "text": "a × b ÷ 1000 × c"
        }
      ],
      "example_questions": [
        "Use the Tea batch quantity calculator.",
        "Help me calculate tea batch quantity."
      ],
      "retrieval_phrases": [
        "Tea batch quantity",
        "tea batch quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 250,
            "c": 10
          },
          "outputs": [
            {
              "label": "Water (L)",
              "value": 1
            },
            {
              "label": "Tea leaves (g)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-391",
      "name": "Catering portion planner",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Use one consistent unit for the portion quantity. Buffet choices and appetites can affect actual demand.",
      "url": "/calculators/catering-portion-planner/",
      "version": "4d72356658c8f97e0e9b958cd5d92045ad072f0c8b24bad90419c12966c9edf7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Guests",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Portion quantity per guest",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Buffer (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total ingredient quantity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use one consistent unit for the portion quantity. Buffet choices and appetites can affect actual demand."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total ingredient quantity",
          "text": "a × b × (1+c ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Catering portion planner calculator.",
        "Help me calculate catering portion planner."
      ],
      "retrieval_phrases": [
        "Catering portion planner",
        "catering portion planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 150,
            "c": 10
          },
          "outputs": [
            {
              "label": "Total ingredient quantity",
              "value": 3300.0000000000005
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-392",
      "name": "Buffet cost per guest",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "This is cost, not selling price. Add markup, taxes and contingency separately.",
      "url": "/calculators/buffet-cost-per-guest/",
      "version": "6ec1a7a8e361e7c5c5103c907583a356a0d307a33d2b466b2aad9ce234ad16d9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredients (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Staff (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Equipment (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Guests",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cost per guest (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This is cost, not selling price. Add markup, taxes and contingency separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cost per guest (£)",
          "text": "(a+b+c) ÷ d"
        },
        {
          "label": "Total cost (£)",
          "text": "a+b+c"
        }
      ],
      "example_questions": [
        "Use the Buffet cost per guest calculator.",
        "Help me calculate buffet cost per guest."
      ],
      "retrieval_phrases": [
        "Buffet cost per guest",
        "buffet cost per guest"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 200,
            "c": 100,
            "d": 50
          },
          "outputs": [
            {
              "label": "Cost per guest (£)",
              "value": 12
            },
            {
              "label": "Total cost (£)",
              "value": 600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-393",
      "name": "Recipe ingredient cost",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Ingredient and pack quantities must use matching units. Only the used quantity is costed, not the cash cost of buying full packs.",
      "url": "/calculators/recipe-ingredient-cost/",
      "version": "3a3b627a1862944e2b6aa66ca937784d387df31fb493b429955f9ac947ebb169",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Pack quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Pack prices (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Servings",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Recipe cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cost per serving (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ingredient and pack quantities must use matching units. Only the used quantity is costed, not the cash cost of buying full packs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Recipe cost (£)",
          "text": "For each ingredient: used quantity / pack quantity × pack price. Add the ingredient costs."
        },
        {
          "label": "Cost per serving (£)",
          "text": "Recipe cost / d."
        }
      ],
      "example_questions": [
        "Use the Recipe ingredient cost calculator.",
        "Help me calculate recipe ingredient cost."
      ],
      "retrieval_phrases": [
        "Recipe ingredient cost",
        "recipe ingredient cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "1000,500",
            "c": "5,4",
            "d": 4
          },
          "outputs": [
            {
              "label": "Recipe cost (£)",
              "value": 2.1
            },
            {
              "label": "Cost per serving (£)",
              "value": 0.525
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-394",
      "name": "Edible yield cost",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Trim and waste increase cost per usable unit.",
      "url": "/calculators/edible-yield-cost/",
      "version": "c8e89524a3ab1015d9d0fbff6f726f3767bc4227771f23edca28047a1c9996b6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Purchase mass (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Usable mass (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Purchase price (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usable cost (£/kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Yield (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Trim and waste increase cost per usable unit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usable cost (£/kg)",
          "text": "c ÷ b"
        },
        {
          "label": "Yield (%)",
          "text": "b ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Edible yield cost calculator.",
        "Help me calculate edible yield cost."
      ],
      "retrieval_phrases": [
        "Edible yield cost",
        "edible yield cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 1.5,
            "c": 12
          },
          "outputs": [
            {
              "label": "Usable cost (£/kg)",
              "value": 8
            },
            {
              "label": "Yield (%)",
              "value": 75
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-395",
      "name": "Food-waste cost",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Use the same unit for purchased and wasted quantities.",
      "url": "/calculators/food-waste-cost/",
      "version": "329f330463d9b144b519e6aab9728bac4d0b872e7536ca257d78c89614bb4cdb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Purchased quantity",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Waste quantity",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unit cost (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Waste cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Waste percentage",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the same unit for purchased and wasted quantities."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Waste cost (£)",
          "text": "b × c"
        },
        {
          "label": "Waste percentage",
          "text": "b/a × 100; the zero-purchased-quantity convention is 0%."
        }
      ],
      "example_questions": [
        "Use the Food-waste cost calculator.",
        "Help me calculate food-waste cost."
      ],
      "retrieval_phrases": [
        "Food-waste cost",
        "food waste cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Waste cost (£)",
              "value": 20
            },
            {
              "label": "Waste percentage",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-396",
      "name": "Ingredient volume to mass",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Density is entered by you. Ingredient packing and temperature can materially affect volume-to-mass conversion.",
      "url": "/calculators/ingredient-volume-to-mass/",
      "version": "906729da015c034c5b44355ab6ec79108f48b1ebf18cce9d55b1b406fe0d28ee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Volume (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Density (g/mL)",
          "type": "number",
          "required": true,
          "unit": "g/mL",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Density is entered by you. Ingredient packing and temperature can materially affect volume-to-mass conversion."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated mass (g)",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "Use the Ingredient volume to mass calculator.",
        "Help me calculate ingredient volume to mass."
      ],
      "retrieval_phrases": [
        "Ingredient volume to mass",
        "ingredient volume to mass"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 250,
            "b": 0.8
          },
          "outputs": [
            {
              "label": "Estimated mass (g)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-397",
      "name": "Kitchen unit converter",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Uses the US customary cup, not the 250 mL metric cup or a weight conversion.",
      "url": "/calculators/kitchen-unit-converter/",
      "version": "378580e94441a5f8c137491e478fbb286f647451bc62faecc023e2301722d630",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Quantity in US cups",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Millilitres",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "US tablespoons",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "US teaspoons",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the US customary cup, not the 250 mL metric cup or a weight conversion."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Millilitres",
          "text": "a × 236.5882365"
        },
        {
          "label": "US tablespoons",
          "text": "a × 16"
        },
        {
          "label": "US teaspoons",
          "text": "a × 48"
        }
      ],
      "example_questions": [
        "Use the Kitchen unit converter calculator.",
        "Help me calculate kitchen unit converter."
      ],
      "retrieval_phrases": [
        "Kitchen unit converter",
        "kitchen unit converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1
          },
          "outputs": [
            {
              "label": "Millilitres",
              "value": 236.5882365
            },
            {
              "label": "US tablespoons",
              "value": 16
            },
            {
              "label": "US teaspoons",
              "value": 48
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-398",
      "name": "Salt solution percentage",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Percentage is relative to final solution mass, not water mass. This does not establish food-preservation safety.",
      "url": "/calculators/salt-solution-percentage/",
      "version": "4c762884c25d9917081d5deffdb4cab18d1ceba350ed0862ea6cbf4d31b61831",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Water mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Salt mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Salt mass percentage",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Percentage is relative to final solution mass, not water mass. This does not establish food-preservation safety."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Salt mass percentage",
          "text": "b ÷ (a+b) × 100"
        }
      ],
      "example_questions": [
        "Use the Salt solution percentage calculator.",
        "Help me calculate salt solution percentage."
      ],
      "retrieval_phrases": [
        "Salt solution percentage",
        "salt solution percentage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 900,
            "b": 100
          },
          "outputs": [
            {
              "label": "Salt mass percentage",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-399",
      "name": "Syrup ratio",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "Ratios are by mass. No assumption about final volume, boiling or preservation is made.",
      "url": "/calculators/syrup-ratio/",
      "version": "f8f954d9458782d5082aa622d6d0a55f9c99e2785ecee4c9528113ea2046b9c9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total syrup mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sugar ratio parts",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Water ratio parts",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sugar (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Water (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ratios are by mass. No assumption about final volume, boiling or preservation is made."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sugar (g)",
          "text": "a × b ÷ (b+c)"
        },
        {
          "label": "Water (g)",
          "text": "a × c ÷ (b+c)"
        }
      ],
      "example_questions": [
        "Use the Syrup ratio calculator.",
        "Help me calculate syrup ratio."
      ],
      "retrieval_phrases": [
        "Syrup ratio",
        "syrup ratio"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 600,
            "b": 2,
            "c": 1
          },
          "outputs": [
            {
              "label": "Sugar (g)",
              "value": 400
            },
            {
              "label": "Water (g)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-400",
      "name": "Oven temperature converter",
      "category": "Cooking and kitchen quantities",
      "status": "available",
      "purpose": "An exact temperature-scale conversion, not an adjustment between fan and conventional ovens.",
      "url": "/calculators/oven-temperature-converter/",
      "version": "aa8458281e797f18367c68ea05f8ada6bda3ac4e60d7e4dadf10df803b7d1903",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Temperature (°C)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fahrenheit",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An exact temperature-scale conversion, not an adjustment between fan and conventional ovens."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fahrenheit",
          "text": "a × 9 ÷ 5+32"
        }
      ],
      "example_questions": [
        "Use the Oven temperature converter calculator.",
        "Help me calculate oven temperature converter."
      ],
      "retrieval_phrases": [
        "Oven temperature converter",
        "oven temperature converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 180
          },
          "outputs": [
            {
              "label": "Fahrenheit",
              "value": 356
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-401",
      "name": "Running pace",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Pace is time per distance, while speed is distance per time.",
      "url": "/calculators/running-pace/",
      "version": "91443d23f70fed56f404009633028fd93cbd57d96357cc91e5e8c22c6898f285",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Elapsed minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pace (minutes/km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Speed (km/h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Pace is time per distance, while speed is distance per time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pace (minutes/km)",
          "text": "b/a"
        },
        {
          "label": "Speed (km/h)",
          "text": "a/(b/60); undefined at zero elapsed time."
        }
      ],
      "example_questions": [
        "Use the Running pace calculator.",
        "Help me calculate running pace."
      ],
      "retrieval_phrases": [
        "Running pace",
        "running pace"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 25
          },
          "outputs": [
            {
              "label": "Pace (minutes/km)",
              "value": 5
            },
            {
              "label": "Speed (km/h)",
              "value": 12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-402",
      "name": "Race finish time",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Assumes the same pace over the full distance; stops are excluded.",
      "url": "/calculators/race-finish-time/",
      "version": "7d7e4729137c13f2d7198b6fa5f4c9bf679a8c5973cf9614c0da6d8847dd41e5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Pace (minutes/km)",
          "type": "number",
          "required": true,
          "unit": "minutes/km",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Finish time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the same pace over the full distance; stops are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Finish time (minutes)",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "Use the Race finish time calculator.",
        "Help me calculate race finish time."
      ],
      "retrieval_phrases": [
        "Race finish time",
        "race finish time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 5
          },
          "outputs": [
            {
              "label": "Finish time (minutes)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-403",
      "name": "Race split planner",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Even-pace splits, including a final partial split.",
      "url": "/calculators/race-split-planner/",
      "version": "7d473768d7c9e584991e5c00ae679f2c9fa3ad93a4ead3aa26ae00d0e96f6161",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Race distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Pace (minutes/km)",
          "type": "number",
          "required": true,
          "unit": "minutes/km",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Split length (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cumulative split times",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Even-pace splits, including a final partial split."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cumulative split times",
          "text": "evenPaceSplits(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Race split planner calculator.",
        "Help me calculate race split planner."
      ],
      "retrieval_phrases": [
        "Race split planner",
        "race split planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 5,
            "c": 2
          },
          "outputs": [
            {
              "label": "Cumulative split times",
              "value": "2 km: 10 min; 4 km: 20 min; 6 km: 30 min; 8 km: 40 min; 10 km: 50 min"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-404",
      "name": "Negative-split planner",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "The entered difference is between the two half times, not an addition to each half.",
      "url": "/calculators/negative-split-planner/",
      "version": "066e5710a8783ecf6f2cdbc2c5e026671a1f5f711a488966f3364fe144e176f0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target total minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "First half slower by (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "First-half minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Second-half minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "First-half pace (min/km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The entered difference is between the two half times, not an addition to each half."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "First-half minutes",
          "text": "(a+c) ÷ 2"
        },
        {
          "label": "Second-half minutes",
          "text": "(a-c) ÷ 2"
        },
        {
          "label": "First-half pace (min/km)",
          "text": "(a+c) ÷ b"
        }
      ],
      "example_questions": [
        "Use the Negative-split planner calculator.",
        "Help me calculate negative-split planner."
      ],
      "retrieval_phrases": [
        "Negative-split planner",
        "negative split planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 20,
            "c": 4
          },
          "outputs": [
            {
              "label": "First-half minutes",
              "value": 52
            },
            {
              "label": "Second-half minutes",
              "value": 48
            },
            {
              "label": "First-half pace (min/km)",
              "value": 5.2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-405",
      "name": "Race time prediction",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Riegel-style empirical extrapolation. Fitness, terrain, weather and distance range can make predictions inaccurate.",
      "url": "/calculators/race-time-prediction/",
      "version": "ba1a055164c808be4673fa1d65fe268bae2e138d14de96aa33f1d1effc1db6f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Known distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Known finish minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Empirical exponent",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Predicted finish (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Riegel-style empirical extrapolation. Fitness, terrain, weather and distance range can make predictions inaccurate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Predicted finish (minutes)",
          "text": "b × (c ÷ a)^d"
        }
      ],
      "example_questions": [
        "Use the Race time prediction calculator.",
        "Help me calculate race time prediction."
      ],
      "retrieval_phrases": [
        "Race time prediction",
        "race time prediction"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 25,
            "c": 10,
            "d": 1.06
          },
          "outputs": [
            {
              "label": "Predicted finish (minutes)",
              "value": 52.12328804205607
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-406",
      "name": "Track lap count",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Track distance depends on lane and measured course; use the actual lap length.",
      "url": "/calculators/track-lap-count/",
      "version": "351e838390e433038f5c261541c7b22f9f5696cca040d4e4a8e56d3eeb8fb038",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target distance (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Track length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Full laps",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining metres",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Track distance depends on lane and measured course; use the actual lap length."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Full laps",
          "text": "floor(a ÷ b)"
        },
        {
          "label": "Remaining metres",
          "text": "a rem b"
        }
      ],
      "example_questions": [
        "Use the Track lap count calculator.",
        "Help me calculate track lap count."
      ],
      "retrieval_phrases": [
        "Track lap count",
        "track lap count"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5000,
            "b": 400
          },
          "outputs": [
            {
              "label": "Full laps",
              "value": 12
            },
            {
              "label": "Remaining metres",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-407",
      "name": "Treadmill pace",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Uses stated belt speed without calibration or incline adjustment.",
      "url": "/calculators/treadmill-pace/",
      "version": "408f216796d1cf34543adb8362b89954be990f037d23404973faa4f238b1a8f5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Belt speed (km/h)",
          "type": "number",
          "required": true,
          "unit": "km/h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pace (minutes/km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Duration (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses stated belt speed without calibration or incline adjustment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pace (minutes/km)",
          "text": "60 ÷ a"
        },
        {
          "label": "Duration (minutes)",
          "text": "b ÷ a × 60"
        }
      ],
      "example_questions": [
        "Use the Treadmill pace calculator.",
        "Help me calculate treadmill pace."
      ],
      "retrieval_phrases": [
        "Treadmill pace",
        "treadmill pace"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 5
          },
          "outputs": [
            {
              "label": "Pace (minutes/km)",
              "value": 5
            },
            {
              "label": "Duration (minutes)",
              "value": 25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-408",
      "name": "Treadmill incline gain",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Grade is rise divided by horizontal run; belt distance is along the slope. This is geometric equivalent gain.",
      "url": "/calculators/treadmill-incline-gain/",
      "version": "579128321bcbd818c874e43f76fa51a03505d4b738339c8fffa849c0081dbad0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Belt distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Grade (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Approximate vertical gain (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Grade is rise divided by horizontal run; belt distance is along the slope. This is geometric equivalent gain."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Approximate vertical gain (m)",
          "text": "a × 1000 × (b ÷ 100) ÷ sqrt(1+(b ÷ 100)^2)"
        }
      ],
      "example_questions": [
        "Use the Treadmill incline gain calculator.",
        "Help me calculate treadmill incline gain."
      ],
      "retrieval_phrases": [
        "Treadmill incline gain",
        "treadmill incline gain"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 10
          },
          "outputs": [
            {
              "label": "Approximate vertical gain (m)",
              "value": 497.51859510499463
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-409",
      "name": "Cycling cadence and speed",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Assumes no tyre slip and continuous pedalling at the stated cadence.",
      "url": "/calculators/cycling-cadence-and-speed/",
      "version": "c91e24a0c3c524608e5c835bb95b94209c9ad45cb4f7477223efca68e9a595a6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cadence (rpm)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Chainring teeth",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sprocket teeth",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Wheel circumference (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Theoretical speed (km/h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes no tyre slip and continuous pedalling at the stated cadence."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Theoretical speed (km/h)",
          "text": "a × b ÷ c × d × 60 ÷ 1000"
        }
      ],
      "example_questions": [
        "Use the Cycling cadence and speed calculator.",
        "Help me calculate cycling cadence and speed."
      ],
      "retrieval_phrases": [
        "Cycling cadence and speed",
        "cycling cadence and speed"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 90,
            "b": 50,
            "c": 25,
            "d": 2.1
          },
          "outputs": [
            {
              "label": "Theoretical speed (km/h)",
              "value": 22.68
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-410",
      "name": "Bicycle gear inches",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Gear inches describe mechanical gearing, not hill-climbing ability by themselves.",
      "url": "/calculators/bicycle-gear-inches/",
      "version": "649de3acb0c1f1143d04ff919231ef5e244fce918b28139a78d3c776d3a65aa0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Wheel diameter (inches)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Chainring teeth",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sprocket teeth",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gear inches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rollout (inches)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Gear inches describe mechanical gearing, not hill-climbing ability by themselves."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gear inches",
          "text": "a × b ÷ c"
        },
        {
          "label": "Rollout (inches)",
          "text": "π × a × b ÷ c"
        }
      ],
      "example_questions": [
        "Use the Bicycle gear inches calculator.",
        "Help me calculate bicycle gear inches."
      ],
      "retrieval_phrases": [
        "Bicycle gear inches",
        "bicycle gear inches"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 27,
            "b": 50,
            "c": 25
          },
          "outputs": [
            {
              "label": "Gear inches",
              "value": 54
            },
            {
              "label": "Rollout (inches)",
              "value": 169.64600329384882
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-411",
      "name": "Cycling power-to-weight",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "State whether the denominator includes the bicycle and equipment when comparing results.",
      "url": "/calculators/cycling-power-to-weight/",
      "version": "2bcf37f1d0c86ad7d82b3ab2d11c29f19892a442da64cd4259bedf65fcf3afde",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Power (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rider or system mass (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Power-to-weight (W/kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "State whether the denominator includes the bicycle and equipment when comparing results."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Power-to-weight (W/kg)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Cycling power-to-weight calculator.",
        "Help me calculate cycling power-to-weight."
      ],
      "retrieval_phrases": [
        "Cycling power-to-weight",
        "cycling power to weight"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 250,
            "b": 75
          },
          "outputs": [
            {
              "label": "Power-to-weight (W/kg)",
              "value": 3.3333333333333335
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-412",
      "name": "Cycling climbing work",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Only gravitational work; aerodynamic, rolling and drivetrain losses are excluded.",
      "url": "/calculators/cycling-climbing-work/",
      "version": "bd8842fd97c6bb5a3def49dbdb3bdf528f4c225581191618fb8a38bce43c1e6e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "System mass (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Vertical gain (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Duration (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gravitational work (J)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Ideal climbing power (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Only gravitational work; aerodynamic, rolling and drivetrain losses are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gravitational work (J)",
          "text": "a × 9.80665 × b"
        },
        {
          "label": "Ideal climbing power (W)",
          "text": "Gravitational work / c; undefined at zero duration."
        }
      ],
      "example_questions": [
        "Use the Cycling climbing work calculator.",
        "Help me calculate cycling climbing work."
      ],
      "retrieval_phrases": [
        "Cycling climbing work",
        "cycling climbing work"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 85,
            "b": 100,
            "c": 300
          },
          "outputs": [
            {
              "label": "Gravitational work (J)",
              "value": 83356.525
            },
            {
              "label": "Ideal climbing power (W)",
              "value": 277.8550833333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-413",
      "name": "Swimming pace",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Rest time is included if it is part of the entered elapsed time.",
      "url": "/calculators/swimming-pace/",
      "version": "8167f70cacf3db692c274fbc6342d5e1ffc656e410e7332d297f7d82c946c538",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Elapsed minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pace (minutes/100 m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rest time is included if it is part of the entered elapsed time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pace (minutes/100 m)",
          "text": "b ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Swimming pace calculator.",
        "Help me calculate swimming pace."
      ],
      "retrieval_phrases": [
        "Swimming pace",
        "swimming pace"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 20
          },
          "outputs": [
            {
              "label": "Pace (minutes/100 m)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-414",
      "name": "Swimming lap planner",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "One length goes from one end to the other; a return lap is two lengths.",
      "url": "/calculators/swimming-lap-planner/",
      "version": "399913744901a9656bc8f0ef2330cc56c843accc7089b43970e334c7d44f0d5d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pool length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target distance (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Lengths",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Complete return laps",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One length goes from one end to the other; a return lap is two lengths."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Lengths",
          "text": "b ÷ a"
        },
        {
          "label": "Complete return laps",
          "text": "floor(b ÷ (2 × a))"
        }
      ],
      "example_questions": [
        "Use the Swimming lap planner calculator.",
        "Help me calculate swimming lap planner."
      ],
      "retrieval_phrases": [
        "Swimming lap planner",
        "swimming lap planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 25,
            "b": 1000
          },
          "outputs": [
            {
              "label": "Lengths",
              "value": 40
            },
            {
              "label": "Complete return laps",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-415",
      "name": "Rowing split and power",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Uses the Concept2-style pace-power equation. It does not estimate mechanical power for every rowing machine or on-water boat.",
      "url": "/calculators/rowing-split-and-power/",
      "version": "b58cdf7c0fa2b3caa461f65124bc3b99e1eba70b7cec9c4996752442633778a0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "500 m split (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Modelled rowing power (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the Concept2-style pace-power equation. It does not estimate mechanical power for every rowing machine or on-water boat."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Modelled rowing power (W)",
          "text": "2.8 ÷ (a ÷ 500)^3"
        }
      ],
      "example_questions": [
        "Use the Rowing split and power calculator.",
        "Help me calculate rowing split and power."
      ],
      "retrieval_phrases": [
        "Rowing split and power",
        "rowing split and power"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120
          },
          "outputs": [
            {
              "label": "Modelled rowing power (W)",
              "value": 202.5462962962963
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-416",
      "name": "Triathlon finish planner",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Adds entered discipline and transition durations without predicting pace.",
      "url": "/calculators/triathlon-finish-planner/",
      "version": "1c7dd1000d88b2d72b0c0e343588186dc606fb5ab2796d0ceb2a12602afb03ee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Swim minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bike minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Run minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total transition minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Finish minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds entered discipline and transition durations without predicting pace."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Finish minutes",
          "text": "a+b+c+d"
        }
      ],
      "example_questions": [
        "Use the Triathlon finish planner calculator.",
        "Help me calculate triathlon finish planner."
      ],
      "retrieval_phrases": [
        "Triathlon finish planner",
        "triathlon finish planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 90,
            "c": 50,
            "d": 5
          },
          "outputs": [
            {
              "label": "Finish minutes",
              "value": 175
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-417",
      "name": "Interval workout duration",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Rest is placed between repetitions only, with no final rest appended.",
      "url": "/calculators/interval-workout-duration/",
      "version": "e8c93832d83966c08548d745bf7aad3ff9397e695e3a391bf41157337b05ecfb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Repetitions",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Work seconds",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rest seconds",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Warm-up minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cool-down minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Workout minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rest is placed between repetitions only, with no final rest appended."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Workout minutes",
          "text": "(a × b+(a-1) × c) ÷ 60+d+e"
        }
      ],
      "example_questions": [
        "Use the Interval workout duration calculator.",
        "Help me calculate interval workout duration."
      ],
      "retrieval_phrases": [
        "Interval workout duration",
        "interval workout duration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 8,
            "b": 60,
            "c": 30,
            "d": 10,
            "e": 5
          },
          "outputs": [
            {
              "label": "Workout minutes",
              "value": 26.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-418",
      "name": "Training volume",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "External load volume is an arithmetic training log, not a measure of physiological effect.",
      "url": "/calculators/training-volume/",
      "version": "702d9fb15e1bc355a319ae10178c46cb8c1ccfdad0a6bd88475fe453208eaf1d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sets",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Repetitions per set",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Load (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Lifted-load volume (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Repetitions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "External load volume is an arithmetic training log, not a measure of physiological effect."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Lifted-load volume (kg)",
          "text": "a × b × c"
        },
        {
          "label": "Repetitions",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "Use the Training volume calculator.",
        "Help me calculate training volume."
      ],
      "retrieval_phrases": [
        "Training volume",
        "training volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": 10,
            "c": 20
          },
          "outputs": [
            {
              "label": "Lifted-load volume (kg)",
              "value": 600
            },
            {
              "label": "Repetitions",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-419",
      "name": "Plate loading",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Uses the listed plate pairs, each at most once. Finds the heaviest achievable symmetric load not exceeding the target.",
      "url": "/calculators/plate-loading/",
      "version": "0e548cf80ca53d05b85c92c408bafd874e278a0686a1fb96336a2336c5394e4e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target weight (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bar weight (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Available pair plate weights (kg), repeated for quantity",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Plates per side",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the listed plate pairs, each at most once. Finds the heaviest achievable symmetric load not exceeding the target."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Plates per side",
          "text": "choosePlates(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the Plate loading calculator.",
        "Help me calculate plate loading."
      ],
      "retrieval_phrases": [
        "Plate loading",
        "plate loading"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 20,
            "c": "20,20,10,5,2.5"
          },
          "outputs": [
            {
              "label": "Plates per side",
              "value": "20 + 20 kg"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-420",
      "name": "One-rep-max estimate",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Epley estimate, with a single repetition returned unchanged. It is not a safe training prescription.",
      "url": "/calculators/one-rep-max-estimate/",
      "version": "f2a14682b8ed0b415b6176746519041247f2e61567b3932ddb45aeb458398a5f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Lifted weight (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Repetitions",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated one-rep max (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Epley estimate, with a single repetition returned unchanged. It is not a safe training prescription."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated one-rep max (kg)",
          "text": "For one repetition return a unchanged. Otherwise estimate a × (1+b/30), limited to 2–12 repetitions."
        }
      ],
      "example_questions": [
        "Use the One-rep-max estimate calculator.",
        "Help me calculate one-rep-max estimate."
      ],
      "retrieval_phrases": [
        "One-rep-max estimate",
        "one rep max estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 5
          },
          "outputs": [
            {
              "label": "Estimated one-rep max (kg)",
              "value": 116.66666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-421",
      "name": "Training load trend",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Sum duration × self-reported effort. The units are arbitrary and do not establish injury risk.",
      "url": "/calculators/training-load-trend/",
      "version": "37c95377a9b96c044afe129010ff4e7695dee821114d2a66e9b95783486a6826",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Session durations (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Perceived effort (0–10)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total session load",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sum duration × self-reported effort. The units are arbitrary and do not establish injury risk."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total session load",
          "text": "Multiply each session duration in a by its paired effort score in b; add the products."
        }
      ],
      "example_questions": [
        "Use the Training load trend calculator.",
        "Help me calculate training load trend."
      ],
      "retrieval_phrases": [
        "Training load trend",
        "training load trend"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,40,50",
            "b": "5,6,7"
          },
          "outputs": [
            {
              "label": "Total session load",
              "value": 740
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-422",
      "name": "Round-robin fixtures",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Round count assumes enough venues and no rest restrictions. This version calculates counts, not named fixtures.",
      "url": "/calculators/round-robin-fixtures/",
      "version": "2f2d4f59f150a7bb0295aa205a9e34d9a73b3b566f4552a84195120c07e48bf6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Teams",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Meetings per pair",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Matches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rounds (one match/team per round)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Round count assumes enough venues and no rest restrictions. This version calculates counts, not named fixtures."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Matches",
          "text": "a × (a−1)/2 × b"
        },
        {
          "label": "Rounds (one match/team per round)",
          "text": "For an even team count: (a−1) × b. For an odd team count: a × b, allowing one bye per round."
        }
      ],
      "example_questions": [
        "Use the Round-robin fixtures calculator.",
        "Help me calculate round-robin fixtures."
      ],
      "retrieval_phrases": [
        "Round-robin fixtures",
        "round robin fixtures"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6,
            "b": 1
          },
          "outputs": [
            {
              "label": "Matches",
              "value": 15
            },
            {
              "label": "Rounds (one match/team per round)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-423",
      "name": "Knockout bracket",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Single elimination without a third-place match. Byes fill the next power-of-two bracket.",
      "url": "/calculators/knockout-bracket/",
      "version": "d52321fff19d2b6f82338e1be9e9b208b185316c2ee171b264f30489e5aeea96",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Entrants",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Matches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rounds",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "First-round byes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single elimination without a third-place match. Byes fill the next power-of-two bracket."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Matches",
          "text": "a-1"
        },
        {
          "label": "Rounds",
          "text": "roundUp(log2(a))"
        },
        {
          "label": "First-round byes",
          "text": "2^roundUp(log2(a))-a"
        }
      ],
      "example_questions": [
        "Use the Knockout bracket calculator.",
        "Help me calculate knockout bracket."
      ],
      "retrieval_phrases": [
        "Knockout bracket",
        "knockout bracket"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10
          },
          "outputs": [
            {
              "label": "Matches",
              "value": 9
            },
            {
              "label": "Rounds",
              "value": 4
            },
            {
              "label": "First-round byes",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-424",
      "name": "League points scenarios",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Assumes losses award zero points and no deductions or bonus points.",
      "url": "/calculators/league-points-scenarios/",
      "version": "8d3971b984d770601e2d0722753e1ad67938036c64fb677724cde80647fe2e29",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current points",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Remaining matches",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Points per win",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Points per draw",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum points",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "All-draw scenario",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "All-loss scenario",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes losses award zero points and no deductions or bonus points."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum points",
          "text": "a+b × c"
        },
        {
          "label": "All-draw scenario",
          "text": "a+b × d"
        },
        {
          "label": "All-loss scenario",
          "text": "a"
        }
      ],
      "example_questions": [
        "Use the League points scenarios calculator.",
        "Help me calculate league points scenarios."
      ],
      "retrieval_phrases": [
        "League points scenarios",
        "league points scenarios"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 5,
            "c": 3,
            "d": 1
          },
          "outputs": [
            {
              "label": "Maximum points",
              "value": 35
            },
            {
              "label": "All-draw scenario",
              "value": 25
            },
            {
              "label": "All-loss scenario",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-425",
      "name": "Tournament court scheduling",
      "category": "Sport and recreation",
      "status": "available",
      "purpose": "Capacity-only estimate without player conflicts, rest rules or bracket dependencies.",
      "url": "/calculators/tournament-court-scheduling/",
      "version": "e194898cbe89822e0ef5128bf3c6b33c7254097ac344efdd4592399000587208",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Matches",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Courts",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Minutes per match",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Changeover minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Minimum session minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Capacity-only estimate without player conflicts, rest rules or bracket dependencies."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Minimum session minutes",
          "text": "roundUp(a ÷ b) × c+max(0,roundUp(a ÷ b)-1) × d"
        }
      ],
      "example_questions": [
        "Use the Tournament court scheduling calculator.",
        "Help me calculate tournament court scheduling."
      ],
      "retrieval_phrases": [
        "Tournament court scheduling",
        "tournament court scheduling"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 4,
            "c": 30,
            "d": 5
          },
          "outputs": [
            {
              "label": "Minimum session minutes",
              "value": 170
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document empirical equation and validity range; distinguish calculation from coaching or medical guidance; independent unit checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-426",
      "name": "Data size converter",
      "category": "Computing and data",
      "status": "available",
      "purpose": "GB is 10⁹ bytes, while GiB is 2³⁰ bytes. These are not interchangeable units.",
      "url": "/calculators/data-size-converter/",
      "version": "65dbd9fe17d43d9069677b144f6a178e43d0b23baf7ac359d914f2f22d8afdd2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Size in decimal GB",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "GiB",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "MiB",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "GB is 10⁹ bytes, while GiB is 2³⁰ bytes. These are not interchangeable units."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bytes",
          "text": "a × 1e9"
        },
        {
          "label": "GiB",
          "text": "a × 1e9 ÷ 2^30"
        },
        {
          "label": "MiB",
          "text": "a × 1e9 ÷ 2^20"
        }
      ],
      "example_questions": [
        "Use the Data size converter calculator.",
        "Help me calculate data size converter."
      ],
      "retrieval_phrases": [
        "Data size converter",
        "data size converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1
          },
          "outputs": [
            {
              "label": "Bytes",
              "value": 1000000000
            },
            {
              "label": "GiB",
              "value": 0.9313225746154785
            },
            {
              "label": "MiB",
              "value": 953.67431640625
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-427",
      "name": "Download time",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Decimal gigabytes and megabits. Efficiency accounts for overhead and less-than-rated throughput.",
      "url": "/calculators/download-time/",
      "version": "779f866609345873ecdee0d19198f8e6b1d4e93047931cd66fb9acbc10622c61",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "File size (GB)",
          "type": "number",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Connection (Mbps)",
          "type": "number",
          "required": true,
          "unit": "Mbps",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Efficiency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Download seconds",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Decimal gigabytes and megabits. Efficiency accounts for overhead and less-than-rated throughput."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Download seconds",
          "text": "a × 1e9 × 8 ÷ (b × 1e6 × c ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Download time calculator.",
        "Help me calculate download time."
      ],
      "retrieval_phrases": [
        "Download time",
        "download time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 100,
            "c": 80
          },
          "outputs": [
            {
              "label": "Download seconds",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-428",
      "name": "Upload bandwidth requirement",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Bandwidth is measured in megabits per second, not megabytes.",
      "url": "/calculators/upload-bandwidth-requirement/",
      "version": "ca550d5fdfe499bc23fa375b610939ed594778551246f2302b17ab46b9bb0484",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Data volume (GB)",
          "type": "number",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Upload window (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Efficiency (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required bandwidth (Mbps)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Bandwidth is measured in megabits per second, not megabytes."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required bandwidth (Mbps)",
          "text": "a × 1e9 × 8 ÷ (b × 3600) ÷ (c ÷ 100) ÷ 1e6"
        }
      ],
      "example_questions": [
        "Use the Upload bandwidth requirement calculator.",
        "Help me calculate upload bandwidth requirement."
      ],
      "retrieval_phrases": [
        "Upload bandwidth requirement",
        "upload bandwidth requirement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 80
          },
          "outputs": [
            {
              "label": "Required bandwidth (Mbps)",
              "value": 27.77777777777778
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-429",
      "name": "Monthly data usage",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Constant bitrate estimate; adaptive streaming and protocol overhead may change usage.",
      "url": "/calculators/monthly-data-usage/",
      "version": "81cb457c220330703db23363c77353fbc77fcc7939ec3a4ad24966d2dee9aa0d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Streaming bitrate (Mbps)",
          "type": "number",
          "required": true,
          "unit": "Mbps",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hours per day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Data usage (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant bitrate estimate; adaptive streaming and protocol overhead may change usage."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Data usage (GB)",
          "text": "a × 1e6 ÷ 8 × b × 3600 × c ÷ 1e9"
        }
      ],
      "example_questions": [
        "Use the Monthly data usage calculator.",
        "Help me calculate monthly data usage."
      ],
      "retrieval_phrases": [
        "Monthly data usage",
        "monthly data usage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 2,
            "c": 30
          },
          "outputs": [
            {
              "label": "Data usage (GB)",
              "value": 135
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-430",
      "name": "Storage capacity planner",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Adds reserve to occupied storage. Decimal MB/GB units are used.",
      "url": "/calculators/storage-capacity-planner/",
      "version": "66a69413627c1d0480e1b31e627a5f5047f3353b56e992fc4a324c33d3567486",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "File count",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Average file size (MB)",
          "type": "number",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reserve (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required capacity (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds reserve to occupied storage. Decimal MB/GB units are used."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required capacity (GB)",
          "text": "a × b ÷ 1000 × (1+c ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Storage capacity planner calculator.",
        "Help me calculate storage capacity planner."
      ],
      "retrieval_phrases": [
        "Storage capacity planner",
        "storage capacity planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 5,
            "c": 20
          },
          "outputs": [
            {
              "label": "Required capacity (GB)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-431",
      "name": "Backup window",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Sequential throughput estimate excluding scanning, compression CPU time and seek overhead.",
      "url": "/calculators/backup-window/",
      "version": "69fadea6204c4432bb5a294cb1b275879204520044db45d113944fed43884333",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Data to back up (GB)",
          "type": "number",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sustained throughput (MB/s)",
          "type": "number",
          "required": true,
          "unit": "MB/s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Backup hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sequential throughput estimate excluding scanning, compression CPU time and seek overhead."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Backup hours",
          "text": "a × 1000 ÷ b ÷ 3600"
        }
      ],
      "example_questions": [
        "Use the Backup window calculator.",
        "Help me calculate backup window."
      ],
      "retrieval_phrases": [
        "Backup window",
        "backup window"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 100
          },
          "outputs": [
            {
              "label": "Backup hours",
              "value": 1.3888888888888888
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-432",
      "name": "Backup retention storage",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Counts the explicitly retained full and incremental files. Deduplication and compression are not assumed.",
      "url": "/calculators/backup-retention-storage/",
      "version": "95fb4708474a2d9af036a18ec7b76b8001898d53dbaa33df2ae83adad83809ea",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Full backup (GB)",
          "type": "number",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Incremental backup (GB/day)",
          "type": "number",
          "required": true,
          "unit": "GB/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Full copies retained",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Incremental copies retained",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Storage (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts the explicitly retained full and incremental files. Deduplication and compression are not assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Storage (GB)",
          "text": "a × c+b × d"
        }
      ],
      "example_questions": [
        "Use the Backup retention storage calculator.",
        "Help me calculate backup retention storage."
      ],
      "retrieval_phrases": [
        "Backup retention storage",
        "backup retention storage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 5,
            "c": 4,
            "d": 24
          },
          "outputs": [
            {
              "label": "Storage (GB)",
              "value": 520
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-433",
      "name": "RAID usable capacity",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Equal-capacity drives assumed. Formatting, spares and filesystem reserves are excluded. RAID is not a backup.",
      "url": "/calculators/raid-usable-capacity/",
      "version": "ba1ac06a1930b611ca708a8beaec7586554227a1ae74d3b5c1041317cd34f4d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Drive count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Drive size (TB)",
          "type": "number",
          "required": true,
          "unit": "TB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "RAID level (0,1,5,6,10)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Nominal usable TB",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Equal-capacity drives assumed. Formatting, spares and filesystem reserves are excluded. RAID is not a backup."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Nominal usable TB",
          "text": "RAIDcapacity(a,b,c)"
        }
      ],
      "example_questions": [
        "Use the RAID usable capacity calculator.",
        "Help me calculate raid usable capacity."
      ],
      "retrieval_phrases": [
        "RAID usable capacity",
        "raid usable capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 4,
            "c": "5"
          },
          "outputs": [
            {
              "label": "Nominal usable TB",
              "value": 12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-434",
      "name": "Compression ratio",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Use matching units. Negative savings mean the compressed file is larger.",
      "url": "/calculators/compression-ratio/",
      "version": "b9ba7b30a71cdf3a848bf1ff81d323a5a2e8352cc5b4bea3821d1eb465e9322f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original size",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Compressed size",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Compression ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Space saving (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use matching units. Negative savings mean the compressed file is larger."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Compression ratio",
          "text": "a/b"
        },
        {
          "label": "Space saving (%)",
          "text": "(1−b/a) × 100. The implementation defines zero original size as 0% saving, rather than dividing by zero."
        }
      ],
      "example_questions": [
        "Use the Compression ratio calculator.",
        "Help me calculate compression ratio."
      ],
      "retrieval_phrases": [
        "Compression ratio",
        "compression ratio"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 25
          },
          "outputs": [
            {
              "label": "Compression ratio",
              "value": 4
            },
            {
              "label": "Space saving (%)",
              "value": 75
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-435",
      "name": "Subnet calculator",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Reports conventional subnet host counts, with explicit point-to-point /31 and host-route /32 handling.",
      "url": "/calculators/subnet-calculator/",
      "version": "9aebe0acd6f77846ac05abe4338708befad51cf34e6792c22e343cc5e27b95e3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "IPv4 address",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Prefix length",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Network details",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reports conventional subnet host counts, with explicit point-to-point /31 and host-route /32 handling."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Network details",
          "text": "IPv4subnet(a,b)"
        }
      ],
      "example_questions": [
        "Use the Subnet calculator calculator.",
        "Help me calculate subnet calculator."
      ],
      "retrieval_phrases": [
        "Subnet calculator",
        "subnet calculator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "192.168.1.42",
            "b": 24
          },
          "outputs": [
            {
              "label": "Network details",
              "value": "Network 192.168.1.0/24; broadcast 192.168.1.255; 254 conventional usable hosts"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-436",
      "name": "CIDR range summariser",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Returns aligned CIDR blocks exactly covering the inclusive IPv4 range.",
      "url": "/calculators/cidr-range-summariser/",
      "version": "9ce97f10c3a34a7ef0055f7a253e0ddfbc8f601ad0f616cdd531dfb430ad8cb9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First IPv4 address",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Last IPv4 address",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "CIDR blocks",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Returns aligned CIDR blocks exactly covering the inclusive IPv4 range."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "CIDR blocks",
          "text": "coverIPv4range(a,b)"
        }
      ],
      "example_questions": [
        "Use the CIDR range summariser calculator.",
        "Help me calculate cidr range summariser."
      ],
      "retrieval_phrases": [
        "CIDR range summariser",
        "cidr range summariser"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "192.168.1.0",
            "b": "192.168.1.255"
          },
          "outputs": [
            {
              "label": "CIDR blocks",
              "value": "192.168.1.0/24"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-437",
      "name": "IPv6 subnet capacity",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Counts address slots, not necessarily assignable devices. Prefixes must be 0–128.",
      "url": "/calculators/ipv6-subnet-capacity/",
      "version": "e87d2aa03db78e0a4132a79816dbd30059d0ccec1b32743b186de6f6711f9c3d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Parent prefix",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Child prefix",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Subnets",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Addresses per subnet",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts address slots, not necessarily assignable devices. Prefixes must be 0–128."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Subnets",
          "text": "2^(b−a), using exact integer arithmetic."
        },
        {
          "label": "Addresses per subnet",
          "text": "2^(128−b), using exact integer arithmetic."
        }
      ],
      "example_questions": [
        "Use the IPv6 subnet capacity calculator.",
        "Help me calculate ipv6 subnet capacity."
      ],
      "retrieval_phrases": [
        "IPv6 subnet capacity",
        "ipv6 subnet capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 48,
            "b": 64
          },
          "outputs": [
            {
              "label": "Subnets",
              "value": "65536"
            },
            {
              "label": "Addresses per subnet",
              "value": "18446744073709551616"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-438",
      "name": "Bandwidth-delay product",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Bandwidth-delay product is rate × round-trip time. It is not an automatic optimal socket-buffer setting.",
      "url": "/calculators/bandwidth-delay-product/",
      "version": "95a8dd43a64dd8a56bedeb1d42c158040f318de7b681bd1feb0ac9b568a236c9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bandwidth (Mbps)",
          "type": "number",
          "required": true,
          "unit": "Mbps",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Round-trip time (ms)",
          "type": "number",
          "required": true,
          "unit": "ms",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "In-flight bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Bandwidth-delay product is rate × round-trip time. It is not an automatic optimal socket-buffer setting."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "In-flight bytes",
          "text": "a × 1e6 × b ÷ 1000 ÷ 8"
        }
      ],
      "example_questions": [
        "Use the Bandwidth-delay product calculator.",
        "Help me calculate bandwidth-delay product."
      ],
      "retrieval_phrases": [
        "Bandwidth-delay product",
        "bandwidth delay product"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 50
          },
          "outputs": [
            {
              "label": "In-flight bytes",
              "value": 625000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-439",
      "name": "Availability downtime",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Assumes the percentage applies to the entire entered elapsed period. Contract exclusions may differ.",
      "url": "/calculators/availability-downtime/",
      "version": "ccaea6a410d5fd188ab0fcab176910eea4cc970a0aa95b9f1635bbbd46d1bef1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Availability (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Period (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Allowed downtime (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the percentage applies to the entire entered elapsed period. Contract exclusions may differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Allowed downtime (minutes)",
          "text": "(1-a ÷ 100) × b × 24 × 60"
        }
      ],
      "example_questions": [
        "Use the Availability downtime calculator.",
        "Help me calculate availability downtime."
      ],
      "retrieval_phrases": [
        "Availability downtime",
        "availability downtime"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 99.9,
            "b": 30
          },
          "outputs": [
            {
              "label": "Allowed downtime (minutes)",
              "value": 43.19999999999524
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-440",
      "name": "Serial versus parallel speedup",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Ideal Amdahl model ignoring coordination, communication and memory overhead.",
      "url": "/calculators/serial-versus-parallel-speedup/",
      "version": "1128e5b4d9bd0fdc005fa9be43254c0f7d861d89711b6305aae29a04dc090aa0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Parallelisable share (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Workers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Amdahl speedup",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Efficiency (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal Amdahl model ignoring coordination, communication and memory overhead."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Amdahl speedup",
          "text": "1 ÷ (1-a ÷ 100+a ÷ 100 ÷ b)"
        },
        {
          "label": "Efficiency (%)",
          "text": "100 ÷ (b × (1-a ÷ 100+a ÷ 100 ÷ b))"
        }
      ],
      "example_questions": [
        "Use the Serial versus parallel speedup calculator.",
        "Help me calculate serial versus parallel speedup."
      ],
      "retrieval_phrases": [
        "Serial versus parallel speedup",
        "serial versus parallel speedup"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 90,
            "b": 10
          },
          "outputs": [
            {
              "label": "Amdahl speedup",
              "value": 5.2631578947368425
            },
            {
              "label": "Efficiency (%)",
              "value": 52.63157894736843
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-441",
      "name": "Queue utilisation",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Utilisation alone does not determine waiting time. Arrival and service processes require a more specific queueing model.",
      "url": "/calculators/queue-utilisation/",
      "version": "edf1973cd999a9be927cc2bb40a153b06c203206d11bf5037fb94ae733ef0ceb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Arrival rate per second",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Service rate per server per second",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Servers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Utilisation (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Steady-state capacity status",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Utilisation alone does not determine waiting time. Arrival and service processes require a more specific queueing model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Utilisation (%)",
          "text": "a/(b × c) × 100"
        },
        {
          "label": "Steady-state capacity status",
          "text": "Compare arrivals a with nominal capacity b × c. Report below nominal capacity only when a is strictly smaller. This classification does not estimate waiting times."
        }
      ],
      "example_questions": [
        "Use the Queue utilisation calculator.",
        "Help me calculate queue utilisation."
      ],
      "retrieval_phrases": [
        "Queue utilisation",
        "queue utilisation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 10,
            "c": 1
          },
          "outputs": [
            {
              "label": "Utilisation (%)",
              "value": 50
            },
            {
              "label": "Steady-state capacity status",
              "value": "Below nominal capacity"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-442",
      "name": "API usage cost",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Linear price only. Tiering, minimum charges and metered request differences must be handled separately.",
      "url": "/calculators/api-usage-cost/",
      "version": "fa802e13ec1394b504e80db6aaeec025154f642df8693830e72f9b98da31e434",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Requests",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Price per 1000 (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fixed charge (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated API bill (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Linear price only. Tiering, minimum charges and metered request differences must be handled separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated API bill (£)",
          "text": "a ÷ 1000 × b+c"
        }
      ],
      "example_questions": [
        "Use the API usage cost calculator.",
        "Help me calculate api usage cost."
      ],
      "retrieval_phrases": [
        "API usage cost",
        "api usage cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100000,
            "b": 0.02,
            "c": 5
          },
          "outputs": [
            {
              "label": "Estimated API bill (£)",
              "value": 7
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-443",
      "name": "Cloud storage cost",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Enter provider prices. No current cloud pricing is bundled or fetched.",
      "url": "/calculators/cloud-storage-cost/",
      "version": "f3ad95aac74170a505ebece59153f2b5580cc0db4254b63611ad267e35bb4cfe",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Stored GB",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Storage (£/GB-month)",
          "type": "number",
          "required": true,
          "unit": "GBP/GB-month",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Egress GB",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Egress (£/GB)",
          "type": "number",
          "required": true,
          "unit": "GBP/GB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Other monthly charges (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly estimate (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter provider prices. No current cloud pricing is bundled or fetched."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly estimate (£)",
          "text": "a × b+c × d+e"
        }
      ],
      "example_questions": [
        "Use the Cloud storage cost calculator.",
        "Help me calculate cloud storage cost."
      ],
      "retrieval_phrases": [
        "Cloud storage cost",
        "cloud storage cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 0.02,
            "c": 100,
            "d": 0.05,
            "e": 2
          },
          "outputs": [
            {
              "label": "Monthly estimate (£)",
              "value": 27
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-444",
      "name": "Server energy cost",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Interpolates mean power between idle and load. Cooling and power-supply losses must already be included in measured power if relevant.",
      "url": "/calculators/server-energy-cost/",
      "version": "5ffc19ed04af94295151191b0d9e97a4356773fd88cd454f49fdea98b78e12c2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Idle power (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Loaded power (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Loaded share (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Electricity cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Interpolates mean power between idle and load. Cooling and power-supply losses must already be included in measured power if relevant."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Electricity cost (£)",
          "text": "(a+(b-a) × c ÷ 100) ÷ 1000 × d × e"
        }
      ],
      "example_questions": [
        "Use the Server energy cost calculator.",
        "Help me calculate server energy cost."
      ],
      "retrieval_phrases": [
        "Server energy cost",
        "server energy cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 500,
            "c": 50,
            "d": 720,
            "e": 0.25
          },
          "outputs": [
            {
              "label": "Electricity cost (£)",
              "value": 54
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-445",
      "name": "Log storage growth",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Retained fraction of 50% means compressed data is half the original size. Indexing and replica overhead are excluded.",
      "url": "/calculators/log-storage-growth/",
      "version": "1444d28e1a81b70960cff5d2493df6ffac2ab321b9fac17b153cee398ba525b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Events per second",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bytes per event",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Compression retained fraction (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retention days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Retained storage (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Retained fraction of 50% means compressed data is half the original size. Indexing and replica overhead are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Retained storage (GB)",
          "text": "a × b × c ÷ 100 × d × 86400 ÷ 1e9"
        }
      ],
      "example_questions": [
        "Use the Log storage growth calculator.",
        "Help me calculate log storage growth."
      ],
      "retrieval_phrases": [
        "Log storage growth",
        "log storage growth"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 500,
            "c": 50,
            "d": 30
          },
          "outputs": [
            {
              "label": "Retained storage (GB)",
              "value": 64.8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-446",
      "name": "Image archive capacity",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Decimal units. Thumbnail, metadata and filesystem overhead are not included.",
      "url": "/calculators/image-archive-capacity/",
      "version": "d777f50d1653818c8af09c1f77fd6350e2f620efc1f64a0f81b4d28e553beafd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Image count",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Average size (MB)",
          "type": "number",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Versions per image",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Copies",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Storage (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Decimal units. Thumbnail, metadata and filesystem overhead are not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Storage (GB)",
          "text": "a × b × c × d ÷ 1000"
        }
      ],
      "example_questions": [
        "Use the Image archive capacity calculator.",
        "Help me calculate image archive capacity."
      ],
      "retrieval_phrases": [
        "Image archive capacity",
        "image archive capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 5,
            "c": 2,
            "d": 2
          },
          "outputs": [
            {
              "label": "Storage (GB)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-447",
      "name": "Video surveillance storage",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Uses constant bitrate and the entered recording schedule. Variable bitrate and motion detection can change storage.",
      "url": "/calculators/video-surveillance-storage/",
      "version": "715c804d0d88a1b6247f849f793cef68d22816f51f95c217b9b8149fe658b267",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Camera count",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bitrate each (Mbps)",
          "type": "number",
          "required": true,
          "unit": "Mbps",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recording hours/day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retention days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Video storage (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses constant bitrate and the entered recording schedule. Variable bitrate and motion detection can change storage."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Video storage (GB)",
          "text": "a × b × 1e6 ÷ 8 × c × 3600 × d ÷ 1e9"
        }
      ],
      "example_questions": [
        "Use the Video surveillance storage calculator.",
        "Help me calculate video surveillance storage."
      ],
      "retrieval_phrases": [
        "Video surveillance storage",
        "video surveillance storage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 4,
            "c": 24,
            "d": 7
          },
          "outputs": [
            {
              "label": "Video storage (GB)",
              "value": 1209.6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-448",
      "name": "Password search space",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Assumes uniformly random characters and exhaustive search. Human passwords, stolen hashes and attack costs can invalidate this simplistic comparison.",
      "url": "/calculators/password-search-space/",
      "version": "0dda7d3dace7ac94b1662a8a782c60e1ffd15eb5a42b394e8e6d27c8217575c9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Alphabet size",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Password length",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Guesses per second",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Possible strings",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Worst-case ideal search seconds",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes uniformly random characters and exhaustive search. Human passwords, stolen hashes and attack costs can invalidate this simplistic comparison."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Possible strings",
          "text": "a^b, using exact integer arithmetic."
        },
        {
          "label": "Worst-case ideal search seconds",
          "text": "a^b/c, using a floating-point estimate of search time."
        }
      ],
      "example_questions": [
        "Use the Password search space calculator.",
        "Help me calculate password search space."
      ],
      "retrieval_phrases": [
        "Password search space",
        "password search space"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 26,
            "b": 8,
            "c": 1000
          },
          "outputs": [
            {
              "label": "Possible strings",
              "value": "208827064576"
            },
            {
              "label": "Worst-case ideal search seconds",
              "value": 208827064.576
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-449",
      "name": "Hash collision probability",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Birthday approximation for independent uniform hashes. This is accidental collision probability, not an adversarial security analysis.",
      "url": "/calculators/hash-collision-probability/",
      "version": "6e57cd8b735230d626b3212160572a196fd3d949585ac98d9df6e8efaeb17ec4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Hash bits",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Items",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Approximate collision probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Birthday approximation for independent uniform hashes. This is accidental collision probability, not an adversarial security analysis."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Approximate collision probability",
          "text": "-expMinusOne(-b × (b-1) ÷ (2 × 2^a))"
        }
      ],
      "example_questions": [
        "Use the Hash collision probability calculator.",
        "Help me calculate hash collision probability."
      ],
      "retrieval_phrases": [
        "Hash collision probability",
        "hash collision probability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 64,
            "b": 1000000
          },
          "outputs": [
            {
              "label": "Approximate collision probability",
              "value": 2.7105026839742053e-8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-450",
      "name": "Rate-limit capacity",
      "category": "Computing and data",
      "status": "available",
      "purpose": "Conservative full-window capacity estimate. Actual completion may occur earlier within the final window; burst and sliding-window rules differ.",
      "url": "/calculators/rate-limit-capacity/",
      "version": "7c94bad3dfc170d25e17866dea9a409ec33fed736b1ed1ef9879db67cdd2c602",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Requests needed",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Requests per window",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Window seconds",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Minimum complete-window duration (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Conservative full-window capacity estimate. Actual completion may occur earlier within the final window; burst and sliding-window rules differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Minimum complete-window duration (s)",
          "text": "roundUp(a ÷ b) × c"
        }
      ],
      "example_questions": [
        "Use the Rate-limit capacity calculator.",
        "Help me calculate rate-limit capacity."
      ],
      "retrieval_phrases": [
        "Rate-limit capacity",
        "rate limit capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 100,
            "c": 60
          },
          "outputs": [
            {
              "label": "Minimum complete-window duration (s)",
              "value": 600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-451",
      "name": "Aspect ratio",
      "category": "Design and media",
      "status": "available",
      "purpose": "Integer pixel dimensions are reduced by their greatest common divisor.",
      "url": "/calculators/aspect-ratio/",
      "version": "923d8f7aa6f7b4e2222bfdc9fbc19949b479b8337c5c5d796d7ce603a8fbda17",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Width",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Height",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Aspect ratio",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Decimal ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Integer pixel dimensions are reduced by their greatest common divisor."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Aspect ratio",
          "text": "Let g be the greatest common divisor of a and b. Return (a/g):(b/g)."
        },
        {
          "label": "Decimal ratio",
          "text": "a/b"
        }
      ],
      "example_questions": [
        "Use the Aspect ratio calculator.",
        "Help me calculate aspect ratio."
      ],
      "retrieval_phrases": [
        "Aspect ratio",
        "aspect ratio"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1920,
            "b": 1080
          },
          "outputs": [
            {
              "label": "Aspect ratio",
              "value": "16:9"
            },
            {
              "label": "Decimal ratio",
              "value": 1.7777777777777777
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-452",
      "name": "Image resize",
      "category": "Design and media",
      "status": "available",
      "purpose": "Preserves aspect ratio using a target width; height rounds to the nearest pixel. No image file is resized by this calculator.",
      "url": "/calculators/image-resize/",
      "version": "c4361ba9e8d14e87ea4fb6b4e215d6ac5631ec39dff316b6cc7d065e84e3b67e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original width (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Original height (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Target width (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Scaled height (px)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Scale (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Preserves aspect ratio using a target width; height rounds to the nearest pixel. No image file is resized by this calculator."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Scaled height (px)",
          "text": "round(c × b ÷ a)"
        },
        {
          "label": "Scale (%)",
          "text": "c ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Image resize calculator.",
        "Help me calculate image resize."
      ],
      "retrieval_phrases": [
        "Image resize",
        "image resize"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1920,
            "b": 1080,
            "c": 960
          },
          "outputs": [
            {
              "label": "Scaled height (px)",
              "value": 540
            },
            {
              "label": "Scale (%)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-453",
      "name": "Print resolution",
      "category": "Design and media",
      "status": "available",
      "purpose": "Pixels per inch depends on print size. It is distinct from printer dot resolution.",
      "url": "/calculators/print-resolution/",
      "version": "e652bd50dfb268072392d8ecdf9e4bc34a5b42f6fbd03c700aa0e3f476d403c5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pixel width",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Print width (inches)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Resolution (ppi)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Pixels per inch depends on print size. It is distinct from printer dot resolution."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Resolution (ppi)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Print resolution calculator.",
        "Help me calculate print resolution."
      ],
      "retrieval_phrases": [
        "Print resolution",
        "print resolution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3000,
            "b": 10
          },
          "outputs": [
            {
              "label": "Resolution (ppi)",
              "value": 300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-454",
      "name": "Screen pixel density",
      "category": "Design and media",
      "status": "available",
      "purpose": "Assumes square pixels and uses the physical diagonal.",
      "url": "/calculators/screen-pixel-density/",
      "version": "6f9bf2b9cfb8c9e8c90f1a5e5de4f9d73a25e368694de0a1677b403767b73af8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Horizontal pixels",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Vertical pixels",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Diagonal (inches)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pixel density (ppi)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes square pixels and uses the physical diagonal."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pixel density (ppi)",
          "text": "hypot(a,b) ÷ c"
        }
      ],
      "example_questions": [
        "Use the Screen pixel density calculator.",
        "Help me calculate screen pixel density."
      ],
      "retrieval_phrases": [
        "Screen pixel density",
        "screen pixel density"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1920,
            "b": 1080,
            "c": 24
          },
          "outputs": [
            {
              "label": "Pixel density (ppi)",
              "value": 91.7877987534291
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-455",
      "name": "Video file size",
      "category": "Design and media",
      "status": "available",
      "purpose": "Decimal MB, excluding container overhead and bitrate variation.",
      "url": "/calculators/video-file-size/",
      "version": "893b5459d636b2d56891b673c69fde53b8a97f8a833128d09bc68aba5624a0a5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Video bitrate (Mbps)",
          "type": "number",
          "required": true,
          "unit": "Mbps",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Audio bitrate (kbps)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated size (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Decimal MB, excluding container overhead and bitrate variation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated size (MB)",
          "text": "(a × 1e6+b × 1000) ÷ 8 × c × 60 ÷ 1e6"
        }
      ],
      "example_questions": [
        "Use the Video file size calculator.",
        "Help me calculate video file size."
      ],
      "retrieval_phrases": [
        "Video file size",
        "video file size"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 8,
            "b": 128,
            "c": 10
          },
          "outputs": [
            {
              "label": "Estimated size (MB)",
              "value": 609.6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-456",
      "name": "Video bitrate target",
      "category": "Design and media",
      "status": "available",
      "purpose": "Reserves the entered audio bitrate. Container overhead needs an additional margin.",
      "url": "/calculators/video-bitrate-target/",
      "version": "417edcfcc8033c747ae00aa61993bcd48ca58c2e84e13c80d711886242ff397f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target size (MB)",
          "type": "number",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Audio bitrate (kbps)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Video bitrate budget (Mbps)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reserves the entered audio bitrate. Container overhead needs an additional margin."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Video bitrate budget (Mbps)",
          "text": "a × 1e6 × 8 ÷ (b × 60) ÷ 1e6-c ÷ 1000"
        }
      ],
      "example_questions": [
        "Use the Video bitrate target calculator.",
        "Help me calculate video bitrate target."
      ],
      "retrieval_phrases": [
        "Video bitrate target",
        "video bitrate target"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 5,
            "c": 128
          },
          "outputs": [
            {
              "label": "Video bitrate budget (Mbps)",
              "value": 2.5386666666666664
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-457",
      "name": "Audio file size",
      "category": "Design and media",
      "status": "available",
      "purpose": "Linear PCM payload only, excluding file headers and metadata.",
      "url": "/calculators/audio-file-size/",
      "version": "fa40d45a57f96fdc2ae817572f2e1c2ae1f1af7747557e90c96be40f37959173",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sample rate (Hz)",
          "type": "number",
          "required": true,
          "unit": "Hz",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bit depth",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Channels",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Uncompressed size (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Linear PCM payload only, excluding file headers and metadata."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Uncompressed size (MB)",
          "text": "a × b × c × d × 60 ÷ 8 ÷ 1e6"
        }
      ],
      "example_questions": [
        "Use the Audio file size calculator.",
        "Help me calculate audio file size."
      ],
      "retrieval_phrases": [
        "Audio file size",
        "audio file size"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 48000,
            "b": 24,
            "c": 2,
            "d": 1
          },
          "outputs": [
            {
              "label": "Uncompressed size (MB)",
              "value": 17.28
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-458",
      "name": "Audio sample duration",
      "category": "Design and media",
      "status": "available",
      "purpose": "Sample count is per channel; adding channels does not increase duration.",
      "url": "/calculators/audio-sample-duration/",
      "version": "de7cea3fbad678c3a977ae2c1dbb3d3aa1ab3eca87869ccdcd8134d87ae04788",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Samples per channel",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sample rate (Hz)",
          "type": "number",
          "required": true,
          "unit": "Hz",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Duration (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sample count is per channel; adding channels does not increase duration."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Duration (seconds)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Audio sample duration calculator.",
        "Help me calculate audio sample duration."
      ],
      "retrieval_phrases": [
        "Audio sample duration",
        "audio sample duration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 48000,
            "b": 48000
          },
          "outputs": [
            {
              "label": "Duration (seconds)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-459",
      "name": "Frame count and duration",
      "category": "Design and media",
      "status": "available",
      "purpose": "Constant frame rate. Variable-frame-rate recordings need their actual timestamps.",
      "url": "/calculators/frame-count-and-duration/",
      "version": "8b99cbf5d9ccf680d90484901b5049496dd9d6873c1aaa8e209d368ae0dc3a42",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Frame count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Frames per second",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Duration (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant frame rate. Variable-frame-rate recordings need their actual timestamps."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Duration (seconds)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Frame count and duration calculator.",
        "Help me calculate frame count and duration."
      ],
      "retrieval_phrases": [
        "Frame count and duration",
        "frame count and duration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 30
          },
          "outputs": [
            {
              "label": "Duration (seconds)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-460",
      "name": "Video timecode converter",
      "category": "Design and media",
      "status": "available",
      "purpose": "Non-drop-frame integer-rate timecode only. 29.97/59.94 drop-frame conventions are not supported in this version.",
      "url": "/calculators/video-timecode-converter/",
      "version": "97af1e17d3e7a22567be21e54b4156ea4312194737f34c667166f26a3049539e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Timecode HH:MM:SS:FF",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Integer frame rate",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Frame count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Non-drop-frame integer-rate timecode only. 29.97/59.94 drop-frame conventions are not supported in this version."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Frame count",
          "text": "timecodeFrames(a,b)"
        }
      ],
      "example_questions": [
        "Use the Video timecode converter calculator.",
        "Help me calculate video timecode converter."
      ],
      "retrieval_phrases": [
        "Video timecode converter",
        "video timecode converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "00:01:00:00",
            "b": 30
          },
          "outputs": [
            {
              "label": "Frame count",
              "value": 1800
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-461",
      "name": "Slow-motion speed",
      "category": "Design and media",
      "status": "available",
      "purpose": "Assumes every captured frame is retained and played at the target constant rate.",
      "url": "/calculators/slow-motion-speed/",
      "version": "43fe4583d6947384157da151ef2bbdbcabe85944e2a6c6f0408c430eef3b1ca1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Capture frame rate",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Playback frame rate",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recorded seconds",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Playback speed (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Playback duration (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes every captured frame is retained and played at the target constant rate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Playback speed (%)",
          "text": "b/a × 100"
        },
        {
          "label": "Playback duration (s)",
          "text": "c × a/b."
        }
      ],
      "example_questions": [
        "Use the Slow-motion speed calculator.",
        "Help me calculate slow-motion speed."
      ],
      "retrieval_phrases": [
        "Slow-motion speed",
        "slow motion speed"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 30,
            "c": 10
          },
          "outputs": [
            {
              "label": "Playback speed (%)",
              "value": 25
            },
            {
              "label": "Playback duration (s)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-462",
      "name": "Timelapse planner",
      "category": "Design and media",
      "status": "available",
      "purpose": "Counts captures at one interval through the event duration; no extra capture at time zero is included.",
      "url": "/calculators/timelapse-planner/",
      "version": "a7fdadef205c9cf87a9a76cb4a1c0c2b8a86236b3f9fc02bbfce8ef14d1d7ecb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Event duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Capture interval (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Playback fps",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Frames",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Final duration (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts captures at one interval through the event duration; no extra capture at time zero is included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Frames",
          "text": "floor(a × 60 ÷ b)"
        },
        {
          "label": "Final duration (s)",
          "text": "floor(a × 60 ÷ b) ÷ c"
        }
      ],
      "example_questions": [
        "Use the Timelapse planner calculator.",
        "Help me calculate timelapse planner."
      ],
      "retrieval_phrases": [
        "Timelapse planner",
        "timelapse planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 5,
            "c": 30
          },
          "outputs": [
            {
              "label": "Frames",
              "value": 720
            },
            {
              "label": "Final duration (s)",
              "value": 24
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-463",
      "name": "Photo exposure equivalent",
      "category": "Design and media",
      "status": "available",
      "purpose": "Assumes reciprocity and equal scene brightness. Real lens transmission and sensor behaviour can vary.",
      "url": "/calculators/photo-exposure-equivalent/",
      "version": "8af772f5a189be8f8a320b2c19759f7983dd592e901ad9d28ab5eeb32d5b265f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original exposure time (s)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Original f-number",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "New f-number",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Original ISO",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "New ISO",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Equivalent exposure time (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes reciprocity and equal scene brightness. Real lens transmission and sensor behaviour can vary."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Equivalent exposure time (s)",
          "text": "a × (c ÷ b)^2 × (d ÷ e)"
        }
      ],
      "example_questions": [
        "Use the Photo exposure equivalent calculator.",
        "Help me calculate photo exposure equivalent."
      ],
      "retrieval_phrases": [
        "Photo exposure equivalent",
        "photo exposure equivalent"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.01,
            "b": 4,
            "c": 5.6,
            "d": 100,
            "e": 100
          },
          "outputs": [
            {
              "label": "Equivalent exposure time (s)",
              "value": 0.0196
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-464",
      "name": "Depth of field",
      "category": "Design and media",
      "status": "available",
      "purpose": "Thin-lens geometric approximation. Circle of confusion is your output/viewing assumption.",
      "url": "/calculators/depth-of-field/",
      "version": "22554472f9b64b8b278fd8f2d3c1c7bac9abc390329d0ef21cf95c99da9fa790",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Focal length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Aperture f-number",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Focus distance (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Circle of confusion (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hyperfocal (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Near limit (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Far limit (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Thin-lens geometric approximation. Circle of confusion is your output/viewing assumption."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hyperfocal (m)",
          "text": "Let H = a²/(b × d)+a in millimetres. Hyperfocal in metres = H/1000."
        },
        {
          "label": "Near limit (m)",
          "text": "Let s = 1000c in millimetres. Near limit = H × s/(H+s−a)/1000 metres."
        },
        {
          "label": "Far limit (m)",
          "text": "When H ≤ s−a, report Infinity. Otherwise far limit = H × s/(H−s+a)/1000 metres."
        }
      ],
      "example_questions": [
        "Use the Depth of field calculator.",
        "Help me calculate depth of field."
      ],
      "retrieval_phrases": [
        "Depth of field",
        "depth of field"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 8,
            "c": 5,
            "d": 0.03
          },
          "outputs": [
            {
              "label": "Hyperfocal (m)",
              "value": 10.466666666666669
            },
            {
              "label": "Near limit (m)",
              "value": 3.3945945945945946
            },
            {
              "label": "Far limit (m)",
              "value": 9.486404833836856
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-465",
      "name": "Lens field of view",
      "category": "Design and media",
      "status": "available",
      "purpose": "Rectilinear lens focused at infinity. Fisheye lenses and focus breathing do not follow this simple model.",
      "url": "/calculators/lens-field-of-view/",
      "version": "bba6cb6f2f2d308a0a693fd6d0d88aa7687dd8aed58b189e646b9bf281061275",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Focal length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sensor width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sensor height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Horizontal FOV (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Vertical FOV (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rectilinear lens focused at infinity. Fisheye lenses and focus breathing do not follow this simple model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Horizontal FOV (degrees)",
          "text": "2 × atan(b ÷ (2 × a)) × 180 ÷ π"
        },
        {
          "label": "Vertical FOV (degrees)",
          "text": "2 × atan(c ÷ (2 × a)) × 180 ÷ π"
        }
      ],
      "example_questions": [
        "Use the Lens field of view calculator.",
        "Help me calculate lens field of view."
      ],
      "retrieval_phrases": [
        "Lens field of view",
        "lens field of view"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 36,
            "c": 24
          },
          "outputs": [
            {
              "label": "Horizontal FOV (degrees)",
              "value": 39.59775270904986
            },
            {
              "label": "Vertical FOV (degrees)",
              "value": 26.991466561591626
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-466",
      "name": "Crop factor equivalent",
      "category": "Design and media",
      "status": "available",
      "purpose": "Equivalent field of view only. This does not change the lens’s actual focal length.",
      "url": "/calculators/crop-factor-equivalent/",
      "version": "cd2be63176dd484bb671cb76aa0d30e5630127cc5fd5e79d73fbfc6699ed5a78",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Focal length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Crop factor",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "35 mm equivalent focal length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Equivalent field of view only. This does not change the lens’s actual focal length."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "35 mm equivalent focal length (mm)",
          "text": "a × b"
        }
      ],
      "example_questions": [
        "Use the Crop factor equivalent calculator.",
        "Help me calculate crop factor equivalent."
      ],
      "retrieval_phrases": [
        "Crop factor equivalent",
        "crop factor equivalent"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 35,
            "b": 1.5
          },
          "outputs": [
            {
              "label": "35 mm equivalent focal length (mm)",
              "value": 52.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-467",
      "name": "Image bleed dimensions",
      "category": "Design and media",
      "status": "available",
      "purpose": "Bleed extends beyond all four trim edges; printer marks and additional safe margins are separate.",
      "url": "/calculators/image-bleed-dimensions/",
      "version": "3e46007e047a1685346da60db3be3be9620045921f8620a5cae83a7375d094da",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Trim width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Trim height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bleed per side (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Resolution (ppi)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Canvas width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Canvas height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Pixel width",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Pixel height",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Bleed extends beyond all four trim edges; printer marks and additional safe margins are separate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Canvas width (mm)",
          "text": "a+2 × c"
        },
        {
          "label": "Canvas height (mm)",
          "text": "b+2 × c"
        },
        {
          "label": "Pixel width",
          "text": "roundUp((a+2 × c) ÷ 25.4 × d)"
        },
        {
          "label": "Pixel height",
          "text": "roundUp((b+2 × c) ÷ 25.4 × d)"
        }
      ],
      "example_questions": [
        "Use the Image bleed dimensions calculator.",
        "Help me calculate image bleed dimensions."
      ],
      "retrieval_phrases": [
        "Image bleed dimensions",
        "image bleed dimensions"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 210,
            "b": 297,
            "c": 3,
            "d": 300
          },
          "outputs": [
            {
              "label": "Canvas width (mm)",
              "value": 216
            },
            {
              "label": "Canvas height (mm)",
              "value": 303
            },
            {
              "label": "Pixel width",
              "value": 2552
            },
            {
              "label": "Pixel height",
              "value": 3579
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-468",
      "name": "Poster tiling",
      "category": "Design and media",
      "status": "available",
      "purpose": "Uses one fixed sheet orientation and equal overlap between adjacent sheets. No rotation optimisation.",
      "url": "/calculators/poster-tiling/",
      "version": "17ec714c5c0e0fb59a30786f10b346fc4de1fc1ddf2c4416cf3c79b26e4386db",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Artwork width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Artwork height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Usable sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Usable sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Overlap (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sheet count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses one fixed sheet orientation and equal overlap between adjacent sheets. No rotation optimisation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sheet count",
          "text": "max(1,roundUp((a-e) ÷ (c-e))) × max(1,roundUp((b-e) ÷ (d-e)))"
        }
      ],
      "example_questions": [
        "Use the Poster tiling calculator.",
        "Help me calculate poster tiling."
      ],
      "retrieval_phrases": [
        "Poster tiling",
        "poster tiling"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 700,
            "c": 200,
            "d": 280,
            "e": 10
          },
          "outputs": [
            {
              "label": "Sheet count",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-469",
      "name": "Typography scale",
      "category": "Design and media",
      "status": "available",
      "purpose": "Starts at the base size and multiplies by the scale ratio for each subsequent step.",
      "url": "/calculators/typography-scale/",
      "version": "9efa0028f15fccbc769c0b4d0505400f71130468dd6bbba8612f379cbf4fc3a1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Base font size (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Scale ratio",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Steps",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Type sizes (px)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Starts at the base size and multiplies by the scale ratio for each subsequent step."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Type sizes (px)",
          "text": "For each step i starting at 0 and ending at c−1, size = a × b^i. Round each generated size to three decimal places."
        }
      ],
      "example_questions": [
        "Use the Typography scale calculator.",
        "Help me calculate typography scale."
      ],
      "retrieval_phrases": [
        "Typography scale",
        "typography scale"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 16,
            "b": 1.25,
            "c": 5
          },
          "outputs": [
            {
              "label": "Type sizes (px)",
              "value": "16, 20, 25, 31.25, 39.063"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-470",
      "name": "Line-height calculator",
      "category": "Design and media",
      "status": "available",
      "purpose": "This is the combined line-box height; margins, padding and font-specific ink bounds are not included.",
      "url": "/calculators/line-height-calculator/",
      "version": "ccc017c0455684f5246b2a3dff2708c5879c0719751bff076f33a5170e046ac5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Font size (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Line-height multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Lines",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Line height (px)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Line-box height (px)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This is the combined line-box height; margins, padding and font-specific ink bounds are not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Line height (px)",
          "text": "a × b"
        },
        {
          "label": "Line-box height (px)",
          "text": "a × b × c"
        }
      ],
      "example_questions": [
        "Use the Line-height calculator calculator.",
        "Help me calculate line-height calculator."
      ],
      "retrieval_phrases": [
        "Line-height calculator",
        "line height calculator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 16,
            "b": 1.5,
            "c": 5
          },
          "outputs": [
            {
              "label": "Line height (px)",
              "value": 24
            },
            {
              "label": "Line-box height (px)",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-471",
      "name": "Responsive clamp builder",
      "category": "Design and media",
      "status": "available",
      "purpose": "Linear interpolation in viewport width, clamped at the chosen endpoints.",
      "url": "/calculators/responsive-clamp-builder/",
      "version": "b9fa6ec6c79fac4d6d7ae6b3324ece3fcc1ae58ef1931a33cb12e35562e38ab6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Minimum size (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Maximum size (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Minimum viewport (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Maximum viewport (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "CSS expression",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Linear interpolation in viewport width, clamped at the chosen endpoints."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "CSS expression",
          "text": "fluidSizeCSS(a,b,c,d)"
        }
      ],
      "example_questions": [
        "Use the Responsive clamp builder calculator.",
        "Help me calculate responsive clamp builder."
      ],
      "retrieval_phrases": [
        "Responsive clamp builder",
        "responsive clamp builder"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 16,
            "b": 24,
            "c": 320,
            "d": 1280
          },
          "outputs": [
            {
              "label": "CSS expression",
              "value": "clamp(16px, calc(13.333333px + 0.833333vw), 24px)"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-472",
      "name": "Grid column widths",
      "category": "Design and media",
      "status": "available",
      "purpose": "Container width includes outer margins. Negative available width is rejected.",
      "url": "/calculators/grid-column-widths/",
      "version": "869a53a9fb2473803c4f0e8287bd566e49c3ff988ce0484aef2c1b0104de0d1b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Container width (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Margin each side (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Columns",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Gutter (px)",
          "type": "number",
          "required": true,
          "unit": "px",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Column width (px)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Container width includes outer margins. Negative available width is rejected."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Column width (px)",
          "text": "(a-2 × b-(c-1) × d) ÷ c"
        }
      ],
      "example_questions": [
        "Use the Grid column widths calculator.",
        "Help me calculate grid column widths."
      ],
      "retrieval_phrases": [
        "Grid column widths",
        "grid column widths"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1200,
            "b": 20,
            "c": 12,
            "d": 20
          },
          "outputs": [
            {
              "label": "Column width (px)",
              "value": 78.33333333333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-473",
      "name": "Colour contrast",
      "category": "Design and media",
      "status": "available",
      "purpose": "WCAG relative-luminance contrast for opaque sRGB colours. This checks contrast only, not full accessibility conformance.",
      "url": "/calculators/colour-contrast/",
      "version": "0e960453428451fae4dd99852d462c38f9c7fe511f7487b2ee4c2aeeaab2bc50",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Foreground HEX",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Background HEX",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Contrast ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Normal-text AA",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "WCAG relative-luminance contrast for opaque sRGB colours. This checks contrast only, not full accessibility conformance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Contrast ratio",
          "text": "Use the relative-luminance contrast calculation below."
        },
        {
          "label": "Normal-text AA",
          "text": "Pass when the unrounded contrast ratio is at least 4.5; otherwise Fail. This is the normal-text AA contrast threshold only."
        }
      ],
      "example_questions": [
        "Use the Colour contrast calculator.",
        "Help me calculate colour contrast."
      ],
      "retrieval_phrases": [
        "Colour contrast",
        "colour contrast"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "#000000",
            "b": "#ffffff"
          },
          "outputs": [
            {
              "label": "Contrast ratio",
              "value": 21
            },
            {
              "label": "Normal-text AA",
              "value": "Pass"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-474",
      "name": "Colour format converter",
      "category": "Design and media",
      "status": "available",
      "purpose": "Converts opaque three- or six-digit HEX into sRGB channel values and HSL. No ICC profile conversion is performed.",
      "url": "/calculators/colour-format-converter/",
      "version": "ad812b071c0305e3ecb857174d5cc79832db58d3078b95aebf547b1c935324e3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "HEX colour",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "RGB and HSL",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Converts opaque three- or six-digit HEX into sRGB channel values and HSL. No ICC profile conversion is performed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "RGB and HSL",
          "text": "HEXtoRGBandHSL(a)"
        }
      ],
      "example_questions": [
        "Use the Colour format converter calculator.",
        "Help me calculate colour format converter."
      ],
      "retrieval_phrases": [
        "Colour format converter",
        "colour format converter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "#ff0000"
          },
          "outputs": [
            {
              "label": "RGB and HSL",
              "value": "rgb(255, 0, 0); hsl(0, 100%, 50%)"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-475",
      "name": "BPM delay timing",
      "category": "Design and media",
      "status": "available",
      "purpose": "Straight note values. A dotted value multiplies this duration by 1.5; a triplet value multiplies by 2/3.",
      "url": "/calculators/bpm-delay-timing/",
      "version": "4a856de37055b384c1915d1436d84ca15e48e19725de3a9cbf25ac1c732b90ac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Tempo (BPM)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Note denominator (4 = quarter)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Delay time (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Straight note values. A dotted value multiplies this duration by 1.5; a triplet value multiplies by 2/3."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Delay time (ms)",
          "text": "60000 ÷ a × 4 ÷ b"
        }
      ],
      "example_questions": [
        "Use the BPM delay timing calculator.",
        "Help me calculate bpm delay timing."
      ],
      "retrieval_phrases": [
        "BPM delay timing",
        "bpm delay timing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 4
          },
          "outputs": [
            {
              "label": "Delay time (ms)",
              "value": 500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Independent reference calculations; input bounds; unit and rounding checks; browser and accessibility QA.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-506",
      "name": "Fabric shrinkage allowance",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Divide each finished dimension by its retained fraction. Shrinkage is measured relative to the original dimension; test your own fabric. Seam allowances must already be included in the desired finished dimensions.",
      "url": "/calculators/fabric-shrinkage-allowance/",
      "version": "55424722bf83049776ee902522d756c4c4f66495264fdccc0f2565a013d5835e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Finished width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Finished length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Width shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Length shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cut width (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cut length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Divide each finished dimension by its retained fraction. Shrinkage is measured relative to the original dimension; test your own fabric. Seam allowances must already be included in the desired finished dimensions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cut width (cm)",
          "text": "a ÷ (1-c ÷ 100)"
        },
        {
          "label": "Cut length (cm)",
          "text": "b ÷ (1-d ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Fabric shrinkage allowance calculator.",
        "Help me calculate fabric shrinkage allowance."
      ],
      "retrieval_phrases": [
        "Fabric shrinkage allowance",
        "fabric shrinkage allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 90,
            "b": 180,
            "c": 10,
            "d": 10
          },
          "outputs": [
            {
              "label": "Cut width (cm)",
              "value": 100
            },
            {
              "label": "Cut length (cm)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-508",
      "name": "Pattern repeat fabric allowance",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Start the first panel at the chosen motif. Each rounds every cut to a full repeat; shared rounds all but the final cut, whose trailing repeat is unnecessary. Initial motif positioning, hems and offcuts are separate.",
      "url": "/calculators/pattern-repeat-fabric-allowance/",
      "version": "2bcb4a1fd3fa70f1126f7e7e0babe513cd68db269aa698bcab4688f129c08f01",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Panel cut lengths (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Pattern repeat (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Matching policy (each or shared)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fabric length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Extra alignment fabric (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Start the first panel at the chosen motif. Each rounds every cut to a full repeat; shared rounds all but the final cut, whose trailing repeat is unnecessary. Initial motif positioning, hems and offcuts are separate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fabric length (cm)",
          "text": "Round each cut up to a multiple of b. In shared mode, keep the final cut at its actual length. Add those lengths."
        },
        {
          "label": "Extra alignment fabric (cm)",
          "text": "Calculated fabric length minus the sum of actual cut lengths."
        }
      ],
      "example_questions": [
        "Use the Pattern repeat fabric allowance calculator.",
        "Help me calculate pattern repeat fabric allowance."
      ],
      "retrieval_phrases": [
        "Pattern repeat fabric allowance",
        "pattern repeat fabric allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,100",
            "b": 30,
            "c": "shared"
          },
          "outputs": [
            {
              "label": "Fabric length (cm)",
              "value": 220
            },
            {
              "label": "Extra alignment fabric (cm)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-511",
      "name": "Elastic waistband cut",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "The reduction is your chosen fit allowance, not a universal elastic stretch recommendation. Add the overlap once. Check fit with the actual elastic.",
      "url": "/calculators/elastic-waistband-cut/",
      "version": "8e4f548133033d60ea5384cba476bc5dee22e5251afc723afe09215856cd510c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Body circumference (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Reduction from body (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overlap (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Elastic cut length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The reduction is your chosen fit allowance, not a universal elastic stretch recommendation. Add the overlap once. Check fit with the actual elastic."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Elastic cut length (cm)",
          "text": "a × (1-b ÷ 100)+c"
        }
      ],
      "example_questions": [
        "Use the Elastic waistband cut calculator.",
        "Help me calculate elastic waistband cut."
      ],
      "retrieval_phrases": [
        "Elastic waistband cut",
        "elastic waistband cut"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Elastic cut length (cm)",
              "value": 74
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-512",
      "name": "Buttonhole placement",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Positions refer to buttonhole centres measured from the placket top. At least two buttons are required. This gives equal spacing, not a garment-specific stress-point layout.",
      "url": "/calculators/buttonhole-placement/",
      "version": "d17e1540d3f64a12434dd0ea4c95cef03f73face82e34390321528392b7fe426",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Placket length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Top offset (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bottom offset (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Button count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Positions from top (cm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Spacing (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Positions refer to buttonhole centres measured from the placket top. At least two buttons are required. This gives equal spacing, not a garment-specific stress-point layout."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Positions from top (cm)",
          "text": "Start at b. Position i = b + i × (a−b−c)/(d−1), with i from 0 to d−1."
        },
        {
          "label": "Spacing (cm)",
          "text": "(a−b−c)/(d−1)."
        }
      ],
      "example_questions": [
        "Use the Buttonhole placement calculator.",
        "Help me calculate buttonhole placement."
      ],
      "retrieval_phrases": [
        "Buttonhole placement",
        "buttonhole placement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 5,
            "c": 5,
            "d": 6
          },
          "outputs": [
            {
              "label": "Positions from top (cm)",
              "value": "5, 15, 25, 35, 45, 55"
            },
            {
              "label": "Spacing (cm)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-516",
      "name": "Knitting gauge conversion",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Preserves dimensions under the measured gauge. Round to the nearest whole count; pattern repeats and shaping may require further adjustment. Swatches should be measured in their finished state.",
      "url": "/calculators/knitting-gauge-conversion/",
      "version": "f0802a90d724525a1a268e922a99b3f8adc4499891fb9c99997ffa32cf3bc8c8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original stitches per 10 cm",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured stitches per 10 cm",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Original stitches",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Original rows per 10 cm",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Measured rows per 10 cm",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Original rows",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Exact stitch target",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rounded stitches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Exact row target",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Rounded rows",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Preserves dimensions under the measured gauge. Round to the nearest whole count; pattern repeats and shaping may require further adjustment. Swatches should be measured in their finished state."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Exact stitch target",
          "text": "c × b ÷ a"
        },
        {
          "label": "Rounded stitches",
          "text": "round(c × b ÷ a)"
        },
        {
          "label": "Exact row target",
          "text": "f × e ÷ d"
        },
        {
          "label": "Rounded rows",
          "text": "round(f × e ÷ d)"
        }
      ],
      "example_questions": [
        "Use the Knitting gauge conversion calculator.",
        "Help me calculate knitting gauge conversion."
      ],
      "retrieval_phrases": [
        "Knitting gauge conversion",
        "knitting gauge conversion"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 22,
            "c": 100,
            "d": 30,
            "e": 33,
            "f": 150
          },
          "outputs": [
            {
              "label": "Exact stitch target",
              "value": 110
            },
            {
              "label": "Rounded stitches",
              "value": 110
            },
            {
              "label": "Exact row target",
              "value": 165
            },
            {
              "label": "Rounded rows",
              "value": 165
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-520",
      "name": "Yarn substitution quantity",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Matches stated yarn length and rounds purchases to complete skeins. Equal length does not guarantee matching gauge, fibre behaviour or finished fabric.",
      "url": "/calculators/yarn-substitution-quantity/",
      "version": "60c6f2f31304c0025c0a21d70613460186ef97d1f6a7e0f732d704447607ead3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original yarn length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Original yarn weight (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Original total weight (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Replacement skein length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Replacement skein weight (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required yarn (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Replacement skeins",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Purchased weight (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Matches stated yarn length and rounds purchases to complete skeins. Equal length does not guarantee matching gauge, fibre behaviour or finished fabric."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required yarn (m)",
          "text": "a × c ÷ b"
        },
        {
          "label": "Replacement skeins",
          "text": "roundUp(a × c ÷ b ÷ d)"
        },
        {
          "label": "Purchased weight (g)",
          "text": "roundUp(a × c ÷ b ÷ d) × e"
        }
      ],
      "example_questions": [
        "Use the Yarn substitution quantity calculator.",
        "Help me calculate yarn substitution quantity."
      ],
      "retrieval_phrases": [
        "Yarn substitution quantity",
        "yarn substitution quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 100,
            "c": 400,
            "d": 150,
            "e": 50
          },
          "outputs": [
            {
              "label": "Required yarn (m)",
              "value": 800
            },
            {
              "label": "Replacement skeins",
              "value": 6
            },
            {
              "label": "Purchased weight (g)",
              "value": 300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-522",
      "name": "Cross-stitch fabric size",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Use 1 for stitching over one Aida block; use 2 for stitching over two threads on an evenweave counted in threads per inch. Margins are added to both sides.",
      "url": "/calculators/cross-stitch-fabric-size/",
      "version": "fdee996d0f74a09b65d08f2777bf9f626025ffbc59fa0dcb9a9067846cf0d44b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Design width (stitches)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Design height (stitches)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fabric count per inch",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Threads or blocks per stitch",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Margin each side (inches)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Stitched width (inches)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Stitched height (inches)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cut width (inches)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Cut height (inches)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use 1 for stitching over one Aida block; use 2 for stitching over two threads on an evenweave counted in threads per inch. Margins are added to both sides."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Stitched width (inches)",
          "text": "a × d ÷ c"
        },
        {
          "label": "Stitched height (inches)",
          "text": "b × d ÷ c"
        },
        {
          "label": "Cut width (inches)",
          "text": "a × d ÷ c+2 × e"
        },
        {
          "label": "Cut height (inches)",
          "text": "b × d ÷ c+2 × e"
        }
      ],
      "example_questions": [
        "Use the Cross-stitch fabric size calculator.",
        "Help me calculate cross-stitch fabric size."
      ],
      "retrieval_phrases": [
        "Cross-stitch fabric size",
        "cross stitch fabric size"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 140,
            "b": 70,
            "c": 14,
            "d": 1,
            "e": 2
          },
          "outputs": [
            {
              "label": "Stitched width (inches)",
              "value": 10
            },
            {
              "label": "Stitched height (inches)",
              "value": 5
            },
            {
              "label": "Cut width (inches)",
              "value": 14
            },
            {
              "label": "Cut height (inches)",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-523",
      "name": "Embroidery thread estimate",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Scales a measured sample using the same strand count and stitch style. Skein length must represent usable thread at that strand count; colour-by-colour waste needs separate samples.",
      "url": "/calculators/embroidery-thread-estimate/",
      "version": "871a6514c1ed790f013f6831999e5161635c1f9a112dc0ffa1ae3673297a7357",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sample thread used (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sample stitch count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Design stitch count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reserve (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Usable skein length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated thread (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Skeins",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Scales a measured sample using the same strand count and stitch style. Skein length must represent usable thread at that strand count; colour-by-colour waste needs separate samples."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated thread (m)",
          "text": "a ÷ b × c × (1+d ÷ 100)"
        },
        {
          "label": "Skeins",
          "text": "roundUp(a ÷ b × c × (1+d ÷ 100) ÷ e)"
        }
      ],
      "example_questions": [
        "Use the Embroidery thread estimate calculator.",
        "Help me calculate embroidery thread estimate."
      ],
      "retrieval_phrases": [
        "Embroidery thread estimate",
        "embroidery thread estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 100,
            "c": 1000,
            "d": 20,
            "e": 8
          },
          "outputs": [
            {
              "label": "Estimated thread (m)",
              "value": 24
            },
            {
              "label": "Skeins",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-526",
      "name": "Board feet tally",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "For each line, board feet = count × thickness in inches × width in inches × length in feet / 12. Use actual supplied dimensions; nominal sizes can differ.",
      "url": "/calculators/board-feet-tally/",
      "version": "e6086fb62b0d5e50fc7268bf03cfaec53e3eecdfe2a00fae2ccded2876f63dac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Board quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Thicknesses (inches)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Widths (inches)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Lengths (feet)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Board feet by line",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total board feet",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "For each line, board feet = count × thickness in inches × width in inches × length in feet / 12. Use actual supplied dimensions; nominal sizes can differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Board feet by line",
          "text": "Apply quantity × thickness × width × length / 12 to each matched row."
        },
        {
          "label": "Total board feet",
          "text": "Add the board-foot totals of all rows."
        }
      ],
      "example_questions": [
        "Use the Board feet tally calculator.",
        "Help me calculate board feet tally."
      ],
      "retrieval_phrases": [
        "Board feet tally",
        "board feet tally"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,1",
            "b": "1,2",
            "c": "6,12",
            "d": "8,4"
          },
          "outputs": [
            {
              "label": "Board feet by line",
              "value": "8, 8"
            },
            {
              "label": "Total board feet",
              "value": 16
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-529",
      "name": "Dado clearance fit",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "Offsets are measured from the left dado edge. Equal-spaced geometric passes cover the width with overlap. This is a top-view layout only; it does not choose depth of cut or a machining procedure.",
      "url": "/calculators/dado-clearance-fit/",
      "version": "1cf283c864f0b5dfaefb5866c41cc208f72f93b6db91d72540614a6a38e1aaf9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Panel thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Clearance (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cutter diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Dado width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cutter centre offsets (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Offsets are measured from the left dado edge. Equal-spaced geometric passes cover the width with overlap. This is a top-view layout only; it does not choose depth of cut or a machining procedure."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Dado width (mm)",
          "text": "a+b."
        },
        {
          "label": "Cutter centre offsets (mm)",
          "text": "Use roundUp((a+b)/c) passes, with centres equally spaced from c/2 to a+b−c/2. One exact-width pass is centred at c/2."
        }
      ],
      "example_questions": [
        "Use the Dado clearance fit calculator.",
        "Help me calculate dado clearance fit."
      ],
      "retrieval_phrases": [
        "Dado clearance fit",
        "dado clearance fit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 18,
            "b": 0.2,
            "c": 12
          },
          "outputs": [
            {
              "label": "Dado width (mm)",
              "value": 18.2
            },
            {
              "label": "Cutter centre offsets (mm)",
              "value": "6, 12.2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-532",
      "name": "Dovetail slope angle",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "A 1:6 slope moves sideways by one unit for six units of board depth. The angle is measured from the perpendicular reference, not from the board face.",
      "url": "/calculators/dovetail-slope-angle/",
      "version": "f1aefc687ade501267356d8f8dbda82d07660e28612a2d7c4aef7209128fa406",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Slope rise",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Slope run",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Board thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Angle from perpendicular (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Side offset (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A 1:6 slope moves sideways by one unit for six units of board depth. The angle is measured from the perpendicular reference, not from the board face."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Angle from perpendicular (degrees)",
          "text": "atan(a ÷ b) × 180 ÷ π"
        },
        {
          "label": "Side offset (mm)",
          "text": "c × a ÷ b"
        }
      ],
      "example_questions": [
        "Use the Dovetail slope angle calculator.",
        "Help me calculate dovetail slope angle."
      ],
      "retrieval_phrases": [
        "Dovetail slope angle",
        "dovetail slope angle"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 6,
            "c": 18
          },
          "outputs": [
            {
              "label": "Angle from perpendicular (degrees)",
              "value": 9.462322208025617
            },
            {
              "label": "Side offset (mm)",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-536",
      "name": "Taper jig offset",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "One edge remains straight. The signed offset is start width minus end width; the displayed angle is its magnitude. Fixture safety and tool setup are outside this geometric model.",
      "url": "/calculators/taper-jig-offset/",
      "version": "86127578a3c80f4a26aae9695452acf7a7f5da4a1287563416701d7b7c116c95",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Workpiece length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Start width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "End width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Signed end offset (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Taper angle (degrees)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One edge remains straight. The signed offset is start width minus end width; the displayed angle is its magnitude. Fixture safety and tool setup are outside this geometric model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Signed end offset (mm)",
          "text": "b-c"
        },
        {
          "label": "Taper angle (degrees)",
          "text": "atan(abs(b-c) ÷ a) × 180 ÷ π"
        }
      ],
      "example_questions": [
        "Use the Taper jig offset calculator.",
        "Help me calculate taper jig offset."
      ],
      "retrieval_phrases": [
        "Taper jig offset",
        "taper jig offset"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 600,
            "b": 100,
            "c": 70
          },
          "outputs": [
            {
              "label": "Signed end offset (mm)",
              "value": 30
            },
            {
              "label": "Taper angle (degrees)",
              "value": 2.8624052261117474
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-540",
      "name": "Drawer slide clearance",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "Deduct slide clearance on both sides, then both drawer walls. Enter the actual slide manufacturer clearance. This is a width calculation only.",
      "url": "/calculators/drawer-slide-clearance/",
      "version": "ffae4b8e372470508901792f590465f70958e59dee38c6e5c44f4aa0b258b80d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Opening width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Slide clearance each side (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Wall thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Drawer outside width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Drawer inside width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Deduct slide clearance on both sides, then both drawer walls. Enter the actual slide manufacturer clearance. This is a width calculation only."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Drawer outside width (mm)",
          "text": "a-2 × b"
        },
        {
          "label": "Drawer inside width (mm)",
          "text": "a-2 × b-2 × c"
        }
      ],
      "example_questions": [
        "Use the Drawer slide clearance calculator.",
        "Help me calculate drawer slide clearance."
      ],
      "retrieval_phrases": [
        "Drawer slide clearance",
        "drawer slide clearance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 12.5,
            "c": 15
          },
          "outputs": [
            {
              "label": "Drawer outside width (mm)",
              "value": 475
            },
            {
              "label": "Drawer inside width (mm)",
              "value": 445
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-542",
      "name": "Frame-and-panel allowance",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "Grooves extend beyond the visible opening. Clearance applies at every edge; each movement reserve is a total dimension deduction. Enter measured allowances, not a guessed species recommendation.",
      "url": "/calculators/frame-and-panel-allowance/",
      "version": "44fb899280d6963dda2702f3167fae30ffe4bfdc1c157b23afbdca68c54f24d3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Opening width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Opening height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Groove depth each edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Clearance each edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Total width movement reserve (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Total height movement reserve (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Panel width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Panel height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Grooves extend beyond the visible opening. Clearance applies at every edge; each movement reserve is a total dimension deduction. Enter measured allowances, not a guessed species recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Panel width (mm)",
          "text": "a+2 × c-2 × d-e"
        },
        {
          "label": "Panel height (mm)",
          "text": "b+2 × c-2 × d-f"
        }
      ],
      "example_questions": [
        "Use the Frame-and-panel allowance calculator.",
        "Help me calculate frame-and-panel allowance."
      ],
      "retrieval_phrases": [
        "Frame-and-panel allowance",
        "frame and panel allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 400,
            "b": 600,
            "c": 10,
            "d": 1,
            "e": 4,
            "f": 0
          },
          "outputs": [
            {
              "label": "Panel width (mm)",
              "value": 414
            },
            {
              "label": "Panel height (mm)",
              "value": 618
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-543",
      "name": "Wood movement estimate",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "A linear estimate using your supplied movement coefficient as a fractional width change per moisture percentage point. Direction, species, grain and moisture range determine whether that coefficient applies.",
      "url": "/calculators/wood-movement-estimate/",
      "version": "3d9af413d2c122e25858b82d008e5ddd072f9816b7b8037f3305cb6fc918ed91",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Board width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Moisture change (percentage points)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Movement coefficient per percentage point",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Signed width change (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Movement magnitude (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Estimated final width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A linear estimate using your supplied movement coefficient as a fractional width change per moisture percentage point. Direction, species, grain and moisture range determine whether that coefficient applies."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Signed width change (mm)",
          "text": "a × b × c"
        },
        {
          "label": "Movement magnitude (mm)",
          "text": "abs(a × b × c)"
        },
        {
          "label": "Estimated final width (mm)",
          "text": "a × (1+b × c)"
        }
      ],
      "example_questions": [
        "Use the Wood movement estimate calculator.",
        "Help me calculate wood movement estimate."
      ],
      "retrieval_phrases": [
        "Wood movement estimate",
        "wood movement estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 4,
            "c": 0.002
          },
          "outputs": [
            {
              "label": "Signed width change (mm)",
              "value": 2.4
            },
            {
              "label": "Movement magnitude (mm)",
              "value": 2.4
            },
            {
              "label": "Estimated final width (mm)",
              "value": 302.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-547",
      "name": "Countersink depth",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "Depth is the axial height between the pilot and head diameters of an ideal conical recess. Head geometry and fit must be checked separately.",
      "url": "/calculators/countersink-depth/",
      "version": "3be1c2e5cc17963477f05541e65bfc50435c0db4772253733b31d0722a97c3e6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pilot diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Head diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Included angle (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Geometric depth (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Depth is the axial height between the pilot and head diameters of an ideal conical recess. Head geometry and fit must be checked separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Geometric depth (mm)",
          "text": "(b-a) ÷ (2 × tan(c × π ÷ 360))"
        }
      ],
      "example_questions": [
        "Use the Countersink depth calculator.",
        "Help me calculate countersink depth."
      ],
      "retrieval_phrases": [
        "Countersink depth",
        "countersink depth"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 8,
            "c": 90
          },
          "outputs": [
            {
              "label": "Geometric depth (mm)",
              "value": 2.0000000000000004
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-551",
      "name": "3D print job cost",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Itemises the supplied costs for one job. Mean power and material usage are measured or estimated inputs. Failures, shipping and taxes are included only if you add them to overhead.",
      "url": "/calculators/3d-print-job-cost/",
      "version": "9a511deeff9e622a8a61d9664b83b551c0f63648a47d301dea4dc0c5c0f966ec",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Material used (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Material price (£/kg)",
          "type": "number",
          "required": true,
          "unit": "GBP/kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Print hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Mean power (W)",
          "type": "number",
          "required": true,
          "unit": "W",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Electricity (£/kWh)",
          "type": "number",
          "required": true,
          "unit": "GBP/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Labour hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Labour rate (£/hour)",
          "type": "number",
          "required": true,
          "unit": "GBP/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "h",
          "label": "Allocated overhead (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "i",
          "label": "Markup (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Material cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Energy cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Labour cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Total job cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Quote before tax (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Itemises the supplied costs for one job. Mean power and material usage are measured or estimated inputs. Failures, shipping and taxes are included only if you add them to overhead."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Material cost (£)",
          "text": "a × b ÷ 1000"
        },
        {
          "label": "Energy cost (£)",
          "text": "c × d ÷ 1000 × e"
        },
        {
          "label": "Labour cost (£)",
          "text": "f × g"
        },
        {
          "label": "Total job cost (£)",
          "text": "a × b ÷ 1000+c × d ÷ 1000 × e+f × g+h"
        },
        {
          "label": "Quote before tax (£)",
          "text": "(a × b ÷ 1000+c × d ÷ 1000 × e+f × g+h) × (1+i ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the 3D print job cost calculator.",
        "Help me calculate 3d print job cost."
      ],
      "retrieval_phrases": [
        "3D print job cost",
        "3d print job cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 20,
            "c": 5,
            "d": 200,
            "e": 0.25,
            "f": 0.5,
            "g": 20,
            "h": 3,
            "i": 20
          },
          "outputs": [
            {
              "label": "Material cost (£)",
              "value": 2
            },
            {
              "label": "Energy cost (£)",
              "value": 0.25
            },
            {
              "label": "Labour cost (£)",
              "value": 10
            },
            {
              "label": "Total job cost (£)",
              "value": 15.25
            },
            {
              "label": "Quote before tax (£)",
              "value": 18.3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-552",
      "name": "Filament remaining from spool weight",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Treats filament as a constant-diameter solid cylinder. Density is in g/cm³ and diameter in mm; these units cancel to metres in the length formula. Gross mass must include the same empty spool.",
      "url": "/calculators/filament-remaining-from-spool-weight/",
      "version": "6c6c1b3779600eef65f5ed4a56ecffd42f736ba9a40e5b4a12b1d7f59f64c78e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gross spool mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Empty spool mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Material density (g/cm³)",
          "type": "number",
          "required": true,
          "unit": "g/cm³",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Filament diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Remaining filament (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated length (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Treats filament as a constant-diameter solid cylinder. Density is in g/cm³ and diameter in mm; these units cancel to metres in the length formula. Gross mass must include the same empty spool."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Remaining filament (g)",
          "text": "a-b"
        },
        {
          "label": "Estimated length (m)",
          "text": "(a-b) ÷ c ÷ (π × (d ÷ 2)^2)"
        }
      ],
      "example_questions": [
        "Use the Filament remaining from spool weight calculator.",
        "Help me calculate filament remaining from spool weight."
      ],
      "retrieval_phrases": [
        "Filament remaining from spool weight",
        "filament remaining from spool weight"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 700,
            "b": 200,
            "c": 1.25,
            "d": 2
          },
          "outputs": [
            {
              "label": "Remaining filament (g)",
              "value": 500
            },
            {
              "label": "Estimated length (m)",
              "value": 127.32395447351627
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-554",
      "name": "Extruder steps calibration",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Proportional correction for a steps-per-mm setting only. Rotation-distance settings use the reciprocal correction. Retest measured extrusion and follow the printer manufacturer procedure; this tool does not send commands.",
      "url": "/calculators/extruder-steps-calibration/",
      "version": "c74fb11cd03a5b94749fc277e4052f0402a301eefecb30b181a7bb72f76e1178",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Commanded length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Current steps per mm",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Proposed steps per mm",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Measured error (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Proportional correction for a steps-per-mm setting only. Rotation-distance settings use the reciprocal correction. Retest measured extrusion and follow the printer manufacturer procedure; this tool does not send commands."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Proposed steps per mm",
          "text": "c × a ÷ b"
        },
        {
          "label": "Measured error (%)",
          "text": "(b-a) ÷ a × 100"
        }
      ],
      "example_questions": [
        "Use the Extruder steps calibration calculator.",
        "Help me calculate extruder steps calibration."
      ],
      "retrieval_phrases": [
        "Extruder steps calibration",
        "extruder steps calibration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 95,
            "c": 100
          },
          "outputs": [
            {
              "label": "Proposed steps per mm",
              "value": 105.26315789473684
            },
            {
              "label": "Measured error (%)",
              "value": -5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-555",
      "name": "Extrusion flow calibration",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Multiply the current flow factor by target width / measured width. Use a suitable single-wall test and repeat measurements. Adaptive line widths, mechanical errors and imprecise measurements can invalidate this estimate.",
      "url": "/calculators/extrusion-flow-calibration/",
      "version": "8a234ef91bbd0ec670a050b3b0da86ce0c4892adc22df157efde1d8c5e24ed9f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target wall width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured wall width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Current flow multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Proposed flow multiplier",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Correction (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Multiply the current flow factor by target width / measured width. Use a suitable single-wall test and repeat measurements. Adaptive line widths, mechanical errors and imprecise measurements can invalidate this estimate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Proposed flow multiplier",
          "text": "c × a ÷ b"
        },
        {
          "label": "Correction (%)",
          "text": "(a ÷ b-1) × 100"
        }
      ],
      "example_questions": [
        "Use the Extrusion flow calibration calculator.",
        "Help me calculate extrusion flow calibration."
      ],
      "retrieval_phrases": [
        "Extrusion flow calibration",
        "extrusion flow calibration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.45,
            "b": 0.5,
            "c": 1
          },
          "outputs": [
            {
              "label": "Proposed flow multiplier",
              "value": 0.9
            },
            {
              "label": "Correction (%)",
              "value": -9.999999999999998
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-556",
      "name": "Printer axis scale calibration",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "This is a proportional-error hypothesis, not a diagnosis. A zero model residual is algebraic, not a verified physical result. Printed-part shrinkage and backlash must not be mistaken for axis calibration; check mechanical settings using manufacturer guidance.",
      "url": "/calculators/printer-axis-scale-calibration/",
      "version": "4403620b3db90a72695b6006289d066888b83b3afba07b30c7a10935a4954678",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal test length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured test length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Current steps per mm",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Proportional steps estimate",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Observed dimensional error (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Model residual after correction (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This is a proportional-error hypothesis, not a diagnosis. A zero model residual is algebraic, not a verified physical result. Printed-part shrinkage and backlash must not be mistaken for axis calibration; check mechanical settings using manufacturer guidance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Proportional steps estimate",
          "text": "c × a ÷ b"
        },
        {
          "label": "Observed dimensional error (mm)",
          "text": "b-a"
        },
        {
          "label": "Model residual after correction (mm)",
          "text": "b × (c × a ÷ b) ÷ c-a"
        }
      ],
      "example_questions": [
        "Use the Printer axis scale calibration calculator.",
        "Help me calculate printer axis scale calibration."
      ],
      "retrieval_phrases": [
        "Printer axis scale calibration",
        "printer axis scale calibration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 99,
            "c": 80
          },
          "outputs": [
            {
              "label": "Proportional steps estimate",
              "value": 80.8080808080808
            },
            {
              "label": "Observed dimensional error (mm)",
              "value": -1
            },
            {
              "label": "Model residual after correction (mm)",
              "value": -1.4210854715202004e-14
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-559",
      "name": "3D print layer count",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "The first layer is capped at object height. Later layers use the regular height except the final layer, which is shortened to reach the target exactly. Your slicer may enforce different minimum heights.",
      "url": "/calculators/3d-print-layer-count/",
      "version": "025fd912c1afb857a0e7a55ec4dcf2542efdbe1fe093d79189f7fd4333a740e7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Object height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "First layer (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Regular layer (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Layer count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Final layer height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The first layer is capped at object height. Later layers use the regular height except the final layer, which is shortened to reach the target exactly. Your slicer may enforce different minimum heights."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Layer count",
          "text": "If a ≤ b, one layer. Otherwise 1 + roundUp((a−b)/c)."
        },
        {
          "label": "Final layer height (mm)",
          "text": "One-layer case: a. Otherwise subtract the first layer and all complete regular layers before the final layer from a."
        }
      ],
      "example_questions": [
        "Use the 3D print layer count calculator.",
        "Help me calculate 3d print layer count."
      ],
      "retrieval_phrases": [
        "3D print layer count",
        "3d print layer count"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 0.3,
            "c": 0.2
          },
          "outputs": [
            {
              "label": "Layer count",
              "value": 50
            },
            {
              "label": "Final layer height (mm)",
              "value": 0.09999999999999787
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-561",
      "name": "FDM volumetric flow limit",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Uses a stadium cross-section: a rectangle plus two semicircular ends. Width must be at least height. The supplied tested flow limit alone does not account for acceleration, cooling or machine limits.",
      "url": "/calculators/fdm-volumetric-flow-limit/",
      "version": "ae5954e380a57e7c05d16fe320d90a8cde04edc32bd4162649bd572ea42c3022",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Line width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Layer height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tested volumetric limit (mm³/s)",
          "type": "number",
          "required": true,
          "unit": "mm³/s",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum model speed (mm/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Extrusion cross-section (mm²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a stadium cross-section: a rectangle plus two semicircular ends. Width must be at least height. The supplied tested flow limit alone does not account for acceleration, cooling or machine limits."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum model speed (mm/s)",
          "text": "c ÷ ((a-b) × b+π × (b ÷ 2)^2)"
        },
        {
          "label": "Extrusion cross-section (mm²)",
          "text": "(a-b) × b+π × (b ÷ 2)^2"
        }
      ],
      "example_questions": [
        "Use the FDM volumetric flow limit calculator.",
        "Help me calculate fdm volumetric flow limit."
      ],
      "retrieval_phrases": [
        "FDM volumetric flow limit",
        "fdm volumetric flow limit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.45,
            "b": 0.2,
            "c": 8
          },
          "outputs": [
            {
              "label": "Maximum model speed (mm/s)",
              "value": 98.26087278479399
            },
            {
              "label": "Extrusion cross-section (mm²)",
              "value": 0.08141592653589794
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-562",
      "name": "Filament feed rate",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Feed speed is volumetric flow divided by the circular filament cross-sectional area. This is the filament drive speed, not print-head travel speed.",
      "url": "/calculators/filament-feed-rate/",
      "version": "9946730d5ecf5b6937383242671967af4d67cd956a3f2e33ed5ade98dcf1a207",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Volumetric flow (mm³/s)",
          "type": "number",
          "required": true,
          "unit": "mm³/s",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Filament diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Filament feed speed (mm/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Feed speed is volumetric flow divided by the circular filament cross-sectional area. This is the filament drive speed, not print-head travel speed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Filament feed speed (mm/s)",
          "text": "a ÷ (π × (b ÷ 2)^2)"
        }
      ],
      "example_questions": [
        "Use the Filament feed rate calculator.",
        "Help me calculate filament feed rate."
      ],
      "retrieval_phrases": [
        "Filament feed rate",
        "filament feed rate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 8,
            "b": 2
          },
          "outputs": [
            {
              "label": "Filament feed speed (mm/s)",
              "value": 2.5464790894703255
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-563",
      "name": "Printed hole compensation",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Offset fits a constant dimensional loss; scale fits measured = factor × nominal through the origin. These are calibration-sample fits, not guarantees for other materials, orientations or hole sizes.",
      "url": "/calculators/printed-hole-compensation/",
      "version": "76d7e0906e12e49bafa022d27216221471ef25015d27f03f47777c47dad742da",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal test holes (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured test holes (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Fit model (offset or scale)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "d",
          "label": "Desired finished hole (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Compensated model diameter (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Fitted relation",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Measured minus fitted residuals (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Offset fits a constant dimensional loss; scale fits measured = factor × nominal through the origin. These are calibration-sample fits, not guarantees for other materials, orientations or hole sizes."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Compensated model diameter (mm)",
          "text": "Offset model: desired diameter plus mean(nominal−measured). Scale model: desired diameter divided by sum(nominal × measured)/sum(nominal²)."
        },
        {
          "label": "Fitted relation",
          "text": "Display the fitted offset or scale relation."
        },
        {
          "label": "Measured minus fitted residuals (mm)",
          "text": "For each test hole, subtract fitted measured diameter from actual measured diameter."
        }
      ],
      "example_questions": [
        "Use the Printed hole compensation calculator.",
        "Help me calculate printed hole compensation."
      ],
      "retrieval_phrases": [
        "Printed hole compensation",
        "printed hole compensation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "9.8,19.8",
            "c": "offset",
            "d": 10
          },
          "outputs": [
            {
              "label": "Compensated model diameter (mm)",
              "value": 10.2
            },
            {
              "label": "Fitted relation",
              "value": "measured = nominal − 0.2 mm"
            },
            {
              "label": "Measured minus fitted residuals (mm)",
              "value": "0, 0"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-564",
      "name": "Shrink-fit print compensation",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Compensates independently measured shrinkage on three axes. Shrinkage percentages refer to the original model dimensions. This does not determine interference-fit tolerances.",
      "url": "/calculators/shrink-fit-print-compensation/",
      "version": "aeaa89cc39b85b907018a2201308cba712cd4857069e772f7127d1a916b31b40",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target X (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target Y (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target Z (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "X shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Y shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Z shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Model X (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Model Y (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Model Z (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compensates independently measured shrinkage on three axes. Shrinkage percentages refer to the original model dimensions. This does not determine interference-fit tolerances."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Model X (mm)",
          "text": "a ÷ (1-d ÷ 100)"
        },
        {
          "label": "Model Y (mm)",
          "text": "b ÷ (1-e ÷ 100)"
        },
        {
          "label": "Model Z (mm)",
          "text": "c ÷ (1-f ÷ 100)"
        }
      ],
      "example_questions": [
        "Use the Shrink-fit print compensation calculator.",
        "Help me calculate shrink-fit print compensation."
      ],
      "retrieval_phrases": [
        "Shrink-fit print compensation",
        "shrink fit print compensation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 50,
            "c": 20,
            "d": 2,
            "e": 2,
            "f": 0
          },
          "outputs": [
            {
              "label": "Model X (mm)",
              "value": 102.04081632653062
            },
            {
              "label": "Model Y (mm)",
              "value": 51.02040816326531
            },
            {
              "label": "Model Z (mm)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-565",
      "name": "Support interface gap planner",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Quantises the gap to whole layers with the chosen rule. Nearest uses halfway ties upwards. Slicer behaviour and support material compatibility must be checked separately.",
      "url": "/calculators/support-interface-gap-planner/",
      "version": "4be5adf87b5b5944421f56336f013bfda75cebfd2d9a9c3132f40f5af4507bff",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Layer height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired Z gap (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rounding policy (up, nearest, down)",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gap layers",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Achievable gap (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Deviation from requested (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Quantises the gap to whole layers with the chosen rule. Nearest uses halfway ties upwards. Slicer behaviour and support material compatibility must be checked separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gap layers",
          "text": "Divide b by a and round up, nearest, or down as selected."
        },
        {
          "label": "Achievable gap (mm)",
          "text": "Whole gap layers × a."
        },
        {
          "label": "Deviation from requested (mm)",
          "text": "Achievable gap − b."
        }
      ],
      "example_questions": [
        "Use the Support interface gap planner calculator.",
        "Help me calculate support interface gap planner."
      ],
      "retrieval_phrases": [
        "Support interface gap planner",
        "support interface gap planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.2,
            "b": 0.35,
            "c": "up"
          },
          "outputs": [
            {
              "label": "Gap layers",
              "value": 2
            },
            {
              "label": "Achievable gap (mm)",
              "value": 0.4
            },
            {
              "label": "Deviation from requested (mm)",
              "value": 0.050000000000000044
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-567",
      "name": "3D mesh scale to target volume",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Uniform scaling changes volume by scale cubed and surface area by scale squared. Both volumes must use the same units and refer to closed meshes. This tool does not inspect a mesh file.",
      "url": "/calculators/3d-mesh-scale-to-target-volume/",
      "version": "4974c5a5d825f0e9d71c95ea08af2798fe1c6c158fa0a802b660bd9230301b91",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current closed-mesh volume",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target volume",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Linear scale factor",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Scale (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Surface-area factor",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform scaling changes volume by scale cubed and surface area by scale squared. Both volumes must use the same units and refer to closed meshes. This tool does not inspect a mesh file."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Linear scale factor",
          "text": "(b ÷ a)^(1 ÷ 3)"
        },
        {
          "label": "Scale (%)",
          "text": "(b ÷ a)^(1 ÷ 3) × 100"
        },
        {
          "label": "Surface-area factor",
          "text": "(b ÷ a)^(2 ÷ 3)"
        }
      ],
      "example_questions": [
        "Use the 3D mesh scale to target volume calculator.",
        "Help me calculate 3d mesh scale to target volume."
      ],
      "retrieval_phrases": [
        "3D mesh scale to target volume",
        "3d mesh scale to target volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 800
          },
          "outputs": [
            {
              "label": "Linear scale factor",
              "value": 2
            },
            {
              "label": "Scale (%)",
              "value": 200
            },
            {
              "label": "Surface-area factor",
              "value": 3.9999999999999996
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-568",
      "name": "Voxel grid size",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Round each box dimension up to whole voxels. Memory is the dense raw grid only; object overhead, indices, sparse compression and temporary buffers are excluded.",
      "url": "/calculators/voxel-grid-size/",
      "version": "b8f94ac428ed0fb7a5245b9fe48e322af1131ef8cb824b2cc5b4794c517877b2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Box X (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Box Y (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Box Z (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Voxel pitch (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Bytes per voxel",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Grid dimensions",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Voxel count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Raw bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Raw MiB",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Round each box dimension up to whole voxels. Memory is the dense raw grid only; object overhead, indices, sparse compression and temporary buffers are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Grid dimensions",
          "text": "Each axis count = roundUp(axis dimension / d)."
        },
        {
          "label": "Voxel count",
          "text": "Multiply all three axis counts."
        },
        {
          "label": "Raw bytes",
          "text": "Voxel count × e."
        },
        {
          "label": "Raw MiB",
          "text": "Raw bytes / 2^20."
        }
      ],
      "example_questions": [
        "Use the Voxel grid size calculator.",
        "Help me calculate voxel grid size."
      ],
      "retrieval_phrases": [
        "Voxel grid size",
        "voxel grid size"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 20,
            "c": 30,
            "d": 1,
            "e": 4
          },
          "outputs": [
            {
              "label": "Grid dimensions",
              "value": "10 × 20 × 30"
            },
            {
              "label": "Voxel count",
              "value": 6000
            },
            {
              "label": "Raw bytes",
              "value": 24000
            },
            {
              "label": "Raw MiB",
              "value": 0.02288818359375
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-569",
      "name": "STL binary size estimate",
      "category": "3D printing and digital fabrication",
      "status": "available",
      "purpose": "Standard binary STL has an 80-byte header, 4-byte triangle count and 50 bytes per triangle. Metadata occupies the fixed header rather than adding bytes. Nonstandard extensions are excluded.",
      "url": "/calculators/stl-binary-size-estimate/",
      "version": "d46414e9c0db9608a5e76e8c3d1f24598b048dc6e003fae3a5750f446a8adaf5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Triangles",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Header metadata bytes used",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Binary STL bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unused header bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Binary STL MiB",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Standard binary STL has an 80-byte header, 4-byte triangle count and 50 bytes per triangle. Metadata occupies the fixed header rather than adding bytes. Nonstandard extensions are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Binary STL bytes",
          "text": "84+50 × a"
        },
        {
          "label": "Unused header bytes",
          "text": "80-b"
        },
        {
          "label": "Binary STL MiB",
          "text": "(84+50 × a) ÷ 2^20"
        }
      ],
      "example_questions": [
        "Use the STL binary size estimate calculator.",
        "Help me calculate stl binary size estimate."
      ],
      "retrieval_phrases": [
        "STL binary size estimate",
        "stl binary size estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 20
          },
          "outputs": [
            {
              "label": "Binary STL bytes",
              "value": 50084
            },
            {
              "label": "Unused header bytes",
              "value": 60
            },
            {
              "label": "Binary STL MiB",
              "value": 0.047763824462890625
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Validate each estimate against measured jobs; machine settings require supplier method and range checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-594",
      "name": "Speaker delay alignment",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Delay the nearer source by the extra travel time of the farther source. Sound speed is supplied explicitly; electronic latency and phase response require separate measurement.",
      "url": "/calculators/speaker-delay-alignment/",
      "version": "f8c0f22ed216dcbcfd3ff831d9768d353b0b8528c6722277e1d88d060ec790fb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Path-length difference (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sound speed (m/s)",
          "type": "number",
          "required": true,
          "unit": "m/s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Alignment delay (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Delay the nearer source by the extra travel time of the farther source. Sound speed is supplied explicitly; electronic latency and phase response require separate measurement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Alignment delay (ms)",
          "text": "a ÷ b × 1000"
        }
      ],
      "example_questions": [
        "Use the Speaker delay alignment calculator.",
        "Help me calculate speaker delay alignment."
      ],
      "retrieval_phrases": [
        "Speaker delay alignment",
        "speaker delay alignment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3.43,
            "b": 343
          },
          "outputs": [
            {
              "label": "Alignment delay (ms)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify acoustic and tuning conventions; distinguish ideal models from measured room or instrument behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-595",
      "name": "Stereo sample delay width",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Comb frequencies apply when equal-level, same-polarity original and delayed signals are summed. Stereo playback alone does not guarantee those notches. Zero delay produces no delay-induced comb.",
      "url": "/calculators/stereo-sample-delay-width/",
      "version": "9266879d6e0855026ec601d6e108690b559fa56475f92f8bef5df5a330f589b7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sample rate (Hz)",
          "type": "number",
          "required": true,
          "unit": "Hz",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Delay samples",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Delay (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Comb spacing (Hz)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "First ideal notch (Hz)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Comb frequencies apply when equal-level, same-polarity original and delayed signals are summed. Stereo playback alone does not guarantee those notches. Zero delay produces no delay-induced comb."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Delay (ms)",
          "text": "1000 × b/a."
        },
        {
          "label": "Comb spacing (Hz)",
          "text": "For positive delay, a/b. For zero delay, no delay-induced comb."
        },
        {
          "label": "First ideal notch (Hz)",
          "text": "For positive delay, a/(2b). For zero delay, no delay-induced comb."
        }
      ],
      "example_questions": [
        "Use the Stereo sample delay width calculator.",
        "Help me calculate stereo sample delay width."
      ],
      "retrieval_phrases": [
        "Stereo sample delay width",
        "stereo sample delay width"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 48000,
            "b": 48
          },
          "outputs": [
            {
              "label": "Delay (ms)",
              "value": 1
            },
            {
              "label": "Comb spacing (Hz)",
              "value": 1000
            },
            {
              "label": "First ideal notch (Hz)",
              "value": 500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify acoustic and tuning conventions; distinguish ideal models from measured room or instrument behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-596",
      "name": "Microphone spacing time difference",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Far-field plane-wave geometry. Zero degrees is broadside with equal arrival times; the sign follows the angle convention. Near-field sources need actual source-to-microphone distances.",
      "url": "/calculators/microphone-spacing-time-difference/",
      "version": "64c5c307f994fc2b4f692674ae7df9bdc5d1a276eb7ad47712ced9ec4ede7d6f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Microphone separation (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle from broadside (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Sound speed (m/s)",
          "type": "number",
          "required": true,
          "unit": "m/s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Signed arrival difference (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Far-field plane-wave geometry. Zero degrees is broadside with equal arrival times; the sign follows the angle convention. Near-field sources need actual source-to-microphone distances."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Signed arrival difference (ms)",
          "text": "a × sin(b × π ÷ 180) ÷ c × 1000"
        }
      ],
      "example_questions": [
        "Use the Microphone spacing time difference calculator.",
        "Help me calculate microphone spacing time difference."
      ],
      "retrieval_phrases": [
        "Microphone spacing time difference",
        "microphone spacing time difference"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.2,
            "b": 30,
            "c": 343
          },
          "outputs": [
            {
              "label": "Signed arrival difference (ms)",
              "value": 0.2915451895043732
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify acoustic and tuning conventions; distinguish ideal models from measured room or instrument behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-599",
      "name": "Compressor ratio output",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Static hard-knee transfer curve with ratio at least 1:1. Makeup gain is applied after compression. Attack, release, knee width and signal history are excluded.",
      "url": "/calculators/compressor-ratio-output/",
      "version": "f9035be6c0b2994d519fb1cc89f171131d4cf9a88fa7db8fd96930664c14e1bc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Input level (dB)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Threshold (dB)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Compression ratio",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Makeup gain (dB)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Output level (dB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Gain reduction (dB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Static hard-knee transfer curve with ratio at least 1:1. Makeup gain is applied after compression. Attack, release, knee width and signal history are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Output level (dB)",
          "text": "At or below b, output = a+d. Above b, output = b+(a−b)/c+d."
        },
        {
          "label": "Gain reduction (dB)",
          "text": "max(0, (a−b) × (1−1/c)). Makeup gain is excluded from the gain-reduction amount."
        }
      ],
      "example_questions": [
        "Use the Compressor ratio output calculator.",
        "Help me calculate compressor ratio output."
      ],
      "retrieval_phrases": [
        "Compressor ratio output",
        "compressor ratio output"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": -6,
            "b": -18,
            "c": 4,
            "d": 3
          },
          "outputs": [
            {
              "label": "Output level (dB)",
              "value": -12
            },
            {
              "label": "Gain reduction (dB)",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify acoustic and tuning conventions; distinguish ideal models from measured room or instrument behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-600",
      "name": "True peak headroom planner",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Adds linear gain in decibels to an externally measured true peak. This does not analyse audio, limit peaks, or predict extra peaks introduced by later processing or encoding.",
      "url": "/calculators/true-peak-headroom-planner/",
      "version": "95867cbc21b6ddfc4df6ffa387795abaeee63aa7e39c54a40bd92b87ad8d15b0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured true peak (dBTP)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Desired ceiling (dBTP)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Proposed gain (dB)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Projected true peak (dBTP)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining headroom (dB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Required attenuation (dB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds linear gain in decibels to an externally measured true peak. This does not analyse audio, limit peaks, or predict extra peaks introduced by later processing or encoding."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Projected true peak (dBTP)",
          "text": "a+c"
        },
        {
          "label": "Remaining headroom (dB)",
          "text": "b-a-c"
        },
        {
          "label": "Required attenuation (dB)",
          "text": "max(0,a+c-b)"
        }
      ],
      "example_questions": [
        "Use the True peak headroom planner calculator.",
        "Help me calculate true peak headroom planner."
      ],
      "retrieval_phrases": [
        "True peak headroom planner",
        "true peak headroom planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": -3,
            "b": -1,
            "c": 1
          },
          "outputs": [
            {
              "label": "Projected true peak (dBTP)",
              "value": -2
            },
            {
              "label": "Remaining headroom (dB)",
              "value": 1
            },
            {
              "label": "Required attenuation (dB)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify acoustic and tuning conventions; distinguish ideal models from measured room or instrument behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-626",
      "name": "Parcel dimensional weight",
      "category": "Shipping and warehouse planning",
      "status": "available",
      "purpose": "Use dimensions already rounded under your carrier rules and your quoted divisor. Take the larger of actual and dimensional weight, then round up to the supplied billing increment. This is not a live shipping quote.",
      "url": "/calculators/parcel-dimensional-weight/",
      "version": "308215777c0b8284a04a90e2c2a3eb7c5c3363ff4d0eb56aa58ca9de20138f97",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Length after carrier rounding (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width after carrier rounding (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Height after carrier rounding (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Carrier divisor (cm³/kg)",
          "type": "number",
          "required": true,
          "unit": "cm³/kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Actual weight (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Billing increment (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Dimensional weight (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Chargeable weight (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Dimensional excess over actual (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use dimensions already rounded under your carrier rules and your quoted divisor. Take the larger of actual and dimensional weight, then round up to the supplied billing increment. This is not a live shipping quote."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Dimensional weight (kg)",
          "text": "a × b × c ÷ d"
        },
        {
          "label": "Chargeable weight (kg)",
          "text": "roundUp(max(a × b × c ÷ d,e) ÷ f) × f"
        },
        {
          "label": "Dimensional excess over actual (kg)",
          "text": "max(0,a × b × c ÷ d-e)"
        }
      ],
      "example_questions": [
        "Use the Parcel dimensional weight calculator.",
        "Help me calculate parcel dimensional weight."
      ],
      "retrieval_phrases": [
        "Parcel dimensional weight",
        "parcel dimensional weight"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 30,
            "c": 20,
            "d": 5000,
            "e": 3,
            "f": 0.5
          },
          "outputs": [
            {
              "label": "Dimensional weight (kg)",
              "value": 4.8
            },
            {
              "label": "Chargeable weight (kg)",
              "value": 5
            },
            {
              "label": "Dimensional excess over actual (kg)",
              "value": 1.7999999999999998
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check packing feasibility and measured throughput; rates and carrier rules must be user supplied or dated.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-631",
      "name": "Shipping label roll yield",
      "category": "Shipping and warehouse planning",
      "status": "available",
      "purpose": "Subtract unusable ends before dividing by full label pitch. Label pitch includes any inter-label gap. Partial labels are not counted.",
      "url": "/calculators/shipping-label-roll-yield/",
      "version": "424b706b9d4caa81d4315920381ea36263a1f32bcfb1b636fba1cfe44217247e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Roll length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Label pitch including gap (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Unusable leader (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Unusable trailer (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usable labels",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Usable roll (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Tail after full labels (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Subtract unusable ends before dividing by full label pitch. Label pitch includes any inter-label gap. Partial labels are not counted."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usable labels",
          "text": "floor((a × 1000-c-d) ÷ b)"
        },
        {
          "label": "Usable roll (mm)",
          "text": "a × 1000-c-d"
        },
        {
          "label": "Tail after full labels (mm)",
          "text": "(a × 1000-c-d) rem b"
        }
      ],
      "example_questions": [
        "Use the Shipping label roll yield calculator.",
        "Help me calculate shipping label roll yield."
      ],
      "retrieval_phrases": [
        "Shipping label roll yield",
        "shipping label roll yield"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 100,
            "c": 200,
            "d": 300
          },
          "outputs": [
            {
              "label": "Usable labels",
              "value": 295
            },
            {
              "label": "Usable roll (mm)",
              "value": 29500
            },
            {
              "label": "Tail after full labels (mm)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check packing feasibility and measured throughput; rates and carrier rules must be user supplied or dated.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-633",
      "name": "Protective fill volume",
      "category": "Shipping and warehouse planning",
      "status": "available",
      "purpose": "Uses the internal box volume less the item displacement. Bulk density must describe the installed fill. Packing geometry, compression and protective performance are not inferred.",
      "url": "/calculators/protective-fill-volume/",
      "version": "1ef6ea181297919d1459a8b211fc47aca11cb070c2136a69c9007dd87a11091d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Internal box length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Internal width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Internal height (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Packed item displacement (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fill bulk density (g/L)",
          "type": "number",
          "required": true,
          "unit": "g/L",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Void volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated fill mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the internal box volume less the item displacement. Bulk density must describe the installed fill. Packing geometry, compression and protective performance are not inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Void volume (L)",
          "text": "a × b × c ÷ 1000-d"
        },
        {
          "label": "Estimated fill mass (g)",
          "text": "(a × b × c ÷ 1000-d) × e"
        }
      ],
      "example_questions": [
        "Use the Protective fill volume calculator.",
        "Help me calculate protective fill volume."
      ],
      "retrieval_phrases": [
        "Protective fill volume",
        "protective fill volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 30,
            "c": 20,
            "d": 10,
            "e": 20
          },
          "outputs": [
            {
              "label": "Void volume (L)",
              "value": 14
            },
            {
              "label": "Estimated fill mass (g)",
              "value": 280
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check packing feasibility and measured throughput; rates and carrier rules must be user supplied or dated.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-640",
      "name": "Loading labour estimate",
      "category": "Shipping and warehouse planning",
      "status": "available",
      "purpose": "Assumes handling work divides evenly among the crew and every worker participates in setup. Travel, breaks, bottlenecks and indivisible jobs can make actual elapsed time longer.",
      "url": "/calculators/loading-labour-estimate/",
      "version": "b7d904726dee6bdd800951b51b2e7ce036594c0eb824b428db9606a6278712c7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Units to handle",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Handling minutes per unit",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Crew size",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Setup minutes for full crew",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Elapsed handling and setup (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total labour hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes handling work divides evenly among the crew and every worker participates in setup. Travel, breaks, bottlenecks and indivisible jobs can make actual elapsed time longer."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Elapsed handling and setup (minutes)",
          "text": "a × b ÷ c+d"
        },
        {
          "label": "Total labour hours",
          "text": "(a × b+c × d) ÷ 60"
        }
      ],
      "example_questions": [
        "Use the Loading labour estimate calculator.",
        "Help me calculate loading labour estimate."
      ],
      "retrieval_phrases": [
        "Loading labour estimate",
        "loading labour estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 2,
            "c": 4,
            "d": 15
          },
          "outputs": [
            {
              "label": "Elapsed handling and setup (minutes)",
              "value": 75
            },
            {
              "label": "Total labour hours",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check packing feasibility and measured throughput; rates and carrier rules must be user supplied or dated.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-644",
      "name": "Dead stock carrying cost",
      "category": "Shipping and warehouse planning",
      "status": "available",
      "purpose": "Simple non-compounding carrying cost on each supplied age band, using 365 days per year. Recovery is a user-entered percentage of recorded stock value; selling costs and accounting rules are excluded.",
      "url": "/calculators/dead-stock-carrying-cost/",
      "version": "c73d87fd973d1beea35eb3948d4f19909f8231bef1d3d7f409c84d97d7dca7a4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Stock values (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Ages (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Annual holding cost (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Recovery value (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Accumulated holding cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Recovery proceeds (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unrecovered value plus holding (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Simple non-compounding carrying cost on each supplied age band, using 365 days per year. Recovery is a user-entered percentage of recorded stock value; selling costs and accounting rules are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Accumulated holding cost (£)",
          "text": "For each matched value and age: value × age/365 × c/100. Sum the costs."
        },
        {
          "label": "Recovery proceeds (£)",
          "text": "sum(a) × d/100."
        },
        {
          "label": "Unrecovered value plus holding (£)",
          "text": "sum(a) − recovery proceeds + accumulated holding cost."
        }
      ],
      "example_questions": [
        "Use the Dead stock carrying cost calculator.",
        "Help me calculate dead stock carrying cost."
      ],
      "retrieval_phrases": [
        "Dead stock carrying cost",
        "dead stock carrying cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,2000",
            "b": "365,180",
            "c": 20,
            "d": 30
          },
          "outputs": [
            {
              "label": "Accumulated holding cost (£)",
              "value": 397.2602739726027
            },
            {
              "label": "Recovery proceeds (£)",
              "value": 900
            },
            {
              "label": "Unrecovered value plus holding (£)",
              "value": 2497.2602739726026
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check packing feasibility and measured throughput; rates and carrier rules must be user supplied or dated.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-827",
      "name": "Required final exam score",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "The current average is normalised over completed work, which carries all weight outside the final exam. No grading curve or institutional rounding policy is assumed.",
      "url": "/calculators/required-final-exam-score/",
      "version": "71e55db3834553944e3a2132a0cad748b990c80578494065ce46b4764fb7494b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "pilot_qualified",
      "inputs": [
        {
          "key": "a",
          "label": "Current average excluding final (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0,
          "maximum": 100
        },
        {
          "key": "b",
          "label": "Final exam weight (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 1e-9,
          "maximum": 100
        },
        {
          "key": "c",
          "label": "Target course grade (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "explicit",
          "minimum": 0,
          "maximum": 100
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required final exam (%)",
          "type": "number",
          "unit": "percent",
          "type_status": "pilot_contract"
        },
        {
          "key": "result_2",
          "label": "Feasibility",
          "type": "string",
          "unit": "none",
          "type_status": "pilot_contract"
        }
      ],
      "assumptions": [
        "The current average is normalised over completed work, which carries all weight outside the final exam. No grading curve or institutional rounding policy is assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": false
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required final exam (%)",
          "text": "(c − a × (1−b/100)) / (b/100)."
        },
        {
          "label": "Feasibility",
          "text": "A required score ≤0 is already secured at zero; above 100 is unattainable within the stated scale; otherwise it is attainable."
        }
      ],
      "example_questions": [
        "What score do I need on my final exam?",
        "Final exam grade needed to reach my target"
      ],
      "retrieval_phrases": [
        "final exam",
        "exam score",
        "exam grade"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 70,
            "b": 40,
            "c": 80
          },
          "outputs": [
            {
              "label": "Required final exam (%)",
              "value": 95
            },
            {
              "label": "Feasibility",
              "value": "Attainable within 0–100%"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "finder_supported": true,
      "adapter_kind": "strict-unit",
      "special": null
    },
    {
      "id": "CC-830",
      "name": "GPA target recovery",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "Uses quality points divided by credits on a zero-to-maximum scale. Repeat replacement, excluded courses and institutional rounding rules are not modelled.",
      "url": "/calculators/gpa-target-recovery/",
      "version": "4c371b39322aa57281c3bddecaad158371db0ebdb28783147bee720520fb4ba6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Completed credits",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Accumulated quality points",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Future credits",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Target GPA",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Maximum GPA",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required future GPA",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Lowest final GPA",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Highest final GPA",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Feasibility",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses quality points divided by credits on a zero-to-maximum scale. Repeat replacement, excluded courses and institutional rounding rules are not modelled."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required future GPA",
          "text": "(d × (a+c) − b)/c."
        },
        {
          "label": "Lowest final GPA",
          "text": "b/(a+c), assuming zero points on future credits."
        },
        {
          "label": "Highest final GPA",
          "text": "(b+c × e)/(a+c), assuming maximum points on future credits."
        },
        {
          "label": "Feasibility",
          "text": "Compare the required future GPA with zero and e."
        }
      ],
      "example_questions": [
        "Use the GPA target recovery calculator.",
        "Help me calculate gpa target recovery."
      ],
      "retrieval_phrases": [
        "GPA target recovery",
        "gpa target recovery"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 180,
            "c": 30,
            "d": 3.2,
            "e": 4
          },
          "outputs": [
            {
              "label": "Required future GPA",
              "value": 3.6
            },
            {
              "label": "Lowest final GPA",
              "value": 2
            },
            {
              "label": "Highest final GPA",
              "value": 3.3333333333333335
            },
            {
              "label": "Feasibility",
              "value": "Attainable on the supplied scale"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-831",
      "name": "Exam negative-marking score",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "Applies your explicit scoring rules to the total question count. Bounds allow every question to have whichever outcome gives the lowest or highest score. No automatic floor at zero is applied.",
      "url": "/calculators/exam-negative-marking-score/",
      "version": "9dc9da6d00beb1f60d97ff2fe8cb20ad2d197e178ea7c650487b09d0fe4e73ba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Correct answers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Wrong answers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Omitted answers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reward per correct",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Penalty per wrong",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Score per omitted",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Raw score",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minimum possible score",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Maximum possible score",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Applies your explicit scoring rules to the total question count. Bounds allow every question to have whichever outcome gives the lowest or highest score. No automatic floor at zero is applied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Raw score",
          "text": "a × d-b × e+c × f"
        },
        {
          "label": "Minimum possible score",
          "text": "(a+b+c) × min(d,-e,f)"
        },
        {
          "label": "Maximum possible score",
          "text": "(a+b+c) × max(d,-e,f)"
        }
      ],
      "example_questions": [
        "Use the Exam negative-marking score calculator.",
        "Help me calculate exam negative-marking score."
      ],
      "retrieval_phrases": [
        "Exam negative-marking score",
        "exam negative marking score"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 10,
            "c": 10,
            "d": 2,
            "e": 0.5,
            "f": 0
          },
          "outputs": [
            {
              "label": "Raw score",
              "value": 55
            },
            {
              "label": "Minimum possible score",
              "value": -25
            },
            {
              "label": "Maximum possible score",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-832",
      "name": "Exam answer guessing expectation",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "Your success probability models an informed guess. Blind guessing assumes exactly one correct option and equally likely choices. Expected values describe repeated trials; individual outcomes differ.",
      "url": "/calculators/exam-answer-guessing-expectation/",
      "version": "694a6650bb1dbdccfc9a3c4b728302e830e516031db967401f818b74b2379daa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Answer options",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Reward if correct",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Penalty if wrong",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Success probability (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Score for skipping",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected score if answering",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected score if skipping",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Blind-guess expected score",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Break-even success probability (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Your success probability models an informed guess. Blind guessing assumes exactly one correct option and equally likely choices. Expected values describe repeated trials; individual outcomes differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected score if answering",
          "text": "d ÷ 100 × b-(1-d ÷ 100) × c"
        },
        {
          "label": "Expected score if skipping",
          "text": "e"
        },
        {
          "label": "Blind-guess expected score",
          "text": "b ÷ a-(1-1 ÷ a) × c"
        },
        {
          "label": "Break-even success probability (%)",
          "text": "(e+c) ÷ (b+c) × 100"
        }
      ],
      "example_questions": [
        "Use the Exam answer guessing expectation calculator.",
        "Help me calculate exam answer guessing expectation."
      ],
      "retrieval_phrases": [
        "Exam answer guessing expectation",
        "exam answer guessing expectation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 1,
            "c": 0.25,
            "d": 25,
            "e": 0
          },
          "outputs": [
            {
              "label": "Expected score if answering",
              "value": 0.0625
            },
            {
              "label": "Expected score if skipping",
              "value": 0
            },
            {
              "label": "Blind-guess expected score",
              "value": 0.0625
            },
            {
              "label": "Break-even success probability (%)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-836",
      "name": "Study effort catch-up",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "Spreads the remaining workload evenly across your chosen study days and sessions. Rest days must already be excluded. Completing more than the target leaves zero required hours.",
      "url": "/calculators/study-effort-catch-up/",
      "version": "707507c708b2890f1cee39dacaf61eecc0ec5291d2e06a7fcc67b2d2dd60e911",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required study hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Completed study hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Remaining study days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sessions per study day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hours remaining",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Hours per study day",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Minutes per session",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Spreads the remaining workload evenly across your chosen study days and sessions. Rest days must already be excluded. Completing more than the target leaves zero required hours."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hours remaining",
          "text": "max(0,a-b)"
        },
        {
          "label": "Hours per study day",
          "text": "max(0,a-b) ÷ c"
        },
        {
          "label": "Minutes per session",
          "text": "max(0,a-b) ÷ c ÷ d × 60"
        }
      ],
      "example_questions": [
        "Use the Study effort catch-up calculator.",
        "Help me calculate study effort catch-up."
      ],
      "retrieval_phrases": [
        "Study effort catch-up",
        "study effort catch up"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 40,
            "c": 20,
            "d": 2
          },
          "outputs": [
            {
              "label": "Hours remaining",
              "value": 60
            },
            {
              "label": "Hours per study day",
              "value": 3
            },
            {
              "label": "Minutes per session",
              "value": 90
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-839",
      "name": "Lecture playback study time",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "Divide each recording by its playback speed, then add the allowance as a percentage of accelerated viewing time. One speed is required per recording.",
      "url": "/calculators/lecture-playback-study-time/",
      "version": "9f6f404aa327da0ba7aede9cafee1d3adc52ab3f741fd0aa5ad57fca50edc825",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Recording lengths (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Playback speeds",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Pause and note allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Viewing time before pauses (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Study time including pauses (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Study time by recording (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Divide each recording by its playback speed, then add the allowance as a percentage of accelerated viewing time. One speed is required per recording."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Viewing time before pauses (minutes)",
          "text": "Sum each recording length divided by its matching playback speed."
        },
        {
          "label": "Study time including pauses (minutes)",
          "text": "Viewing time × (1+c/100)."
        },
        {
          "label": "Study time by recording (minutes)",
          "text": "For each recording: length / speed × (1+c/100)."
        }
      ],
      "example_questions": [
        "Use the Lecture playback study time calculator.",
        "Help me calculate lecture playback study time."
      ],
      "retrieval_phrases": [
        "Lecture playback study time",
        "lecture playback study time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "60,90",
            "b": "1.5,2",
            "c": 20
          },
          "outputs": [
            {
              "label": "Viewing time before pauses (minutes)",
              "value": 85
            },
            {
              "label": "Study time including pauses (minutes)",
              "value": 102
            },
            {
              "label": "Study time by recording (minutes)",
              "value": "48, 54"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-843",
      "name": "Attendance requirement planner",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "All sessions have equal weight. Round the target attended count up to a whole session. A required count above the remaining sessions is reported as unattainable, with zero permitted absences.",
      "url": "/calculators/attendance-requirement-planner/",
      "version": "7b6c2f25de03a4627bf34ea32a62ef9ce65ac1d5ea67f56b779ad2661d7f0373",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sessions held",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sessions attended",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sessions remaining",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Required attendance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Future sessions required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Permitted future absences",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Maximum final attendance (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Feasibility",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All sessions have equal weight. Round the target attended count up to a whole session. A required count above the remaining sessions is reported as unattainable, with zero permitted absences."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Future sessions required",
          "text": "max(0, roundUp((a+c) × d/100) − b)."
        },
        {
          "label": "Permitted future absences",
          "text": "max(0, c − future sessions required). Check feasibility separately."
        },
        {
          "label": "Maximum final attendance (%)",
          "text": "(b+c)/(a+c) × 100."
        },
        {
          "label": "Feasibility",
          "text": "The target is attainable if future sessions required ≤ c."
        }
      ],
      "example_questions": [
        "Use the Attendance requirement planner calculator.",
        "Help me calculate attendance requirement planner."
      ],
      "retrieval_phrases": [
        "Attendance requirement planner",
        "attendance requirement planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 15,
            "c": 10,
            "d": 80
          },
          "outputs": [
            {
              "label": "Future sessions required",
              "value": 9
            },
            {
              "label": "Permitted future absences",
              "value": 1
            },
            {
              "label": "Maximum final attendance (%)",
              "value": 83.33333333333334
            },
            {
              "label": "Feasibility",
              "value": "Target remains attainable"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-844",
      "name": "Classroom group allocator",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "Choose the nearest feasible group count to students / desired size, then distribute students as evenly as possible. Groups differ by at most one; this allocates counts, not named students.",
      "url": "/calculators/classroom-group-allocator/",
      "version": "3fe66dffcefe1f9a7fc72129fdf23abf499d19b7c4950e111be16675513731c6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Students",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired group size",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Minimum group size",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Maximum group size",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Group count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Balanced group sizes",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Choose the nearest feasible group count to students / desired size, then distribute students as evenly as possible. Groups differ by at most one; this allocates counts, not named students."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Group count",
          "text": "Feasible group counts range from roundUp(a/d) through floor(a/c). Clamp round(a/b) to that range; reject if the range is empty."
        },
        {
          "label": "Balanced group sizes",
          "text": "Give each group floor(a/group count) students, then give one extra to the first a remainder group count groups."
        }
      ],
      "example_questions": [
        "Use the Classroom group allocator calculator.",
        "Help me calculate classroom group allocator."
      ],
      "retrieval_phrases": [
        "Classroom group allocator",
        "classroom group allocator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 4,
            "c": 3,
            "d": 5
          },
          "outputs": [
            {
              "label": "Group count",
              "value": 8
            },
            {
              "label": "Balanced group sizes",
              "value": "4, 4, 4, 4, 4, 4, 3, 3"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-847",
      "name": "Exam time allocation",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "Distribute answering time in proportion to section marks, after setting aside reading and review. Fractional minutes are retained; question difficulty is not inferred.",
      "url": "/calculators/exam-time-allocation/",
      "version": "c4f222323f06d7d0cee35295c34d1f514b6e3de88ff7f0cb39ba5c0f3a7c7aa8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Section marks",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Exam minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reading reserve (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Review reserve (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Section minutes",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Available answering minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Distribute answering time in proportion to section marks, after setting aside reading and review. Fractional minutes are retained; question difficulty is not inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Section minutes",
          "text": "For each section mark x: (b−c−d) × x/sum(a)."
        },
        {
          "label": "Available answering minutes",
          "text": "b−c−d."
        }
      ],
      "example_questions": [
        "Use the Exam time allocation calculator.",
        "Help me calculate exam time allocation."
      ],
      "retrieval_phrases": [
        "Exam time allocation",
        "exam time allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,30,50",
            "b": 120,
            "c": 10,
            "d": 10
          },
          "outputs": [
            {
              "label": "Section minutes",
              "value": "20, 30, 50"
            },
            {
              "label": "Available answering minutes",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-848",
      "name": "Learning materials print planner",
      "category": "Education and learning planning",
      "status": "available",
      "purpose": "Each student gets a separate complete copy. Round sheets per copy before multiplying by copies; an odd final page cannot share its reverse with the next student. Ink and finishing are excluded.",
      "url": "/calculators/learning-materials-print-planner/",
      "version": "9e140dc1fc23049fb479464522814b8a6c23c96eba9761607f6bb04c00b72c30",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pages per student",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Class sizes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Sides per sheet (1 or 2)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Spare complete copies",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cost per sheet (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Complete copies",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sheets required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Paper cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each student gets a separate complete copy. Round sheets per copy before multiplying by copies; an odd final page cannot share its reverse with the next student. Ink and finishing are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Complete copies",
          "text": "sum(b)+d"
        },
        {
          "label": "Sheets required",
          "text": "roundUp(a ÷ c) × (sum(b)+d)"
        },
        {
          "label": "Paper cost (£)",
          "text": "roundUp(a ÷ c) × (sum(b)+d) × e"
        }
      ],
      "example_questions": [
        "Use the Learning materials print planner calculator.",
        "Help me calculate learning materials print planner."
      ],
      "retrieval_phrases": [
        "Learning materials print planner",
        "learning materials print planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 7,
            "b": "20,25",
            "c": 2,
            "d": 3,
            "e": 0.02
          },
          "outputs": [
            {
              "label": "Complete copies",
              "value": 48
            },
            {
              "label": "Sheets required",
              "value": 192
            },
            {
              "label": "Paper cost (£)",
              "value": 3.84
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Use explicit user-supplied academic rules and clear rounding; never assume a universal grading policy.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-501",
      "name": "Curtain fabric planner",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Identical panels split the window equally. Enter usable width after side hems and seams. Each panel uses whole vertical fabric drops, joined side by side. Plain fabric only: pattern matching, shrinkage and lining are excluded.",
      "url": "/calculators/curtain-fabric-planner/",
      "version": "801501fd9619c030ab24502ac491b2615d329e7c63a46905f8d1da98a2e3539f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Window width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Finished drop (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Fullness ratio",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Usable width per fabric drop after side hems and seams (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Combined top and bottom allowance (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Finished curtain panels",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fabric drops per panel",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total fabric drops",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cut length per drop (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Fabric length to buy (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Vertical joins",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Identical panels split the window equally. Enter usable width after side hems and seams. Each panel uses whole vertical fabric drops, joined side by side. Plain fabric only: pattern matching, shrinkage and lining are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fabric drops per panel",
          "text": "Round up (window width × fullness ÷ panel count ÷ usable drop width)."
        },
        {
          "label": "Total fabric drops",
          "text": "Multiply drops per panel by panel count."
        },
        {
          "label": "Cut length per drop (cm)",
          "text": "Add the top-and-bottom allowance to the finished drop."
        },
        {
          "label": "Fabric length to buy (m)",
          "text": "Multiply total drops by cut length; divide centimetres by 100."
        },
        {
          "label": "Vertical joins",
          "text": "Each panel has one fewer vertical join than its number of drops."
        }
      ],
      "example_questions": [
        "Use the Curtain fabric planner calculator.",
        "Help me calculate curtain fabric planner."
      ],
      "retrieval_phrases": [
        "Curtain fabric planner",
        "curtain fabric planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 220,
            "c": 2,
            "d": 130,
            "e": 30,
            "f": 2
          },
          "outputs": [
            {
              "label": "Fabric drops per panel",
              "value": 2
            },
            {
              "label": "Total fabric drops",
              "value": 4
            },
            {
              "label": "Cut length per drop (cm)",
              "value": 250
            },
            {
              "label": "Fabric length to buy (m)",
              "value": 10
            },
            {
              "label": "Vertical joins",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-502",
      "name": "Quilt backing yardage",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Compares vertical and horizontal straight-strip backing layouts and chooses the one requiring less fabric length; ties choose vertical. A join consumes twice the seam allowance. Trim excess width; no pattern matching or shrinkage allowance.",
      "url": "/calculators/quilt-backing-yardage/",
      "version": "5b382e8c68f29fad4d2cfa2dcc3755bc16c41923fc95fcf9ec37e9a85e89a3e8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Quilt width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Quilt length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Overhang on every edge (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable fabric width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Seam allowance on each joined edge (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Backing width (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Backing length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Fabric strips",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Suggested strip direction",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Fabric length (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_6",
          "label": "Straight joins",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares vertical and horizontal straight-strip backing layouts and chooses the one requiring less fabric length; ties choose vertical. A join consumes twice the seam allowance. Trim excess width; no pattern matching or shrinkage allowance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Backing width (cm)",
          "text": "Add overhang to both sides of the quilt width."
        },
        {
          "label": "Backing length (cm)",
          "text": "Add overhang to both ends of the quilt length."
        },
        {
          "label": "Fabric strips",
          "text": "For each orientation choose the smallest integer n with n × fabric width − 2 × seam allowance × (n−1) covering the required width."
        },
        {
          "label": "Suggested strip direction",
          "text": "Choose the orientation with the smaller total strip length. Ties use vertical strips."
        },
        {
          "label": "Fabric length (m)",
          "text": "Multiply chosen strip count by backing length along that orientation; divide by 100."
        },
        {
          "label": "Straight joins",
          "text": "Strip count minus one."
        }
      ],
      "example_questions": [
        "Use the Quilt backing yardage calculator.",
        "Help me calculate quilt backing yardage."
      ],
      "retrieval_phrases": [
        "Quilt backing yardage",
        "quilt backing yardage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 150,
            "b": 200,
            "c": 10,
            "d": 110,
            "e": 1
          },
          "outputs": [
            {
              "label": "Backing width (cm)",
              "value": 170
            },
            {
              "label": "Backing length (cm)",
              "value": 220
            },
            {
              "label": "Fabric strips",
              "value": 2
            },
            {
              "label": "Suggested strip direction",
              "value": "Vertical"
            },
            {
              "label": "Fabric length (m)",
              "value": 4.4
            },
            {
              "label": "Straight joins",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-503",
      "name": "Quilt binding strips",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Cut straight strips across the usable fabric width. Enter the actual loss per join for your joining method and an extra allowance for corners and closing the binding. This is not a continuous bias cutting layout.",
      "url": "/calculators/quilt-binding-strips/",
      "version": "3e8c9045239446c8689a037dbe565ebcbaa0f027bf9fbad1cc68bf2474505952",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Quilt perimeter (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cut binding strip width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable fabric width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Length lost at each strip join (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Extra length for corners and final closure (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Binding length needed (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Strip count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Fabric length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Joined binding available (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Cut straight strips across the usable fabric width. Enter the actual loss per join for your joining method and an extra allowance for corners and closing the binding. This is not a continuous bias cutting layout."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Binding length needed (cm)",
          "text": "Add perimeter and the extra length allowance."
        },
        {
          "label": "Strip count",
          "text": "Choose the smallest integer n with n × usable width − (n−1) × join loss at least the needed length."
        },
        {
          "label": "Fabric length (cm)",
          "text": "Multiply strip count by cut strip width."
        },
        {
          "label": "Joined binding available (cm)",
          "text": "Add all strip lengths and subtract loss at every join."
        }
      ],
      "example_questions": [
        "Use the Quilt binding strips calculator.",
        "Help me calculate quilt binding strips."
      ],
      "retrieval_phrases": [
        "Quilt binding strips",
        "quilt binding strips"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 600,
            "b": 6,
            "c": 110,
            "d": 6,
            "e": 30
          },
          "outputs": [
            {
              "label": "Binding length needed (cm)",
              "value": 630
            },
            {
              "label": "Strip count",
              "value": 6
            },
            {
              "label": "Fabric length (cm)",
              "value": 36
            },
            {
              "label": "Joined binding available (cm)",
              "value": 630
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-505",
      "name": "Quilt block layout",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Uses finished dimensions. Sashing lies only between blocks, with cornerstones at intersections. Counts do not include cutting allowances, outer sashing or fabric yardage.",
      "url": "/calculators/quilt-block-layout/",
      "version": "bac9632ed48edd8606da4391e30b560d9ee7abc57d6b1d4832410fc71e102e2d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Finished block width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Finished block height (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Rows",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Columns",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Finished sashing width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Finished outer border width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Finished quilt width (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Finished quilt height (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Blocks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Vertical sashing pieces",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Horizontal sashing pieces",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_6",
          "label": "Cornerstones",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses finished dimensions. Sashing lies only between blocks, with cornerstones at intersections. Counts do not include cutting allowances, outer sashing or fabric yardage."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Finished quilt width (cm)",
          "text": "Columns × block width + (columns−1) × sashing + 2 × border."
        },
        {
          "label": "Finished quilt height (cm)",
          "text": "Rows × block height + (rows−1) × sashing + 2 × border."
        },
        {
          "label": "Blocks",
          "text": "Rows × columns."
        },
        {
          "label": "Vertical sashing pieces",
          "text": "Rows × (columns−1)."
        },
        {
          "label": "Horizontal sashing pieces",
          "text": "Columns × (rows−1)."
        },
        {
          "label": "Cornerstones",
          "text": "(Rows−1) × (columns−1)."
        }
      ],
      "example_questions": [
        "Use the Quilt block layout calculator.",
        "Help me calculate quilt block layout."
      ],
      "retrieval_phrases": [
        "Quilt block layout",
        "quilt block layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 20,
            "c": 4,
            "d": 3,
            "e": 2,
            "f": 5
          },
          "outputs": [
            {
              "label": "Finished quilt width (cm)",
              "value": 74
            },
            {
              "label": "Finished quilt height (cm)",
              "value": 96
            },
            {
              "label": "Blocks",
              "value": 12
            },
            {
              "label": "Vertical sashing pieces",
              "value": 8
            },
            {
              "label": "Horizontal sashing pieces",
              "value": 9
            },
            {
              "label": "Cornerstones",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-509",
      "name": "Pleat spacing planner",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Evenly distributes identical knife pleats between two equal unpleated margins. A knife pleat consumes twice its depth. Spacing is the repeat pitch of pleats across the finished inner width, not a gap between folded fabric edges.",
      "url": "/calculators/pleat-spacing-planner/",
      "version": "1fbc8c57637c23c73850f0a6f76b0a81ae07313e63db67e97b71593574e46aa5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fabric width after edge hems (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target finished width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Knife pleats",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Unpleated margin at each end (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fabric taken up per pleat (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Pleat depth (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Finished pleat pitch (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Evenly distributes identical knife pleats between two equal unpleated margins. A knife pleat consumes twice its depth. Spacing is the repeat pitch of pleats across the finished inner width, not a gap between folded fabric edges."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fabric taken up per pleat (cm)",
          "text": "(Fabric width − finished width) ÷ pleat count."
        },
        {
          "label": "Pleat depth (cm)",
          "text": "Divide take-up per pleat by two."
        },
        {
          "label": "Finished pleat pitch (cm)",
          "text": "(Finished width − two end margins) ÷ pleat count."
        }
      ],
      "example_questions": [
        "Use the Pleat spacing planner calculator.",
        "Help me calculate pleat spacing planner."
      ],
      "retrieval_phrases": [
        "Pleat spacing planner",
        "pleat spacing planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 100,
            "c": 10,
            "d": 5
          },
          "outputs": [
            {
              "label": "Fabric taken up per pleat (cm)",
              "value": 10
            },
            {
              "label": "Pleat depth (cm)",
              "value": 5
            },
            {
              "label": "Finished pleat pitch (cm)",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-510",
      "name": "Ruffle gathering planner",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Equal-width straight strips are joined end to end. Each join consumes two seam allowances. Enter a ratio of at least one; the result includes the stated end allowance. Strip width and fabric yardage are outside this length-only model.",
      "url": "/calculators/ruffle-gathering-planner/",
      "version": "1b87d983dde55b495a41e58a63e2b3148a8da4a3e477ad149946c1ed17907b14",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Finished trim length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Gathering ratio",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable strip length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Seam allowance at each joining edge (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Combined allowance for the two exposed ends (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ungathered usable length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Strip count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Strip joins",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Gross cut length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Excess after joins and allowances (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Equal-width straight strips are joined end to end. Each join consumes two seam allowances. Enter a ratio of at least one; the result includes the stated end allowance. Strip width and fabric yardage are outside this length-only model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ungathered usable length (cm)",
          "text": "Finished trim length × gathering ratio."
        },
        {
          "label": "Strip count",
          "text": "Choose the smallest n satisfying n × strip length − 2 × seam allowance × (n−1) ≥ gathered length + end allowance."
        },
        {
          "label": "Strip joins",
          "text": "Strip count minus one."
        },
        {
          "label": "Gross cut length (cm)",
          "text": "Strip count × strip length."
        },
        {
          "label": "Excess after joins and allowances (cm)",
          "text": "Gross length minus join losses, end allowance and ungathered required length."
        }
      ],
      "example_questions": [
        "Use the Ruffle gathering planner calculator.",
        "Help me calculate ruffle gathering planner."
      ],
      "retrieval_phrases": [
        "Ruffle gathering planner",
        "ruffle gathering planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 2,
            "c": 110,
            "d": 1,
            "e": 4
          },
          "outputs": [
            {
              "label": "Ungathered usable length (cm)",
              "value": 600
            },
            {
              "label": "Strip count",
              "value": 6
            },
            {
              "label": "Strip joins",
              "value": 5
            },
            {
              "label": "Gross cut length (cm)",
              "value": 660
            },
            {
              "label": "Excess after joins and allowances (cm)",
              "value": 46
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-524",
      "name": "Weaving warp length",
      "category": "Sewing, knitting and textile crafts",
      "status": "available",
      "purpose": "Take-up and shrinkage are successive length losses, so each is reversed by division. Sample allowance is already measured as warp length; loom waste and sample are added once per end. Use measured percentages for your yarn and structure.",
      "url": "/calculators/weaving-warp-length/",
      "version": "96a5e2155d29cfd6a9bb71e2c7968901827bc30009e98601a16a51404a2d8e07",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Finished cloth length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Loom waste (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Take-up as percentage of loom length (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Wet-finish shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional sample warp (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Warp ends",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Warp length per end (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total warp (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Take-up and shrinkage are successive length losses, so each is reversed by division. Sample allowance is already measured as warp length; loom waste and sample are added once per end. Use measured percentages for your yarn and structure."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Warp length per end (m)",
          "text": "Finished length ÷ (1−take-up/100) ÷ (1−shrinkage/100), then add loom waste and sample allowance; divide by 100."
        },
        {
          "label": "Total warp (m)",
          "text": "Warp length per end × number of ends."
        }
      ],
      "example_questions": [
        "Use the Weaving warp length calculator.",
        "Help me calculate weaving warp length."
      ],
      "retrieval_phrases": [
        "Weaving warp length",
        "weaving warp length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 50,
            "c": 10,
            "d": 10,
            "e": 20,
            "f": 100
          },
          "outputs": [
            {
              "label": "Warp length per end (m)",
              "value": 3.169135802469136
            },
            {
              "label": "Total warp (m)",
              "value": 316.91358024691357
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Document craft conventions and verify measurements against an independently worked pattern.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-537",
      "name": "Router bushing offset",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "Calculates ideal straight-edge cut dimensions from concentric diameters. Inside-following reduces dimensions; outside-following increases them. Corner radii, bushing clearance, runout, depth and tool compatibility need separate checks.",
      "url": "/calculators/router-bushing-offset/",
      "version": "6e8ea78483705d4a5bd7c3a775a37fd49453129fe508c31a8d2ba29f469ea837",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Guide bushing outside diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cutter diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Rectangular template width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Rectangular template height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Follow inside opening (1) or outside template (2)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Offset per edge (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Resulting cut width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Resulting cut height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Calculates ideal straight-edge cut dimensions from concentric diameters. Inside-following reduces dimensions; outside-following increases them. Corner radii, bushing clearance, runout, depth and tool compatibility need separate checks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Offset per edge (mm)",
          "text": "Half the difference between bushing and cutter diameters."
        },
        {
          "label": "Resulting cut width (mm)",
          "text": "Template width minus twice the offset for inside, plus twice for outside."
        },
        {
          "label": "Resulting cut height (mm)",
          "text": "Template height minus twice the offset for inside, plus twice for outside."
        }
      ],
      "example_questions": [
        "Use the Router bushing offset calculator.",
        "Help me calculate router bushing offset."
      ],
      "retrieval_phrases": [
        "Router bushing offset",
        "router bushing offset"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10,
            "c": 200,
            "d": 100,
            "e": 1
          },
          "outputs": [
            {
              "label": "Offset per edge (mm)",
              "value": 5
            },
            {
              "label": "Resulting cut width (mm)",
              "value": 190
            },
            {
              "label": "Resulting cut height (mm)",
              "value": 90
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-538",
      "name": "Circle jig pivot setting",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "For a retained disk the cutter centre travels outside the desired radius. For a hole it travels inside. This is geometric setup only: check pivot security, tool limits and a test cut separately.",
      "url": "/calculators/circle-jig-pivot-setting/",
      "version": "8c1aad6ef90625664acd2a97fa02ef03b87dad97e43be5b42776bd52832f02f0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target circle diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cutter diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Keep disk (1) or make hole (2)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pivot-to-cutter centre (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "For a retained disk the cutter centre travels outside the desired radius. For a hole it travels inside. This is geometric setup only: check pivot security, tool limits and a test cut separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pivot-to-cutter centre (mm)",
          "text": "Disk: (target diameter + cutter diameter) ÷ 2. Hole: (target diameter − cutter diameter) ÷ 2."
        }
      ],
      "example_questions": [
        "Use the Circle jig pivot setting calculator.",
        "Help me calculate circle jig pivot setting."
      ],
      "retrieval_phrases": [
        "Circle jig pivot setting",
        "circle jig pivot setting"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 10,
            "c": 1
          },
          "outputs": [
            {
              "label": "Pivot-to-cutter centre (mm)",
              "value": 155
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-541",
      "name": "Shelf pin hole layout",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "Coordinates are measured from the cabinet bottom. Exclusion endpoints are inclusive. Enter matching start and end lists, or 0 in both for no exclusions. At most 1,000 candidate positions; diameter and load capacity are not modelled.",
      "url": "/calculators/shelf-pin-hole-layout/",
      "version": "db5dedcd646c7c8d99bf3b71f1bd92192e2a330c28b53f3ee2531541729f286a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cabinet height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "First hole offset from bottom (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hole pitch (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Top clearance (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Excluded zone starts (mm; 0 for none)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "f",
          "label": "Excluded zone ends (mm; 0 for none)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hole count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Hole coordinates (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Coordinates are measured from the cabinet bottom. Exclusion endpoints are inclusive. Enter matching start and end lists, or 0 in both for no exclusions. At most 1,000 candidate positions; diameter and load capacity are not modelled."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hole count",
          "text": "Generate first offset + i × pitch through height − top clearance, inclusive; remove positions in any excluded interval."
        },
        {
          "label": "Hole coordinates (mm)",
          "text": "List the remaining positions from the cabinet bottom in increasing order."
        }
      ],
      "example_questions": [
        "Use the Shelf pin hole layout calculator.",
        "Help me calculate shelf pin hole layout."
      ],
      "retrieval_phrases": [
        "Shelf pin hole layout",
        "shelf pin hole layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 800,
            "b": 50,
            "c": 100,
            "d": 50,
            "e": "300",
            "f": "450"
          },
          "outputs": [
            {
              "label": "Hole count",
              "value": 6
            },
            {
              "label": "Hole coordinates (mm)",
              "value": "50, 150, 250, 550, 650, 750"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-545",
      "name": "Turned blank yield",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "Axis-aligned rectangular blanks, with no rotation or nesting. One kerf is budgeted after every blank on each axis, including the final cut: this conservative convention leaves a separately measurable remainder. Does not evaluate timber defects or turning safety.",
      "url": "/calculators/turned-blank-yield/",
      "version": "8d3fe67f0db19ec3d46fe582911fe38117e72b7c18ff2e51e0b1abd9c0950e94",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Stock length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Stock width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Stock thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Blank length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Blank width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Blank thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "g",
          "label": "Saw kerf (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Blank count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Blanks along length",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Blanks across width",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Blanks through thickness",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Length remainder (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_6",
          "label": "Width remainder (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_7",
          "label": "Thickness remainder (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Axis-aligned rectangular blanks, with no rotation or nesting. One kerf is budgeted after every blank on each axis, including the final cut: this conservative convention leaves a separately measurable remainder. Does not evaluate timber defects or turning safety."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Blank count",
          "text": "Multiply the three axis counts."
        },
        {
          "label": "Blanks along length",
          "text": "Round down stock length ÷ (blank length + kerf)."
        },
        {
          "label": "Blanks across width",
          "text": "Round down stock width ÷ (blank width + kerf)."
        },
        {
          "label": "Blanks through thickness",
          "text": "Round down stock thickness ÷ (blank thickness + kerf)."
        },
        {
          "label": "Length remainder (mm)",
          "text": "Stock length minus length count × (blank length + kerf)."
        },
        {
          "label": "Width remainder (mm)",
          "text": "Stock width minus width count × (blank width + kerf)."
        },
        {
          "label": "Thickness remainder (mm)",
          "text": "Stock thickness minus thickness count × (blank thickness + kerf)."
        }
      ],
      "example_questions": [
        "Use the Turned blank yield calculator.",
        "Help me calculate turned blank yield."
      ],
      "retrieval_phrases": [
        "Turned blank yield",
        "turned blank yield"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 100,
            "c": 100,
            "d": 200,
            "e": 40,
            "f": 40,
            "g": 3
          },
          "outputs": [
            {
              "label": "Blank count",
              "value": 16
            },
            {
              "label": "Blanks along length",
              "value": 4
            },
            {
              "label": "Blanks across width",
              "value": 2
            },
            {
              "label": "Blanks through thickness",
              "value": 2
            },
            {
              "label": "Length remainder (mm)",
              "value": 188
            },
            {
              "label": "Width remainder (mm)",
              "value": 14
            },
            {
              "label": "Thickness remainder (mm)",
              "value": 14
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-550",
      "name": "Sanding disc price comparison",
      "category": "Woodworking and workshop layout",
      "status": "available",
      "purpose": "Compare equivalent sanding tasks using your measured service life. Lists match in order. Cost per hour ignores machine energy and labour. Ties choose the first pack; a cheaper hour is not a claim about finish quality.",
      "url": "/calculators/sanding-disc-price-comparison/",
      "version": "cc39be73876c0bb858a037e135a088f04c05d38e56caf14e639c3af725880557",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pack prices (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Discs in each pack",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured minutes of use per disc",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cost per disc (£), in pack order",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cost per hour (£), in pack order",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Lowest cost-per-hour pack number",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compare equivalent sanding tasks using your measured service life. Lists match in order. Cost per hour ignores machine energy and labour. Ties choose the first pack; a cheaper hour is not a claim about finish quality."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cost per disc (£), in pack order",
          "text": "For each pack, price divided by disc count. Listed values round to six decimal places."
        },
        {
          "label": "Cost per hour (£), in pack order",
          "text": "For each pack, cost per disc × 60 ÷ measured minutes per disc."
        },
        {
          "label": "Lowest cost-per-hour pack number",
          "text": "Choose the first pack with the smallest unrounded cost per hour."
        }
      ],
      "example_questions": [
        "Use the Sanding disc price comparison calculator.",
        "Help me calculate sanding disc price comparison."
      ],
      "retrieval_phrases": [
        "Sanding disc price comparison",
        "sanding disc price comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "12,20",
            "b": "10,20",
            "c": "30,20"
          },
          "outputs": [
            {
              "label": "Cost per disc (£), in pack order",
              "value": "1.2, 1"
            },
            {
              "label": "Cost per hour (£), in pack order",
              "value": "2.4, 3"
            },
            {
              "label": "Lowest cost-per-hour pack number",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified method review for machining and joinery; test geometry and fit before claiming usable cutting instructions.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-601",
      "name": "Banquet table seating plan",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Reserved seats are additional places kept empty, not guests already included in the count. Guests fill tables in order; spare tables stay entirely empty. This is capacity arithmetic, not a named seating assignment.",
      "url": "/calculators/banquet-table-seating-plan/",
      "version": "ff6de6e416c2f8e46be1e915f5a4b844454ebc25270aa3b4ee781cf4442efcc8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Guests to seat",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Seats per table",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Additional seats held empty",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Spare empty tables",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Tables including spares",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total seats",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Empty seats including reserved",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Guest counts by table",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reserved seats are additional places kept empty, not guests already included in the count. Guests fill tables in order; spare tables stay entirely empty. This is capacity arithmetic, not a named seating assignment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Tables including spares",
          "text": "Round up (guests + reserved empty seats) ÷ seats per table; add spare tables."
        },
        {
          "label": "Total seats",
          "text": "Table count × seats per table."
        },
        {
          "label": "Empty seats including reserved",
          "text": "Total seats minus guests."
        },
        {
          "label": "Guest counts by table",
          "text": "Fill each table up to its capacity in sequence; remaining tables have zero guests."
        }
      ],
      "example_questions": [
        "Use the Banquet table seating plan calculator.",
        "Help me calculate banquet table seating plan."
      ],
      "retrieval_phrases": [
        "Banquet table seating plan",
        "banquet table seating plan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 95,
            "b": 10,
            "c": 5,
            "d": 1
          },
          "outputs": [
            {
              "label": "Tables including spares",
              "value": 11
            },
            {
              "label": "Total seats",
              "value": 110
            },
            {
              "label": "Empty seats including reserved",
              "value": 15
            },
            {
              "label": "Guest counts by table",
              "value": "10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 0"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-602",
      "name": "Circular table place spacing",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Place width is measured along the tabletop circumference, not as a straight chord. The usable percentage represents one combined arc. This gives geometric place capacity, not ergonomic or legal occupancy approval.",
      "url": "/calculators/circular-table-place-spacing/",
      "version": "dabba31bf92d3f71256dfcb419000ba528a67092a03c8a43450a4ec2f423bc0e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Table diameter (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Required place-setting arc width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable circumference (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usable arc length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Geometric places",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Arc spacing per place (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Place width is measured along the tabletop circumference, not as a straight chord. The usable percentage represents one combined arc. This gives geometric place capacity, not ergonomic or legal occupancy approval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usable arc length (cm)",
          "text": "π × diameter × usable percentage ÷ 100."
        },
        {
          "label": "Geometric places",
          "text": "Round down usable arc length ÷ required arc width."
        },
        {
          "label": "Arc spacing per place (cm)",
          "text": "Divide usable arc by place count; if none fit, report that explicitly."
        }
      ],
      "example_questions": [
        "Use the Circular table place spacing calculator.",
        "Help me calculate circular table place spacing."
      ],
      "retrieval_phrases": [
        "Circular table place spacing",
        "circular table place spacing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 180,
            "b": 60,
            "c": 100
          },
          "outputs": [
            {
              "label": "Usable arc length (cm)",
              "value": 565.4866776461628
            },
            {
              "label": "Geometric places",
              "value": 9
            },
            {
              "label": "Arc spacing per place (cm)",
              "value": 62.83185307179586
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-613",
      "name": "Ice quantity for an event",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Servings and ice per serving are supplied by you. This arithmetic does not predict weather-related melting or recommend consumption. Chilling reserve is additional ice separate from the servings.",
      "url": "/calculators/ice-quantity-for-an-event/",
      "version": "32a546acc36cefc51f89f4730d5708751fda74061ab06cf04bf11c6180d5f050",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Guests",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Servings per guest",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Ice per serving (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Extra chilling reserve (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Ice bag weight (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Serving ice (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total ice target (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Whole bags",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Purchased ice (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Servings and ice per serving are supplied by you. This arithmetic does not predict weather-related melting or recommend consumption. Chilling reserve is additional ice separate from the servings."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Serving ice (kg)",
          "text": "Guests × servings per guest × grams per serving ÷ 1,000."
        },
        {
          "label": "Total ice target (kg)",
          "text": "Add extra chilling reserve."
        },
        {
          "label": "Whole bags",
          "text": "Round up total target ÷ bag weight."
        },
        {
          "label": "Purchased ice (kg)",
          "text": "Whole bags × bag weight."
        }
      ],
      "example_questions": [
        "Use the Ice quantity for an event calculator.",
        "Help me calculate ice quantity for an event."
      ],
      "retrieval_phrases": [
        "Ice quantity for an event",
        "ice quantity for an event"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 3,
            "c": 100,
            "d": 5,
            "e": 2
          },
          "outputs": [
            {
              "label": "Serving ice (kg)",
              "value": 30
            },
            {
              "label": "Total ice target (kg)",
              "value": 35
            },
            {
              "label": "Whole bags",
              "value": 18
            },
            {
              "label": "Purchased ice (kg)",
              "value": 36
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-615",
      "name": "Balloon garland quantity",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Use a measured balloon density and relative size weights. Allocates the rounded total by largest fractional remainder; ties favour the earlier size. Weights need not sum to 100. Spare percentage is an additional quantity, not an expected failure probability.",
      "url": "/calculators/balloon-garland-quantity/",
      "version": "d5cfc16831af950288bb8e0f0378c114bcd6f31b6973764684ee88f830f39a3b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Garland length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured balloons per metre",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Size mix weights in your chosen order",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Spare percentage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Balloon total including spares",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Counts by size in input order",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use a measured balloon density and relative size weights. Allocates the rounded total by largest fractional remainder; ties favour the earlier size. Weights need not sum to 100. Spare percentage is an additional quantity, not an expected failure probability."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Balloon total including spares",
          "text": "Round up length × balloons per metre × (1 + spare percentage/100)."
        },
        {
          "label": "Counts by size in input order",
          "text": "Allocate total in proportion to weights, round down each, then give remaining balloons to the largest fractional remainders. Ties use input order."
        }
      ],
      "example_questions": [
        "Use the Balloon garland quantity calculator.",
        "Help me calculate balloon garland quantity."
      ],
      "retrieval_phrases": [
        "Balloon garland quantity",
        "balloon garland quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 20,
            "c": "3,2",
            "d": 10
          },
          "outputs": [
            {
              "label": "Balloon total including spares",
              "value": 110
            },
            {
              "label": "Counts by size in input order",
              "value": "66, 44"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-618",
      "name": "Wedding stationery quantities",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Invitations are counted per household and inserts per individual guest. Extras are item counts, not percentages. Envelopes are one per invitation. Reply cards or other stationery need separate counts.",
      "url": "/calculators/wedding-stationery-quantities/",
      "version": "4311785923a30077bd5bf50f2698b97647b510755a445a5f6bc4834c4790e3ed",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Households receiving invitations",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Guests receiving individual inserts",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Invitations per household",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Inserts per guest",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Extra invitations",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Extra inserts",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Invitations",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Individual inserts",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Envelopes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Invitations are counted per household and inserts per individual guest. Extras are item counts, not percentages. Envelopes are one per invitation. Reply cards or other stationery need separate counts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Invitations",
          "text": "Households × invitations per household + extra invitations."
        },
        {
          "label": "Individual inserts",
          "text": "Guests × inserts per guest + extra inserts."
        },
        {
          "label": "Envelopes",
          "text": "One envelope per invitation, including extras."
        }
      ],
      "example_questions": [
        "Use the Wedding stationery quantities calculator.",
        "Help me calculate wedding stationery quantities."
      ],
      "retrieval_phrases": [
        "Wedding stationery quantities",
        "wedding stationery quantities"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 100,
            "c": 1,
            "d": 2,
            "e": 5,
            "f": 10
          },
          "outputs": [
            {
              "label": "Invitations",
              "value": 65
            },
            {
              "label": "Individual inserts",
              "value": 210
            },
            {
              "label": "Envelopes",
              "value": 65
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-621",
      "name": "Cloakroom ticket allocation",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Identical racks hold one coat per place. Reserve adds capacity to the expected coat count. Ticket ranges cover the target including reserve; spare rack positions beyond that target need no ticket. This is not a floor-space or staffing plan.",
      "url": "/calculators/cloakroom-ticket-allocation/",
      "version": "981508d74c5e84b0c5eec0055d0a144d088ac83683f581a114991db536c51824",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Expected coats",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Places per rack",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Extra capacity reserve (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ticketed capacity target",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Racks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused rack places",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Numbered ticket batches by rack",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Identical racks hold one coat per place. Reserve adds capacity to the expected coat count. Ticket ranges cover the target including reserve; spare rack positions beyond that target need no ticket. This is not a floor-space or staffing plan."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ticketed capacity target",
          "text": "Round up expected coats × (1 + reserve percentage/100)."
        },
        {
          "label": "Racks",
          "text": "Round up ticketed target ÷ places per rack."
        },
        {
          "label": "Unused rack places",
          "text": "Total rack places minus the ticketed target."
        },
        {
          "label": "Numbered ticket batches by rack",
          "text": "Assign consecutive inclusive ticket ranges, up to each rack capacity; the last range ends at the target."
        }
      ],
      "example_questions": [
        "Use the Cloakroom ticket allocation calculator.",
        "Help me calculate cloakroom ticket allocation."
      ],
      "retrieval_phrases": [
        "Cloakroom ticket allocation",
        "cloakroom ticket allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 150,
            "b": 40,
            "c": 10
          },
          "outputs": [
            {
              "label": "Ticketed capacity target",
              "value": 165
            },
            {
              "label": "Racks",
              "value": 5
            },
            {
              "label": "Unused rack places",
              "value": 35
            },
            {
              "label": "Numbered ticket batches by rack",
              "value": "1–40, 41–80, 81–120, 121–160, 161–165"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-632",
      "name": "Packing tape consumption",
      "category": "Shipping and warehouse planning",
      "status": "available",
      "purpose": "Seals both the top and bottom. Centre seal uses one lengthwise strip per face. H seal adds two crosswise strips per face. Each strip gets the entered extension at both ends. Does not include waste, rework or tape stretch.",
      "url": "/calculators/packing-tape-consumption/",
      "version": "4e2bd60e02573827fd043865c79b950d143bc8ca4dfc9830bdfd1c51340a6ad1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Carton length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Carton width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tape extension at each end of a strip (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Centre seal (1) or H seal (2)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Cartons",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Tape roll length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Tape per carton (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total tape (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Whole rolls",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Seals both the top and bottom. Centre seal uses one lengthwise strip per face. H seal adds two crosswise strips per face. Each strip gets the entered extension at both ends. Does not include waste, rework or tape stretch."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Tape per carton (m)",
          "text": "Two faces × [length + 2 × extension +, for H seal, 2 × (width + 2 × extension)], divided by 100."
        },
        {
          "label": "Total tape (m)",
          "text": "Tape per carton × carton count."
        },
        {
          "label": "Whole rolls",
          "text": "Round up total tape ÷ roll length."
        }
      ],
      "example_questions": [
        "Use the Packing tape consumption calculator.",
        "Help me calculate packing tape consumption."
      ],
      "retrieval_phrases": [
        "Packing tape consumption",
        "packing tape consumption"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 30,
            "c": 5,
            "d": 2,
            "e": 20,
            "f": 50
          },
          "outputs": [
            {
              "label": "Tape per carton (m)",
              "value": 2.6
            },
            {
              "label": "Total tape (m)",
              "value": 52
            },
            {
              "label": "Whole rolls",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check packing feasibility and measured throughput; rates and carrier rules must be user supplied or dated.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-636",
      "name": "Delivery route stop capacity",
      "category": "Shipping and warehouse planning",
      "status": "available",
      "purpose": "A deterministic average-time budget. Every stop consumes the stated driving plus service time; fixed depot time is entered separately. Does not optimize a route or predict traffic, time windows or legally required breaks.",
      "url": "/calculators/delivery-route-stop-capacity/",
      "version": "0976e4f33a29def0d6c603eb69fee3a03ccf2577b602f410d06ad6f8e05689bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Shift length (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Average driving time per stop (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average service time per stop (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Breaks (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fixed depot travel and preparation (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Feasible stops",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Stop work time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused shift buffer (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A deterministic average-time budget. Every stop consumes the stated driving plus service time; fixed depot time is entered separately. Does not optimize a route or predict traffic, time windows or legally required breaks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Feasible stops",
          "text": "Round down (shift − breaks − fixed time) ÷ (drive time + service time)."
        },
        {
          "label": "Stop work time (minutes)",
          "text": "Stop count × (drive time + service time)."
        },
        {
          "label": "Unused shift buffer (minutes)",
          "text": "Shift minus breaks, fixed time and stop work time."
        }
      ],
      "example_questions": [
        "Use the Delivery route stop capacity calculator.",
        "Help me calculate delivery route stop capacity."
      ],
      "retrieval_phrases": [
        "Delivery route stop capacity",
        "delivery route stop capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 480,
            "b": 12,
            "c": 8,
            "d": 30,
            "e": 50
          },
          "outputs": [
            {
              "label": "Feasible stops",
              "value": 20
            },
            {
              "label": "Stop work time (minutes)",
              "value": 400
            },
            {
              "label": "Unused shift buffer (minutes)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check packing feasibility and measured throughput; rates and carrier rules must be user supplied or dated.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-851",
      "name": "Page transfer budget",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Groups match in order. A cold visit transfers every asset once. Repeat traffic is an expected-byte scenario based on supplied cache hits, excluding request headers, revalidation and compression changes.",
      "url": "/calculators/page-transfer-budget/",
      "version": "deb0bf9bf1419d41c9522e722387bfd6c1513b3e3ad69c55848ac3548baee628",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Asset counts by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Compressed bytes per asset in each group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Repeat-visit cache hit percentages by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cold transfer (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected repeat transfer (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected bytes saved",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Groups match in order. A cold visit transfers every asset once. Repeat traffic is an expected-byte scenario based on supplied cache hits, excluding request headers, revalidation and compression changes."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cold transfer (bytes)",
          "text": "Sum count × compressed bytes over all groups."
        },
        {
          "label": "Expected repeat transfer (bytes)",
          "text": "Sum count × bytes × (1−cache hit percentage/100)."
        },
        {
          "label": "Expected bytes saved",
          "text": "Cold bytes minus repeat bytes."
        }
      ],
      "example_questions": [
        "Use the Page transfer budget calculator.",
        "Help me calculate page transfer budget."
      ],
      "retrieval_phrases": [
        "Page transfer budget",
        "page transfer budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,3",
            "b": "1000,2000",
            "c": "0,50"
          },
          "outputs": [
            {
              "label": "Cold transfer (bytes)",
              "value": 7000
            },
            {
              "label": "Expected repeat transfer (bytes)",
              "value": 4000
            },
            {
              "label": "Expected bytes saved",
              "value": 3000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-852",
      "name": "Image lazy-loading savings",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Initial image indices are unique. The scenario loads the stated fraction of remaining images in page order, rounding the number upward. It estimates transferred image bytes, not browser behavior, network time or actual user scroll patterns.",
      "url": "/calculators/image-lazy-loading-savings/",
      "version": "2ff6dec11edfbfc361b136c17522cca61b7ec740df3e2a44a9e938bbca6e0619",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Image byte sizes in page order",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Initially loaded image numbers (1-based)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Remaining images reached by scrolling (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Initial image bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Scenario total image bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Eager-load image bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Scenario bytes saved",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Initial image indices are unique. The scenario loads the stated fraction of remaining images in page order, rounding the number upward. It estimates transferred image bytes, not browser behavior, network time or actual user scroll patterns."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Initial image bytes",
          "text": "Sum sizes at the initially loaded indices."
        },
        {
          "label": "Scenario total image bytes",
          "text": "Add the first roundUp(remaining count × scroll percentage/100) remaining images to initial bytes."
        },
        {
          "label": "Eager-load image bytes",
          "text": "Sum all image byte sizes."
        },
        {
          "label": "Scenario bytes saved",
          "text": "Eager-load bytes minus scenario total."
        }
      ],
      "example_questions": [
        "Use the Image lazy-loading savings calculator.",
        "Help me calculate image lazy-loading savings."
      ],
      "retrieval_phrases": [
        "Image lazy-loading savings",
        "image lazy loading savings"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200,300,400",
            "b": "1,2",
            "c": 50
          },
          "outputs": [
            {
              "label": "Initial image bytes",
              "value": 300
            },
            {
              "label": "Scenario total image bytes",
              "value": 600
            },
            {
              "label": "Eager-load image bytes",
              "value": 1000
            },
            {
              "label": "Scenario bytes saved",
              "value": 400
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-853",
      "name": "Responsive image slot planner",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "For each slot, choose the smallest supplied source width at least as large as slot × pixel ratio. Report a missing source when none fits. This deterministic planning rule does not reproduce every browser image-selection decision; it ignores art direction and network preferences.",
      "url": "/calculators/responsive-image-slot-planner/",
      "version": "77633e48ffbc13330131bc6c7c2e8af10b15a9653db81027c1cf443b7fb7727a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rendered slot widths (CSS px)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Device pixel ratios for those slots",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Available source widths (image px)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required source widths (px)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Selected source widths or missing targets",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "For each slot, choose the smallest supplied source width at least as large as slot × pixel ratio. Report a missing source when none fits. This deterministic planning rule does not reproduce every browser image-selection decision; it ignores art direction and network preferences."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required source widths (px)",
          "text": "Round up each CSS slot width × its device pixel ratio."
        },
        {
          "label": "Selected source widths or missing targets",
          "text": "Pick the smallest available source at least that wide; otherwise show the missing minimum."
        }
      ],
      "example_questions": [
        "Use the Responsive image slot planner calculator.",
        "Help me calculate responsive image slot planner."
      ],
      "retrieval_phrases": [
        "Responsive image slot planner",
        "responsive image slot planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "320,600",
            "b": "2,1",
            "c": "400,640,800"
          },
          "outputs": [
            {
              "label": "Required source widths (px)",
              "value": "640, 600"
            },
            {
              "label": "Selected source widths or missing targets",
              "value": "640, 640"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-854",
      "name": "Web font subset savings",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Each uncached visit downloads every listed font weight. Cached visits transfer no font bytes. Both scenarios use the same cache-hit assumption. Confirm that the subset retains every required glyph; headers and revalidation are excluded.",
      "url": "/calculators/web-font-subset-savings/",
      "version": "e6c97a67093a6baa27b93e57a9d14a5fbe7915d978d4db13c239aad93680958d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original font bytes by weight",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Subset font bytes by weight",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Visits",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Visits with all fonts cached (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Original transfer (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Subset transfer (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Transfer saved (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Reduction (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each uncached visit downloads every listed font weight. Cached visits transfer no font bytes. Both scenarios use the same cache-hit assumption. Confirm that the subset retains every required glyph; headers and revalidation are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Original transfer (bytes)",
          "text": "Sum original sizes × visits × (1−cached percentage/100)."
        },
        {
          "label": "Subset transfer (bytes)",
          "text": "Sum subset sizes × uncached visits."
        },
        {
          "label": "Transfer saved (bytes)",
          "text": "Original transfer minus subset transfer."
        },
        {
          "label": "Reduction (%)",
          "text": "Byte reduction per uncached visit divided by original bytes × 100."
        }
      ],
      "example_questions": [
        "Use the Web font subset savings calculator.",
        "Help me calculate web font subset savings."
      ],
      "retrieval_phrases": [
        "Web font subset savings",
        "web font subset savings"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10000,20000",
            "b": "4000,5000",
            "c": 1000,
            "d": 20
          },
          "outputs": [
            {
              "label": "Original transfer (bytes)",
              "value": 24000000
            },
            {
              "label": "Subset transfer (bytes)",
              "value": 7200000
            },
            {
              "label": "Transfer saved (bytes)",
              "value": 16800000
            },
            {
              "label": "Reduction (%)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-856",
      "name": "Cache hit-rate cost model",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Every request pays the cache lookup charge; only misses pay the origin charge. Supplied flat rates exclude storage, bandwidth, tax, free tiers and minimum charges. Expected miss counts may be fractional.",
      "url": "/calculators/cache-hit-rate-cost-model/",
      "version": "612fe2d1f9640ca573a9240b35f40b82e8ecda249306b4d9457c1fcd1256b591",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Requests",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cache hit rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Origin cost per 1,000 requests (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Cache lookup cost per 1,000 requests (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected origin requests",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Origin cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cache cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Combined cost (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Saving versus origin only (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Every request pays the cache lookup charge; only misses pay the origin charge. Supplied flat rates exclude storage, bandwidth, tax, free tiers and minimum charges. Expected miss counts may be fractional."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected origin requests",
          "text": "Requests × (1−hit rate/100)."
        },
        {
          "label": "Origin cost (£)",
          "text": "Expected misses × origin rate ÷ 1,000."
        },
        {
          "label": "Cache cost (£)",
          "text": "All requests × cache rate ÷ 1,000."
        },
        {
          "label": "Combined cost (£)",
          "text": "Add origin and cache costs."
        },
        {
          "label": "Saving versus origin only (£)",
          "text": "Origin-only request cost minus combined cost."
        }
      ],
      "example_questions": [
        "Use the Cache hit-rate cost model calculator.",
        "Help me calculate cache hit-rate cost model."
      ],
      "retrieval_phrases": [
        "Cache hit-rate cost model",
        "cache hit rate cost model"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000000,
            "b": 90,
            "c": 2,
            "d": 0.1
          },
          "outputs": [
            {
              "label": "Expected origin requests",
              "value": 99999.99999999997
            },
            {
              "label": "Origin cost (£)",
              "value": 199.99999999999994
            },
            {
              "label": "Cache cost (£)",
              "value": 100
            },
            {
              "label": "Combined cost (£)",
              "value": 299.99999999999994
            },
            {
              "label": "Saving versus origin only (£)",
              "value": 1700
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-858",
      "name": "CDN egress invoice comparison",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Uses your supplied flat per-region rates and free allowances; unused regional allowances do not transfer. Request fees are prorated, not rounded up in blocks. No live provider pricing, tiered pricing, currency conversion or tax is included.",
      "url": "/calculators/cdn-egress-invoice-comparison/",
      "version": "126ce0abf658321bcaa452b585cedef823b9ab9f0f405d97578419cf6469844d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Traffic by region (decimal GB)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Price per GB by region (£)",
          "type": "array",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Free GB for each region",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Requests",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Price per 10,000 requests (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Fixed fee (£)",
          "type": "number",
          "required": true,
          "unit": "GBP",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Regional egress charges (£)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total egress charge (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Request charge (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Total scenario invoice (£)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses your supplied flat per-region rates and free allowances; unused regional allowances do not transfer. Request fees are prorated, not rounded up in blocks. No live provider pricing, tiered pricing, currency conversion or tax is included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Regional egress charges (£)",
          "text": "For each region: max(traffic − regional free allowance, 0) × price per GB."
        },
        {
          "label": "Total egress charge (£)",
          "text": "Sum regional egress charges."
        },
        {
          "label": "Request charge (£)",
          "text": "Requests ÷ 10,000 × supplied request price."
        },
        {
          "label": "Total scenario invoice (£)",
          "text": "Egress plus request charge plus fixed fee."
        }
      ],
      "example_questions": [
        "Use the CDN egress invoice comparison calculator.",
        "Help me calculate cdn egress invoice comparison."
      ],
      "retrieval_phrases": [
        "CDN egress invoice comparison",
        "cdn egress invoice comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "0.1,0.2",
            "c": "10,20",
            "d": 1000000,
            "e": 0.01,
            "f": 5
          },
          "outputs": [
            {
              "label": "Regional egress charges (£)",
              "value": "9, 36"
            },
            {
              "label": "Total egress charge (£)",
              "value": 45
            },
            {
              "label": "Request charge (£)",
              "value": 1
            },
            {
              "label": "Total scenario invoice (£)",
              "value": 51
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-859",
      "name": "Database connection pool capacity",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "A steady-state average model: one transaction holds one connection for the measured time. It estimates offered load, not latency percentiles or safe production sizing. Values above 100% existing utilization indicate overload under these assumptions.",
      "url": "/calculators/database-connection-pool-capacity/",
      "version": "0dbd198f0f89619209d4b891c0ca6f36eca3ad790a426f26885d53da18cb13ac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Arrival rate (transactions/s)",
          "type": "number",
          "required": true,
          "unit": "transactions/s",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured connection-held time (ms)",
          "type": "number",
          "required": true,
          "unit": "ms",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Existing connections",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Target utilization (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Offered concurrent transactions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Ideal existing capacity (transactions/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Existing offered utilization (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Connections at target utilization",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A steady-state average model: one transaction holds one connection for the measured time. It estimates offered load, not latency percentiles or safe production sizing. Values above 100% existing utilization indicate overload under these assumptions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Offered concurrent transactions",
          "text": "Arrival rate × held time in seconds."
        },
        {
          "label": "Ideal existing capacity (transactions/s)",
          "text": "Connections ÷ held time in seconds."
        },
        {
          "label": "Existing offered utilization (%)",
          "text": "Offered concurrency ÷ existing connections × 100."
        },
        {
          "label": "Connections at target utilization",
          "text": "Round up offered concurrency ÷ target utilization fraction."
        }
      ],
      "example_questions": [
        "Use the Database connection pool capacity calculator.",
        "Help me calculate database connection pool capacity."
      ],
      "retrieval_phrases": [
        "Database connection pool capacity",
        "database connection pool capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 50,
            "c": 10,
            "d": 70
          },
          "outputs": [
            {
              "label": "Offered concurrent transactions",
              "value": 5
            },
            {
              "label": "Ideal existing capacity (transactions/s)",
              "value": 200
            },
            {
              "label": "Existing offered utilization (%)",
              "value": 50
            },
            {
              "label": "Connections at target utilization",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-860",
      "name": "Database index storage estimate",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "A user-supplied per-row model. Overhead is added to raw key-plus-pointer storage; it is not a fill factor. Excludes compression, variable-length keys, engine-specific headers, replicas and write-ahead logs.",
      "url": "/calculators/database-index-storage-estimate/",
      "version": "6d55fa6f48c08304e2a44fae1769b120fcea4628e830775f325a69212c593ba1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Indexed rows",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Key bytes per row",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pointer bytes per row",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Additional storage overhead (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Raw index bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated index bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Estimated index (MiB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A user-supplied per-row model. Overhead is added to raw key-plus-pointer storage; it is not a fill factor. Excludes compression, variable-length keys, engine-specific headers, replicas and write-ahead logs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Raw index bytes",
          "text": "Rows × (key bytes + pointer bytes)."
        },
        {
          "label": "Estimated index bytes",
          "text": "Raw bytes × (1 + overhead percentage/100)."
        },
        {
          "label": "Estimated index (MiB)",
          "text": "Estimated bytes ÷ 1,048,576."
        }
      ],
      "example_questions": [
        "Use the Database index storage estimate calculator.",
        "Help me calculate database index storage estimate."
      ],
      "retrieval_phrases": [
        "Database index storage estimate",
        "database index storage estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000000,
            "b": 16,
            "c": 8,
            "d": 25
          },
          "outputs": [
            {
              "label": "Raw index bytes",
              "value": 24000000
            },
            {
              "label": "Estimated index bytes",
              "value": 30000000
            },
            {
              "label": "Estimated index (MiB)",
              "value": 28.6102294921875
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-861",
      "name": "Database query fan-out",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Every incoming request produces the same fan-out. Cache hits avoid a downstream call; retries multiply only uncached calls. The supplied mean attempts includes the first attempt. This is expected workload, not a dependency-graph simulation.",
      "url": "/calculators/database-query-fan-out/",
      "version": "ee349db4592e69daffdcfe1e0b42e99110040271e9a27a3579a1ba4bf1ac3e73",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Incoming requests",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Downstream calls per request",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Downstream cache hit rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Mean attempts per uncached call",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Logical downstream calls",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected uncached calls",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected actual attempts",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Attempts per incoming request",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Every incoming request produces the same fan-out. Cache hits avoid a downstream call; retries multiply only uncached calls. The supplied mean attempts includes the first attempt. This is expected workload, not a dependency-graph simulation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Logical downstream calls",
          "text": "Incoming requests × calls per request."
        },
        {
          "label": "Expected uncached calls",
          "text": "Logical calls × (1−cache hit percentage/100)."
        },
        {
          "label": "Expected actual attempts",
          "text": "Uncached calls × mean attempts."
        },
        {
          "label": "Attempts per incoming request",
          "text": "Fan-out × uncached fraction × mean attempts; valid even when incoming volume is zero."
        }
      ],
      "example_questions": [
        "Use the Database query fan-out calculator.",
        "Help me calculate database query fan-out."
      ],
      "retrieval_phrases": [
        "Database query fan-out",
        "database query fan out"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 4,
            "c": 25,
            "d": 1.2
          },
          "outputs": [
            {
              "label": "Logical downstream calls",
              "value": 4000
            },
            {
              "label": "Expected uncached calls",
              "value": 3000
            },
            {
              "label": "Expected actual attempts",
              "value": 3600
            },
            {
              "label": "Attempts per incoming request",
              "value": 3.5999999999999996
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-862",
      "name": "Batch API request packing",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Packs consecutive records without reordering using the next-fit rule. Each record size must include its serialization separators; the envelope is added once per request. This feasible packing is not an optimal reordering solver.",
      "url": "/calculators/batch-api-request-packing/",
      "version": "42aa560446808194185aeac3f9c15bb797638c37bc2ae07d67ee0db06591f486",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Serialized bytes per record in order",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Maximum records per request",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Maximum request bytes",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Fixed envelope bytes per request",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Request count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Inclusive record ranges",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Request sizes (bytes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Packs consecutive records without reordering using the next-fit rule. Each record size must include its serialization separators; the envelope is added once per request. This feasible packing is not an optimal reordering solver."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Request count",
          "text": "Scan records in order, starting a new request when adding a record would exceed either cap."
        },
        {
          "label": "Inclusive record ranges",
          "text": "Report the first and last 1-based record index in each request."
        },
        {
          "label": "Request sizes (bytes)",
          "text": "Envelope bytes plus all serialized record bytes in each request."
        }
      ],
      "example_questions": [
        "Use the Batch API request packing calculator.",
        "Help me calculate batch api request packing."
      ],
      "retrieval_phrases": [
        "Batch API request packing",
        "batch api request packing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "200,200,400,100",
            "b": 2,
            "c": 600,
            "d": 50
          },
          "outputs": [
            {
              "label": "Request count",
              "value": 2
            },
            {
              "label": "Inclusive record ranges",
              "value": "1–2, 3–4"
            },
            {
              "label": "Request sizes (bytes)",
              "value": "450, 550"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-863",
      "name": "Retry amplification model",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Assumes identical independent failures, immediate failure detection and retries only after failure. Waits exclude request execution time. Maximum attempts includes the first request; a retry policy can amplify an overloaded service, so this is only a stated-probability model.",
      "url": "/calculators/retry-amplification-model/",
      "version": "04a5d2698a9dc2f6872c8f87910393b5a475e2080f82e7caacab8d8ebddaee1d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Independent failure probability per attempt (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Maximum attempts including the first",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Waits before retries (ms; 0 for one attempt)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected attempts",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Success probability (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected total waiting (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Maximum total waiting (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes identical independent failures, immediate failure detection and retries only after failure. Waits exclude request execution time. Maximum attempts includes the first request; a retry policy can amplify an overloaded service, so this is only a stated-probability model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected attempts",
          "text": "Add 1 + p + p² through p^(maximum attempts−1), with p the failure fraction."
        },
        {
          "label": "Success probability (%)",
          "text": "100 × (1−p^maximum attempts)."
        },
        {
          "label": "Expected total waiting (ms)",
          "text": "Wait before retry i is incurred with probability p^i; sum probability × wait."
        },
        {
          "label": "Maximum total waiting (ms)",
          "text": "Add all configured waits."
        }
      ],
      "example_questions": [
        "Use the Retry amplification model calculator.",
        "Help me calculate retry amplification model."
      ],
      "retrieval_phrases": [
        "Retry amplification model",
        "retry amplification model"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 3,
            "c": "100,200"
          },
          "outputs": [
            {
              "label": "Expected attempts",
              "value": 1.75
            },
            {
              "label": "Success probability (%)",
              "value": 87.5
            },
            {
              "label": "Expected total waiting (ms)",
              "value": 100
            },
            {
              "label": "Maximum total waiting (ms)",
              "value": 300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-864",
      "name": "Exponential backoff schedule",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Retry i uses min(cap, initial × multiplier^(i−1)). Optional full jitter chooses whole milliseconds from zero through one less than the capped whole-millisecond bound using a reproducible Park–Miller sequence. Timings exclude request execution. This educational seed is not cryptographic randomness.",
      "url": "/calculators/exponential-backoff-schedule/",
      "version": "1bfb018a758edb227b0c73a878e5de2650902506578131c7f3b6c558a8ece7d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial retry delay (ms)",
          "type": "number",
          "required": true,
          "unit": "ms",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Backoff multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Delay cap (ms)",
          "type": "number",
          "required": true,
          "unit": "ms",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retries after the initial attempt",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "No jitter (0) or seeded full jitter (1)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Seed (1–2147483646)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Retry waits (ms)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Retry times after initial attempt (ms)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total waiting (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Retry i uses min(cap, initial × multiplier^(i−1)). Optional full jitter chooses whole milliseconds from zero through one less than the capped whole-millisecond bound using a reproducible Park–Miller sequence. Timings exclude request execution. This educational seed is not cryptographic randomness."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Retry waits (ms)",
          "text": "Generate capped exponential delays. With full jitter, advance seed = seed × 16807 mod 2147483647 and take floor(floor(delay) × seed / 2147483647)."
        },
        {
          "label": "Retry times after initial attempt (ms)",
          "text": "Cumulative sum of waits, measured from the initial attempt; listed times round to six decimals."
        },
        {
          "label": "Total waiting (ms)",
          "text": "Sum the unrounded waits; no execution or response time is included."
        }
      ],
      "example_questions": [
        "Use the Exponential backoff schedule calculator.",
        "Help me calculate exponential backoff schedule."
      ],
      "retrieval_phrases": [
        "Exponential backoff schedule",
        "exponential backoff schedule"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 2,
            "c": 500,
            "d": 4,
            "e": 0,
            "f": 1
          },
          "outputs": [
            {
              "label": "Retry waits (ms)",
              "value": "100, 200, 400, 500"
            },
            {
              "label": "Retry times after initial attempt (ms)",
              "value": "100, 300, 700, 1200"
            },
            {
              "label": "Total waiting (ms)",
              "value": 1200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-869",
      "name": "Event retention partition planner",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Assumes constant event volume and packed size-based partitions across the whole retention window. These are not daily partitions. Indexes, replication, compression, filesystem overhead and partial-day expiry are excluded.",
      "url": "/calculators/event-retention-partition-planner/",
      "version": "eb86c1146492bd0eea6a842d2904454f0b84409f29f2d6635077b8252717319f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Events per day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bytes per event",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Retention days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Target bytes per partition",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bytes per day",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Retained bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Partitions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Retained storage (decimal GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes constant event volume and packed size-based partitions across the whole retention window. These are not daily partitions. Indexes, replication, compression, filesystem overhead and partial-day expiry are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bytes per day",
          "text": "Events per day × bytes per event."
        },
        {
          "label": "Retained bytes",
          "text": "Daily bytes × retention days."
        },
        {
          "label": "Partitions",
          "text": "Round up retained bytes ÷ target partition bytes."
        },
        {
          "label": "Retained storage (decimal GB)",
          "text": "Retained bytes ÷ 1,000,000,000."
        }
      ],
      "example_questions": [
        "Use the Event retention partition planner calculator.",
        "Help me calculate event retention partition planner."
      ],
      "retrieval_phrases": [
        "Event retention partition planner",
        "event retention partition planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000000,
            "b": 200,
            "c": 30,
            "d": 1000000000
          },
          "outputs": [
            {
              "label": "Bytes per day",
              "value": 200000000
            },
            {
              "label": "Retained bytes",
              "value": 6000000000
            },
            {
              "label": "Partitions",
              "value": 6
            },
            {
              "label": "Retained storage (decimal GB)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-870",
      "name": "Database replication lag catch-up",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "Transfer and apply stages are treated as a continuously pipelined bottleneck. Constant rates ignore network variability, buffering and pauses. A zero starting backlog reports already caught up at this instant even if future rates would create a backlog.",
      "url": "/calculators/database-replication-lag-catch-up/",
      "version": "5401e3beab5416b6c899c2dc86b308d5b95b10ceda8f7f7c814b86ba2344f14d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current backlog (bytes)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New data generation (bytes/s)",
          "type": "number",
          "required": true,
          "unit": "bytes/s",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Transfer capacity (bytes/s)",
          "type": "number",
          "required": true,
          "unit": "bytes/s",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Apply capacity (bytes/s)",
          "type": "number",
          "required": true,
          "unit": "bytes/s",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bottleneck throughput (bytes/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net drain rate (bytes/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Catch-up time (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Scenario status",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Transfer and apply stages are treated as a continuously pipelined bottleneck. Constant rates ignore network variability, buffering and pauses. A zero starting backlog reports already caught up at this instant even if future rates would create a backlog."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bottleneck throughput (bytes/s)",
          "text": "The smaller of transfer and apply capacity."
        },
        {
          "label": "Net drain rate (bytes/s)",
          "text": "Bottleneck throughput minus incoming generation rate."
        },
        {
          "label": "Catch-up time (seconds)",
          "text": "Backlog divided by positive net drain rate. Zero backlog takes zero time; positive backlog with non-positive net rate cannot converge."
        },
        {
          "label": "Scenario status",
          "text": "Describe whether the current backlog can drain under the supplied constant rates."
        }
      ],
      "example_questions": [
        "Use the Database replication lag catch-up calculator.",
        "Help me calculate database replication lag catch-up."
      ],
      "retrieval_phrases": [
        "Database replication lag catch-up",
        "database replication lag catch up"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000000000,
            "b": 1000000,
            "c": 5000000,
            "d": 3000000
          },
          "outputs": [
            {
              "label": "Bottleneck throughput (bytes/s)",
              "value": 3000000
            },
            {
              "label": "Net drain rate (bytes/s)",
              "value": 2000000
            },
            {
              "label": "Catch-up time (seconds)",
              "value": 500
            },
            {
              "label": "Scenario status",
              "value": "Converges"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-875",
      "name": "Distributed clock drift budget",
      "category": "Web performance and application capacity",
      "status": "available",
      "purpose": "A conservative linear bound for one clock after an interval without resynchronization. Assumes the quoted drift remains bounded throughout. Two-clock relative uncertainty adds identical bounds in the worst opposite directions; this is not a guarantee of a time-sync protocol.",
      "url": "/calculators/distributed-clock-drift-budget/",
      "version": "2cc30ca75605cf05a2c15c2ce3500740d59ef0b4bbfc09f1265dd3816e738081",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Absolute drift bound (ppm)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Seconds between synchronization",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Synchronization uncertainty bound (ms)",
          "type": "number",
          "required": true,
          "unit": "ms",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Accumulated drift bound (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Single-clock uncertainty bound (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Two-clock relative bound (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A conservative linear bound for one clock after an interval without resynchronization. Assumes the quoted drift remains bounded throughout. Two-clock relative uncertainty adds identical bounds in the worst opposite directions; this is not a guarantee of a time-sync protocol."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Accumulated drift bound (ms)",
          "text": "Parts per million × seconds ÷ 1,000 gives milliseconds."
        },
        {
          "label": "Single-clock uncertainty bound (ms)",
          "text": "Add synchronization uncertainty to accumulated drift."
        },
        {
          "label": "Two-clock relative bound (ms)",
          "text": "Add the same bound for two independent clocks in opposite directions."
        }
      ],
      "example_questions": [
        "Use the Distributed clock drift budget calculator.",
        "Help me calculate distributed clock drift budget."
      ],
      "retrieval_phrases": [
        "Distributed clock drift budget",
        "distributed clock drift budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 3600,
            "c": 5
          },
          "outputs": [
            {
              "label": "Accumulated drift bound (ms)",
              "value": 72
            },
            {
              "label": "Single-clock uncertainty bound (ms)",
              "value": 77
            },
            {
              "label": "Two-clock relative bound (ms)",
              "value": 154
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "State workload models; compare simulations with hand-worked traces and measured examples.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-876",
      "name": "Book spine width",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "One leaf has two printed sides. An odd page count rounds up to a complete leaf. This arithmetic estimates an uncompressed paper stack plus your binding allowance; a printer-specific cover template is still needed for production.",
      "url": "/calculators/book-spine-width/",
      "version": "55c83d62262cc82697bd3f1afd4803f30ddba6893f27db9dd11b483a2cf2ed5b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Interior printed pages",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Measured paper caliper per leaf (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Additional binding allowance (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Interior leaves",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated spine (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused printed sides",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One leaf has two printed sides. An odd page count rounds up to a complete leaf. This arithmetic estimates an uncompressed paper stack plus your binding allowance; a printer-specific cover template is still needed for production."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Interior leaves",
          "text": "Round page count up after dividing by two."
        },
        {
          "label": "Estimated spine (mm)",
          "text": "Leaf count × measured caliper + binding allowance."
        },
        {
          "label": "Unused printed sides",
          "text": "Two sides per leaf minus printed page count."
        }
      ],
      "example_questions": [
        "Use the Book spine width calculator.",
        "Help me calculate book spine width."
      ],
      "retrieval_phrases": [
        "Book spine width",
        "book spine width"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 0.1,
            "c": 1
          },
          "outputs": [
            {
              "label": "Interior leaves",
              "value": 100
            },
            {
              "label": "Estimated spine (mm)",
              "value": 11
            },
            {
              "label": "Unused printed sides",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-877",
      "name": "Book signature planner",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Finds the fewest added blank pages within your limit, then the fewest signatures for that padded total. Signature sizes are positive multiples of four. At most 10,000 total pages; this count plan does not supply page imposition or folding instructions.",
      "url": "/calculators/book-signature-planner/",
      "version": "ee72c20fbdfe15537f01d16c170175aed10023ba935003f15f1196c6d3b59e21",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Interior pages",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Permitted signature sizes (pages)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Maximum blank pages allowed",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Padded total pages",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Blank pages",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Signature breakdown",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Signature count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Finds the fewest added blank pages within your limit, then the fewest signatures for that padded total. Signature sizes are positive multiples of four. At most 10,000 total pages; this count plan does not supply page imposition or folding instructions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Padded total pages",
          "text": "Search page totals from the requested count upward; use the first total that can be formed from allowed signatures."
        },
        {
          "label": "Blank pages",
          "text": "Padded total minus requested pages."
        },
        {
          "label": "Signature breakdown",
          "text": "For that total, dynamic programming minimizes signature count; report counts from largest size to smallest."
        },
        {
          "label": "Signature count",
          "text": "Add the counts of all chosen signatures."
        }
      ],
      "example_questions": [
        "Use the Book signature planner calculator.",
        "Help me calculate book signature planner."
      ],
      "retrieval_phrases": [
        "Book signature planner",
        "book signature planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "16,8",
            "c": 4
          },
          "outputs": [
            {
              "label": "Padded total pages",
              "value": 104
            },
            {
              "label": "Blank pages",
              "value": 4
            },
            {
              "label": "Signature breakdown",
              "value": "16 pages × 6, 8 pages × 1"
            },
            {
              "label": "Signature count",
              "value": 7
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-879",
      "name": "Perfect-bound cover spread",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "An unfolded geometric cover spread using your supplied spine, bleed and any extra hinge allowance. Hinge allowance adds width rather than taking space from the cover panel. Read positions from the left file edge. Use zero hinges unless your printer specifies this extra geometry; its template overrides this estimate.",
      "url": "/calculators/perfect-bound-cover-spread/",
      "version": "1a175e387db4705a2067e9d80477b1e439e95d4c4f78232562a804edb3e0e4aa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Trim cover width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Trim cover height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Supplied spine width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Outer bleed on each edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional hinge allowance on EACH side of spine (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Flat spread width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Flat spread height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Back panel end (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Spine left (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Spine right (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_6",
          "label": "Front panel start (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An unfolded geometric cover spread using your supplied spine, bleed and any extra hinge allowance. Hinge allowance adds width rather than taking space from the cover panel. Read positions from the left file edge. Use zero hinges unless your printer specifies this extra geometry; its template overrides this estimate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Flat spread width (mm)",
          "text": "Two cover widths + spine + two hinges + two outer bleeds."
        },
        {
          "label": "Flat spread height (mm)",
          "text": "Cover height + two outer bleeds."
        },
        {
          "label": "Back panel end (mm)",
          "text": "Left bleed + back cover width."
        },
        {
          "label": "Spine left (mm)",
          "text": "Back panel end + hinge allowance."
        },
        {
          "label": "Spine right (mm)",
          "text": "Spine left + spine width."
        },
        {
          "label": "Front panel start (mm)",
          "text": "Spine right + hinge allowance."
        }
      ],
      "example_questions": [
        "Use the Perfect-bound cover spread calculator.",
        "Help me calculate perfect-bound cover spread."
      ],
      "retrieval_phrases": [
        "Perfect-bound cover spread",
        "perfect bound cover spread"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 150,
            "b": 210,
            "c": 12,
            "d": 3,
            "e": 0
          },
          "outputs": [
            {
              "label": "Flat spread width (mm)",
              "value": 318
            },
            {
              "label": "Flat spread height (mm)",
              "value": 216
            },
            {
              "label": "Back panel end (mm)",
              "value": 153
            },
            {
              "label": "Spine left (mm)",
              "value": 153
            },
            {
              "label": "Spine right (mm)",
              "value": 165
            },
            {
              "label": "Front panel start (mm)",
              "value": 165
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-880",
      "name": "Paper ream mass",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "GSM is grams per square metre. Computes paper mass from flat sheet area and basis weight, excluding packaging, ink, moisture changes and coatings not included in the stated weight.",
      "url": "/calculators/paper-ream-mass/",
      "version": "ee50ba32472c35424b260573646238d84f4b64f5e656d942d87b995d380103a0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Paper weight (g/m²)",
          "type": "number",
          "required": true,
          "unit": "g/m²",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sheets",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mass per sheet (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total paper mass (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "GSM is grams per square metre. Computes paper mass from flat sheet area and basis weight, excluding packaging, ink, moisture changes and coatings not included in the stated weight."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mass per sheet (g)",
          "text": "Width × height in mm² ÷ 1,000,000 × grams per square metre."
        },
        {
          "label": "Total paper mass (kg)",
          "text": "Mass per sheet × sheet count ÷ 1,000."
        }
      ],
      "example_questions": [
        "Use the Paper ream mass calculator.",
        "Help me calculate paper ream mass."
      ],
      "retrieval_phrases": [
        "Paper ream mass",
        "paper ream mass"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 210,
            "b": 297,
            "c": 80,
            "d": 500
          },
          "outputs": [
            {
              "label": "Mass per sheet (g)",
              "value": 4.9896
            },
            {
              "label": "Total paper mass (kg)",
              "value": 2.4948
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-881",
      "name": "Envelope fit allowance",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Simple envelope fit allowance: add the insert thickness once to each planar dimension, plus clearance on both edges. This is an estimated flat-envelope starting size, not proof of fit; seam shape, stiffness and gussets require a physical sample.",
      "url": "/calculators/envelope-fit-allowance/",
      "version": "407c937278ca8fb3848dcc584553320ac50b81b1e5818dce54fcfe4a353c2fd0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Folded insert width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Folded insert height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Insert thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Clearance on EACH edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated internal envelope width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated internal envelope height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Simple envelope fit allowance: add the insert thickness once to each planar dimension, plus clearance on both edges. This is an estimated flat-envelope starting size, not proof of fit; seam shape, stiffness and gussets require a physical sample."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated internal envelope width (mm)",
          "text": "Insert width + thickness + two edge clearances."
        },
        {
          "label": "Estimated internal envelope height (mm)",
          "text": "Insert height + thickness + two edge clearances."
        }
      ],
      "example_questions": [
        "Use the Envelope fit allowance calculator.",
        "Help me calculate envelope fit allowance."
      ],
      "retrieval_phrases": [
        "Envelope fit allowance",
        "envelope fit allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 148,
            "b": 210,
            "c": 2,
            "d": 3
          },
          "outputs": [
            {
              "label": "Estimated internal envelope width (mm)",
              "value": 156
            },
            {
              "label": "Estimated internal envelope height (mm)",
              "value": 218
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-883",
      "name": "Print sheet utilization",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Fits a uniform rectangular grid. Gripper allowance is additional to the two height margins. Compare upright and 90-degree rotated grids; ties use upright. Mixed rotation/nesting is not searched. Artwork sizes already include bleed; no press certification is implied.",
      "url": "/calculators/print-sheet-utilization/",
      "version": "265bab0b9202a0375c285faf18f82f8e4598eb739d91f1e2dee3aba48768162c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Press sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Press sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Flat artwork width including bleed (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Flat artwork height including bleed (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Additional leading gripper allowance (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Outer margin on every edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Gutter between artworks (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "h",
          "label": "Allow uniform rotation: no (0), yes (1)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Artwork count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Grid columns × rows",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Orientation",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Artwork area utilization (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Grid width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_6",
          "label": "Grid height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fits a uniform rectangular grid. Gripper allowance is additional to the two height margins. Compare upright and 90-degree rotated grids; ties use upright. Mixed rotation/nesting is not searched. Artwork sizes already include bleed; no press certification is implied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Artwork count",
          "text": "For each allowed orientation multiply roundDown((usable width + gutter)/(art width + gutter)) by the corresponding row count; choose the larger count."
        },
        {
          "label": "Grid columns × rows",
          "text": "Report columns and rows of the chosen uniform grid."
        },
        {
          "label": "Orientation",
          "text": "Rotated means every artwork is turned 90 degrees; ties remain upright."
        },
        {
          "label": "Artwork area utilization (%)",
          "text": "Count × artwork area ÷ full sheet area × 100."
        },
        {
          "label": "Grid width (mm)",
          "text": "Columns × artwork width + (columns−1) × gutter, or zero if none fit."
        },
        {
          "label": "Grid height (mm)",
          "text": "Rows × artwork height + (rows−1) × gutter, or zero if none fit."
        }
      ],
      "example_questions": [
        "Use the Print sheet utilization calculator.",
        "Help me calculate print sheet utilization."
      ],
      "retrieval_phrases": [
        "Print sheet utilization",
        "print sheet utilization"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 200,
            "c": 90,
            "d": 60,
            "e": 0,
            "f": 0,
            "g": 10,
            "h": 1
          },
          "outputs": [
            {
              "label": "Artwork count",
              "value": 9
            },
            {
              "label": "Grid columns × rows",
              "value": "3 × 3"
            },
            {
              "label": "Orientation",
              "value": "Upright"
            },
            {
              "label": "Artwork area utilization (%)",
              "value": 81
            },
            {
              "label": "Grid width (mm)",
              "value": 290
            },
            {
              "label": "Grid height (mm)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-884",
      "name": "Print run spoilage allowance",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Startup waste is separate from running spoilage. Reverse the expected yield to estimate a run quantity, rounding up. Actual spoilage varies, so this is not a guarantee of good copies; use your measured process rate.",
      "url": "/calculators/print-run-spoilage-allowance/",
      "version": "036c46efec38f7ba8068c335d8493d2a679bae94bae29f97f5f79e5811d4983d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Good copies required",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Startup waste copies",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Running spoilage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total press quantity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Copies budgeted above requirement",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected good copies after startup",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Startup waste is separate from running spoilage. Reverse the expected yield to estimate a run quantity, rounding up. Actual spoilage varies, so this is not a guarantee of good copies; use your measured process rate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total press quantity",
          "text": "Startup waste + roundUp(required good copies ÷ (1−spoilage/100))."
        },
        {
          "label": "Copies budgeted above requirement",
          "text": "Press quantity minus required good copies."
        },
        {
          "label": "Expected good copies after startup",
          "text": "Copies printed after startup × (1−spoilage/100)."
        }
      ],
      "example_questions": [
        "Use the Print run spoilage allowance calculator.",
        "Help me calculate print run spoilage allowance."
      ],
      "retrieval_phrases": [
        "Print run spoilage allowance",
        "print run spoilage allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 50,
            "c": 5
          },
          "outputs": [
            {
              "label": "Total press quantity",
              "value": 1103
            },
            {
              "label": "Copies budgeted above requirement",
              "value": 103
            },
            {
              "label": "Expected good copies after startup",
              "value": 1000.3499999999999
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-885",
      "name": "Ink coverage consumption",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Uses a measured full-coverage ink yield and scales linearly by your equivalent coverage. Coverage may exceed 100% when multiple layers or colours are combined. It excludes startup loss, ink left in equipment and substrate-specific behavior beyond the measured yield.",
      "url": "/calculators/ink-coverage-consumption/",
      "version": "20af678b6a073aeaf1172f66cec2206b05af6ac4bbd74317fce55c03da653e51",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Printed area per copy (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Equivalent full-coverage percentage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Measured full-coverage yield (m² per litre)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Printed copies",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Container size (litres)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Equivalent full-coverage area (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated ink (litres)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Whole containers",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Purchased ink (litres)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a measured full-coverage ink yield and scales linearly by your equivalent coverage. Coverage may exceed 100% when multiple layers or colours are combined. It excludes startup loss, ink left in equipment and substrate-specific behavior beyond the measured yield."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Equivalent full-coverage area (m²)",
          "text": "Area per copy × coverage percentage/100 × copies."
        },
        {
          "label": "Estimated ink (litres)",
          "text": "Equivalent full-coverage area ÷ measured yield."
        },
        {
          "label": "Whole containers",
          "text": "Round up estimated litres ÷ container size."
        },
        {
          "label": "Purchased ink (litres)",
          "text": "Container count × container size."
        }
      ],
      "example_questions": [
        "Use the Ink coverage consumption calculator.",
        "Help me calculate ink coverage consumption."
      ],
      "retrieval_phrases": [
        "Ink coverage consumption",
        "ink coverage consumption"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.1,
            "b": 50,
            "c": 100,
            "d": 2000,
            "e": 0.5
          },
          "outputs": [
            {
              "label": "Equivalent full-coverage area (m²)",
              "value": 100
            },
            {
              "label": "Estimated ink (litres)",
              "value": 1
            },
            {
              "label": "Whole containers",
              "value": 2
            },
            {
              "label": "Purchased ink (litres)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-887",
      "name": "Screen printing colour pass time",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Serial model with one pass per colour and a flash only between passes. Setup is fully attended; running labour uses your supplied attended fraction. Does not simulate a carousel, parallel operators or final curing time.",
      "url": "/calculators/screen-printing-colour-pass-time/",
      "version": "67a27e96107d79d315111a705375944eae1cb37139e8a07d2977eb8684102728",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Items",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Colour passes per item",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Measured seconds per colour pass",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Flash seconds BETWEEN colour passes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Setup time (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Attended fraction of running time (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Running press time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total occupation including setup (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Attended labour (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Serial model with one pass per colour and a flash only between passes. Setup is fully attended; running labour uses your supplied attended fraction. Does not simulate a carousel, parallel operators or final curing time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Running press time (minutes)",
          "text": "Items × [colours × pass seconds + (colours−1) × flash seconds] ÷ 60."
        },
        {
          "label": "Total occupation including setup (minutes)",
          "text": "Setup minutes + running minutes."
        },
        {
          "label": "Attended labour (minutes)",
          "text": "Setup minutes + running minutes × attended percentage/100."
        }
      ],
      "example_questions": [
        "Use the Screen printing colour pass time calculator.",
        "Help me calculate screen printing colour pass time."
      ],
      "retrieval_phrases": [
        "Screen printing colour pass time",
        "screen printing colour pass time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 3,
            "c": 5,
            "d": 10,
            "e": 30,
            "f": 80
          },
          "outputs": [
            {
              "label": "Running press time (minutes)",
              "value": 58.333333333333336
            },
            {
              "label": "Total occupation including setup (minutes)",
              "value": 88.33333333333334
            },
            {
              "label": "Attended labour (minutes)",
              "value": 76.66666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-890",
      "name": "Saddle-stitch creep estimate",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "An explicitly linear compensation model: the outside sheet has zero offset and each nested sheet adds caliper × supplied multiplier. This is an estimate to compare with a folded sample or printer template, not a universal imposition rule. At most 1,000 sheets.",
      "url": "/calculators/saddle-stitch-creep-estimate/",
      "version": "47ac22b37167fd9e8689f211d65c18f889749a34d330056516b50473f750ad77",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Nested folded sheets",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Measured sheet caliper (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured creep multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum modeled creep (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Offsets from outside to inside (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An explicitly linear compensation model: the outside sheet has zero offset and each nested sheet adds caliper × supplied multiplier. This is an estimate to compare with a folded sample or printer template, not a universal imposition rule. At most 1,000 sheets."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum modeled creep (mm)",
          "text": "(Sheet count−1) × measured caliper × supplied multiplier."
        },
        {
          "label": "Offsets from outside to inside (mm)",
          "text": "For sheet i starting at zero on the outside, offset = i × caliper × multiplier. Listed values round to six decimals."
        }
      ],
      "example_questions": [
        "Use the Saddle-stitch creep estimate calculator.",
        "Help me calculate saddle-stitch creep estimate."
      ],
      "retrieval_phrases": [
        "Saddle-stitch creep estimate",
        "saddle stitch creep estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 0.1,
            "c": 1
          },
          "outputs": [
            {
              "label": "Maximum modeled creep (mm)",
              "value": 0.9
            },
            {
              "label": "Offsets from outside to inside (mm)",
              "value": "0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-892",
      "name": "Dust jacket layout",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Flat jacket geometry with two equal cover panels and separately specified flap widths. Fold positions are measured from the left file edge, including bleed. Additional hinge gaps, board thickness and turn-ins are not inferred; confirm the final printer template.",
      "url": "/calculators/dust-jacket-layout/",
      "version": "19b4f861db2571ea0aa7d82ffcb316c9e45afd6452565e8d2430b43e7c4ba4ba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cover panel width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cover height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Spine width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Left flap width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Right flap width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Outer bleed (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Flat jacket width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Flat jacket height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Fold positions from left (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Flat jacket geometry with two equal cover panels and separately specified flap widths. Fold positions are measured from the left file edge, including bleed. Additional hinge gaps, board thickness and turn-ins are not inferred; confirm the final printer template."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Flat jacket width (mm)",
          "text": "Two cover widths + spine + both flaps + two outer bleeds."
        },
        {
          "label": "Flat jacket height (mm)",
          "text": "Cover height + two outer bleeds."
        },
        {
          "label": "Fold positions from left (mm)",
          "text": "Starting after left bleed, accumulate left flap, back cover, spine and front cover; each boundary is a fold."
        }
      ],
      "example_questions": [
        "Use the Dust jacket layout calculator.",
        "Help me calculate dust jacket layout."
      ],
      "retrieval_phrases": [
        "Dust jacket layout",
        "dust jacket layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 150,
            "b": 210,
            "c": 12,
            "d": 80,
            "e": 80,
            "f": 3
          },
          "outputs": [
            {
              "label": "Flat jacket width (mm)",
              "value": 478
            },
            {
              "label": "Flat jacket height (mm)",
              "value": 216
            },
            {
              "label": "Fold positions from left (mm)",
              "value": "83, 233, 245, 395"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-894",
      "name": "Sticker kiss-cut spacing",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Uses a uniform rectangular grid anchored at the top-left margin. Rotation turns every sticker 90 degrees; ties use upright. Gap is between cut lines, so any additional bleed or cutting-machine requirements must be included in your chosen gap and margins.",
      "url": "/calculators/sticker-kiss-cut-spacing/",
      "version": "8bd50add8fbc686045a99123b43130a8cc1cf9ea6a5a344a7a2eda30c4308425",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sticker cut width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sticker cut height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Outer margin on every edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Minimum gap between cut lines (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Allow uniform rotation: no (0), yes (1)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Stickers per sheet",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Columns × rows",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Orientation",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "First centre x, y (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Centre-to-centre x, y spacing (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a uniform rectangular grid anchored at the top-left margin. Rotation turns every sticker 90 degrees; ties use upright. Gap is between cut lines, so any additional bleed or cutting-machine requirements must be included in your chosen gap and margins."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Stickers per sheet",
          "text": "Compare whole columns × rows in each allowed orientation; choose the larger count."
        },
        {
          "label": "Columns × rows",
          "text": "Columns and rows in the chosen grid."
        },
        {
          "label": "Orientation",
          "text": "All stickers share this orientation; no mixed nesting is attempted."
        },
        {
          "label": "First centre x, y (mm)",
          "text": "First centre is margin + half sticker width, margin + half sticker height; no coordinate is returned if nothing fits."
        },
        {
          "label": "Centre-to-centre x, y spacing (mm)",
          "text": "Sticker width + gap and sticker height + gap for the chosen orientation."
        }
      ],
      "example_questions": [
        "Use the Sticker kiss-cut spacing calculator.",
        "Help me calculate sticker kiss-cut spacing."
      ],
      "retrieval_phrases": [
        "Sticker kiss-cut spacing",
        "sticker kiss cut spacing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 30,
            "c": 210,
            "d": 297,
            "e": 5,
            "f": 3,
            "g": 1
          },
          "outputs": [
            {
              "label": "Stickers per sheet",
              "value": 30
            },
            {
              "label": "Columns × rows",
              "value": "6 × 5"
            },
            {
              "label": "Orientation",
              "value": "Rotated"
            },
            {
              "label": "First centre x, y (mm)",
              "value": "20, 30"
            },
            {
              "label": "Centre-to-centre x, y spacing (mm)",
              "value": "33, 53"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-896",
      "name": "Variable data merge batches",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Each template produces a separate set of files with equal per-record size. Packs consecutive records by the smaller record-count and byte cap. File ranges are the same for every template. At most 1,000 batches per template are displayed.",
      "url": "/calculators/variable-data-merge-batches/",
      "version": "3faa4023747d953c27d0c302def145af2d44bcfa6c467f79416cdf1f5e4275a2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Data records",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Templates generated per record",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Bytes per rendered record per template",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Maximum output file bytes",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Fixed bytes per file",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Maximum records per output file",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Records per full file",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Files per template",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total output files",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Record ranges per template",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Bytes in final file per template",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each template produces a separate set of files with equal per-record size. Packs consecutive records by the smaller record-count and byte cap. File ranges are the same for every template. At most 1,000 batches per template are displayed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Records per full file",
          "text": "Minimum of record cap and roundDown((byte cap − fixed file bytes) ÷ bytes per record)."
        },
        {
          "label": "Files per template",
          "text": "Round up record count ÷ capacity. Zero records produce no files."
        },
        {
          "label": "Total output files",
          "text": "Files per template × template count."
        },
        {
          "label": "Record ranges per template",
          "text": "List consecutive inclusive 1-based record ranges for each template."
        },
        {
          "label": "Bytes in final file per template",
          "text": "Fixed bytes + final batch record count × bytes per record; zero when no files exist."
        }
      ],
      "example_questions": [
        "Use the Variable data merge batches calculator.",
        "Help me calculate variable data merge batches."
      ],
      "retrieval_phrases": [
        "Variable data merge batches",
        "variable data merge batches"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 105,
            "b": 3,
            "c": 1000,
            "d": 50000,
            "e": 1000,
            "f": 20
          },
          "outputs": [
            {
              "label": "Records per full file",
              "value": 20
            },
            {
              "label": "Files per template",
              "value": 6
            },
            {
              "label": "Total output files",
              "value": 18
            },
            {
              "label": "Record ranges per template",
              "value": "1–20, 21–40, 41–60, 61–80, 81–100, 101–105"
            },
            {
              "label": "Bytes in final file per template",
              "value": 6000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-897",
      "name": "Book indexing column capacity",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "A line-capacity estimate using your measured average entry length. Round total lines up once, then allocate columns and pages. Does not model alphabetic headings, keep-together rules, cross-references or typography-dependent line wrapping.",
      "url": "/calculators/book-indexing-column-capacity/",
      "version": "eb11444bdc5cc29bb9f26de64e1880441367aeabcd09a5f5ff71377f3f701eb5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Index entries",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured average lines per entry",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable lines per column",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Columns per page",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated whole lines",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Columns required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Index pages",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Used lines on last page",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A line-capacity estimate using your measured average entry length. Round total lines up once, then allocate columns and pages. Does not model alphabetic headings, keep-together rules, cross-references or typography-dependent line wrapping."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated whole lines",
          "text": "Round up entries × measured average lines per entry."
        },
        {
          "label": "Columns required",
          "text": "Round up lines ÷ usable lines per column."
        },
        {
          "label": "Index pages",
          "text": "Round up columns required ÷ columns per page."
        },
        {
          "label": "Used lines on last page",
          "text": "Total lines minus the full-page capacity of all earlier pages; zero when there are no entries."
        }
      ],
      "example_questions": [
        "Use the Book indexing column capacity calculator.",
        "Help me calculate book indexing column capacity."
      ],
      "retrieval_phrases": [
        "Book indexing column capacity",
        "book indexing column capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 1.5,
            "c": 50,
            "d": 2
          },
          "outputs": [
            {
              "label": "Estimated whole lines",
              "value": 750
            },
            {
              "label": "Columns required",
              "value": 15
            },
            {
              "label": "Index pages",
              "value": 8
            },
            {
              "label": "Used lines on last page",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-899",
      "name": "Translation layout expansion",
      "category": "Print production and publishing",
      "status": "available",
      "purpose": "Apply each language factor to every source box, rounding expected character count upward per box. Counts include spaces if your source measurement does. This is a character-capacity estimate; real glyph widths, line breaks and font changes can alter fit.",
      "url": "/calculators/translation-layout-expansion/",
      "version": "97d58c0998f4a52800e1931288d5164d693e06dee8f2a6ea04c2df410f091300",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original character counts by text box",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured expansion factors by language",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Character capacities of the corresponding boxes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated characters per language, by box",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Overflow characters per language, by box",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total overflow per language",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Apply each language factor to every source box, rounding expected character count upward per box. Counts include spaces if your source measurement does. This is a character-capacity estimate; real glyph widths, line breaks and font changes can alter fit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated characters per language, by box",
          "text": "For each language, multiply every box character count by its expansion factor and round upward. Semicolons separate languages."
        },
        {
          "label": "Overflow characters per language, by box",
          "text": "For each language and box: max(estimated count − box capacity, 0)."
        },
        {
          "label": "Total overflow per language",
          "text": "Sum box overflow separately for each language."
        }
      ],
      "example_questions": [
        "Use the Translation layout expansion calculator.",
        "Help me calculate translation layout expansion."
      ],
      "retrieval_phrases": [
        "Translation layout expansion",
        "translation layout expansion"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "1.2,1.5",
            "c": "130,250"
          },
          "outputs": [
            {
              "label": "Estimated characters per language, by box",
              "value": "120, 240; 150, 300"
            },
            {
              "label": "Overflow characters per language, by box",
              "value": "0, 0; 20, 50"
            },
            {
              "label": "Total overflow per language",
              "value": "0, 70"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verify against physical sheets or print-shop templates; distinguish estimates from press specifications.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1003",
      "name": "Robot vacuum coverage cycles",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "Uses measured coverage and a constant full-cycle duration. Rooms share charge capacity; last cycle is budgeted at full duration. Starts charged.",
      "url": "/calculators/robot-vacuum-coverage-cycles/",
      "version": "e9ba64d29bd49afb56de89bf6ab2b0de30e7815c175d5c7ba9c1c8cb4217b909",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Room areas (m²)",
          "type": "array",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Tested area per charge (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Cleaning time per cycle (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Recharge time (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Charge cycles",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Completion window (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses measured coverage and a constant full-cycle duration. Rooms share charge capacity; last cycle is budgeted at full duration. Starts charged."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Charge cycles",
          "text": "Divide total area by tested coverage and round up."
        },
        {
          "label": "Completion window (min)",
          "text": "Add cleaning cycles and recharges between cycles."
        }
      ],
      "example_questions": [
        "Use the Robot vacuum coverage cycles calculator.",
        "Help me calculate robot vacuum coverage cycles."
      ],
      "retrieval_phrases": [
        "Robot vacuum coverage cycles",
        "robot vacuum coverage cycles"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,50",
            "b": 40,
            "c": 45,
            "d": 120
          },
          "outputs": [
            {
              "label": "Charge cycles",
              "value": 2
            },
            {
              "label": "Completion window (min)",
              "value": 210
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1004",
      "name": "Mop pad rotation",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "Each zone needs a whole pad count each session. Clean pads return after the entered whole number of days; inventory covers that many daily sessions.",
      "url": "/calculators/mop-pad-rotation/",
      "version": "fb5435b877f92cebc12d3630d0b412fb756dc50c9a1e567238f423f7052e1f6e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pads used in each floor zone",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Cleaning sessions per day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Wash return delay (days)",
          "type": "integer",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pads per session",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minimum circulating pads",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each zone needs a whole pad count each session. Clean pads return after the entered whole number of days; inventory covers that many daily sessions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pads per session",
          "text": "Add pads assigned to each zone."
        },
        {
          "label": "Minimum circulating pads",
          "text": "Multiply session requirement by sessions per day and days before return."
        }
      ],
      "example_questions": [
        "Use the Mop pad rotation calculator.",
        "Help me calculate mop pad rotation."
      ],
      "retrieval_phrases": [
        "Mop pad rotation",
        "mop pad rotation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,1",
            "b": 1,
            "c": 2
          },
          "outputs": [
            {
              "label": "Pads per session",
              "value": 4
            },
            {
              "label": "Minimum circulating pads",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1005",
      "name": "Window washing access time",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "One worker cleans size groups in entered order. Times must include access equipment handling for each window; setup is once per visit. Does not assess work-at-height safety.",
      "url": "/calculators/window-washing-access-time/",
      "version": "f73b01c0e724db5ec71f5bfa65da8fce15c54e02ca8c72a0bdaa2bbcbcab9391",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Windows in each size group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured minutes per window by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Setup and packing time (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Group work times (min)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total equipment booking time (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One worker cleans size groups in entered order. Times must include access equipment handling for each window; setup is once per visit. Does not assess work-at-height safety."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Group work times (min)",
          "text": "Multiply window count by measured handling time for each group."
        },
        {
          "label": "Total equipment booking time (min)",
          "text": "Add group work times and one setup/packing allowance."
        }
      ],
      "example_questions": [
        "Use the Window washing access time calculator.",
        "Help me calculate window washing access time."
      ],
      "retrieval_phrases": [
        "Window washing access time",
        "window washing access time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,2",
            "b": "5,10",
            "c": 20
          },
          "outputs": [
            {
              "label": "Group work times (min)",
              "value": "20, 20"
            },
            {
              "label": "Total equipment booking time (min)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1007",
      "name": "Carpet cleaner tank cycles",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "Based on measured solution use and recovery; tanks start empty, with first clean-water fill before cleaning. No chemical dosing guidance.",
      "url": "/calculators/carpet-cleaner-tank-cycles/",
      "version": "8c57391ef9ec605a7c275d6bbb1ea1816ba7b06f89d193fdde5dae373a4a5d1f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Carpet area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured solution usage (L/m²)",
          "type": "number",
          "required": true,
          "unit": "L/m²",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Clean tank capacity (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Observed recovered fraction (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Collection tank capacity (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Solution required (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Refills after initial fill",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Recovered liquid (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Collection tank loads",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Based on measured solution use and recovery; tanks start empty, with first clean-water fill before cleaning. No chemical dosing guidance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Solution required (L)",
          "text": "Multiply carpet area by observed solution use."
        },
        {
          "label": "Refills after initial fill",
          "text": "Round required tank fills up, then subtract the initial fill."
        },
        {
          "label": "Recovered liquid (L)",
          "text": "Apply the measured recovery percentage."
        },
        {
          "label": "Collection tank loads",
          "text": "Divide recovered liquid by tank capacity and round up."
        }
      ],
      "example_questions": [
        "Use the Carpet cleaner tank cycles calculator.",
        "Help me calculate carpet cleaner tank cycles."
      ],
      "retrieval_phrases": [
        "Carpet cleaner tank cycles",
        "carpet cleaner tank cycles"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 0.2,
            "c": 4,
            "d": 75,
            "e": 3
          },
          "outputs": [
            {
              "label": "Solution required (L)",
              "value": 16
            },
            {
              "label": "Refills after initial fill",
              "value": 3
            },
            {
              "label": "Recovered liquid (L)",
              "value": 12
            },
            {
              "label": "Collection tank loads",
              "value": 4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1014",
      "name": "Door weatherstrip purchase list",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "One compatible strip profile; each door receives two vertical lengths and one top. Packs can be joined; use separate runs for incompatible profiles.",
      "url": "/calculators/door-weatherstrip-purchase-list/",
      "version": "e8559b70370a42cf2e4b39166871683c28690904e69e7e53d75585887b246210",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Door heights (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Door widths (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Supplied pack length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Door cut lengths (m)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Allowance-adjusted total (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Packs to buy",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One compatible strip profile; each door receives two vertical lengths and one top. Packs can be joined; use separate runs for incompatible profiles."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Door cut lengths (m)",
          "text": "Add twice each door height and its width."
        },
        {
          "label": "Allowance-adjusted total (m)",
          "text": "Add door perimeter cuts and the waste allowance."
        },
        {
          "label": "Packs to buy",
          "text": "Divide allowance-adjusted length by supplied pack length and round up."
        }
      ],
      "example_questions": [
        "Use the Door weatherstrip purchase list calculator.",
        "Help me calculate door weatherstrip purchase list."
      ],
      "retrieval_phrases": [
        "Door weatherstrip purchase list",
        "door weatherstrip purchase list"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,2",
            "b": "1,0.8",
            "c": 5,
            "d": 10
          },
          "outputs": [
            {
              "label": "Door cut lengths (m)",
              "value": "5, 4.8"
            },
            {
              "label": "Allowance-adjusted total (m)",
              "value": 10.780000000000001
            },
            {
              "label": "Packs to buy",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1016",
      "name": "Screen spline purchase length",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "All frames use one compatible spline size; each frame has one join allowance. Rolls may be joined only if the installer permits it.",
      "url": "/calculators/screen-spline-purchase-length/",
      "version": "c3d0117e4ab1a5cb6f99ddb43f4e71a3e45398332daa237a08a04fd1787b8cc2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Frame perimeters (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Join allowance per frame (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Spare length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Roll length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Purchase length (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rolls",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All frames use one compatible spline size; each frame has one join allowance. Rolls may be joined only if the installer permits it."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Purchase length (m)",
          "text": "Add frame perimeters, one join allowance per frame, and spare length."
        },
        {
          "label": "Rolls",
          "text": "Round the required length divided by roll length up."
        }
      ],
      "example_questions": [
        "Use the Screen spline purchase length calculator.",
        "Help me calculate screen spline purchase length."
      ],
      "retrieval_phrases": [
        "Screen spline purchase length",
        "screen spline purchase length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,6",
            "b": 0.1,
            "c": 1,
            "d": 5
          },
          "outputs": [
            {
              "label": "Purchase length (m)",
              "value": 11.2
            },
            {
              "label": "Rolls",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1017",
      "name": "Furniture felt pad planner",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "Each list position represents a separate pad shape/size; packs contain only that shape. No substitution across shapes.",
      "url": "/calculators/furniture-felt-pad-planner/",
      "version": "72098790bde3100b5c41efe7756fa67b9f62e18abf952cecfa070fac063a679c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Feet needing pads by shape",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Pads per pack for each shape",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Packs by shape",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Spare pads by shape",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each list position represents a separate pad shape/size; packs contain only that shape. No substitution across shapes."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Packs by shape",
          "text": "Round up required feet divided by pads per matching pack."
        },
        {
          "label": "Spare pads by shape",
          "text": "Subtract needed pads from whole-pack purchases."
        }
      ],
      "example_questions": [
        "Use the Furniture felt pad planner calculator.",
        "Help me calculate furniture felt pad planner."
      ],
      "retrieval_phrases": [
        "Furniture felt pad planner",
        "furniture felt pad planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "12,8",
            "b": "8,6"
          },
          "outputs": [
            {
              "label": "Packs by shape",
              "value": "2, 2"
            },
            {
              "label": "Spare pads by shape",
              "value": "4, 4"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1020",
      "name": "Clothes drying rack capacity",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "Single linear rail or combined uninterrupted equivalent, identical garment widths, gap only between adjacent garments. Separate rails must be evaluated separately.",
      "url": "/calculators/clothes-drying-rack-capacity/",
      "version": "0af863c79e0cc94e46d15b8df049dcbba68b762181500556e86b605d512fc8b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Usable rail length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Garment width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Gap between garments (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Garments to dry",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Garment capacity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Overflow garments",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Rail used by fitted load (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single linear rail or combined uninterrupted equivalent, identical garment widths, gap only between adjacent garments. Separate rails must be evaluated separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Garment capacity",
          "text": "Fit repeated garment widths plus gaps, allowing no gap after the last garment."
        },
        {
          "label": "Overflow garments",
          "text": "Subtract rail capacity from garment count, floored at zero."
        },
        {
          "label": "Rail used by fitted load (cm)",
          "text": "Multiply fitted garments by width plus gap and remove the final gap."
        }
      ],
      "example_questions": [
        "Use the Clothes drying rack capacity calculator.",
        "Help me calculate clothes drying rack capacity."
      ],
      "retrieval_phrases": [
        "Clothes drying rack capacity",
        "clothes drying rack capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 40,
            "c": 10,
            "d": 8
          },
          "outputs": [
            {
              "label": "Garment capacity",
              "value": 6
            },
            {
              "label": "Overflow garments",
              "value": 2
            },
            {
              "label": "Rail used by fitted load (cm)",
              "value": 290
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1023",
      "name": "Replacement appliance clearance",
      "category": "Home cleaning and maintenance",
      "status": "available",
      "purpose": "Axis-aligned rectangular appliance; clearance entries are total allowance per axis, e.g. both sides combined. Does not check door swing or installation safety.",
      "url": "/calculators/replacement-appliance-clearance/",
      "version": "88a4e06bd4a792f4097e122d5f4ca03b19b3c675620fdd5f316a1f8db8c53744",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Opening width, height, depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Appliance width, height, depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Total required clearances per axis (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Remaining clearance by axis (cm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Fits all three axes",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Axis-aligned rectangular appliance; clearance entries are total allowance per axis, e.g. both sides combined. Does not check door swing or installation safety."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Remaining clearance by axis (cm)",
          "text": "Subtract appliance dimension and required total clearance from each opening dimension."
        },
        {
          "label": "Fits all three axes",
          "text": "Every dimension must have nonnegative remaining clearance."
        }
      ],
      "example_questions": [
        "Use the Replacement appliance clearance calculator.",
        "Help me calculate replacement appliance clearance."
      ],
      "retrieval_phrases": [
        "Replacement appliance clearance",
        "replacement appliance clearance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "65,90,70",
            "b": "60,85,60",
            "c": "4,3,8"
          },
          "outputs": [
            {
              "label": "Remaining clearance by axis (cm)",
              "value": "1, 2, 2"
            },
            {
              "label": "Fits all three axes",
              "value": "Yes"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1027",
      "name": "Washer load utilization",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Adds dry item weights and compares with the supplied program-specific limit. Volume, fabric-care compatibility and manufacturer loading rules remain separate.",
      "url": "/calculators/washer-load-utilization/",
      "version": "a75044306e1d51b19144158c12cee8775fa230372d5f5be3203f5995010dd8b7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Dry garment weights (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Rated capacity for selected program (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Dry load (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rated capacity used (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining capacity (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds dry item weights and compares with the supplied program-specific limit. Volume, fabric-care compatibility and manufacturer loading rules remain separate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Dry load (kg)",
          "text": "Add dry garment weights."
        },
        {
          "label": "Rated capacity used (%)",
          "text": "Divide total dry mass by program capacity."
        },
        {
          "label": "Remaining capacity (kg)",
          "text": "Subtract total mass from the supplied rated capacity; negative means over capacity."
        }
      ],
      "example_questions": [
        "Use the Washer load utilization calculator.",
        "Help me calculate washer load utilization."
      ],
      "retrieval_phrases": [
        "Washer load utilization",
        "washer load utilization"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,1.5",
            "b": 6
          },
          "outputs": [
            {
              "label": "Dry load (kg)",
              "value": 4.5
            },
            {
              "label": "Rated capacity used (%)",
              "value": 75
            },
            {
              "label": "Remaining capacity (kg)",
              "value": 1.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1030",
      "name": "Laundry water use comparison",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Same entered weekly load mix for two supplied program-water scenarios; excludes supply leaks and other household water.",
      "url": "/calculators/laundry-water-use-comparison/",
      "version": "bca589281ee34a5c8268868159555af9398119cd4d93ff2ebb004f8b29782ad2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Weekly loads by program",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Option A water per load (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Option B water per load (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Option A weekly water (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Option B weekly water (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Weekly reduction (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Same entered weekly load mix for two supplied program-water scenarios; excludes supply leaks and other household water."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Option A weekly water (L)",
          "text": "Sum weekly load count times water per load for option A."
        },
        {
          "label": "Option B weekly water (L)",
          "text": "Repeat for option B."
        },
        {
          "label": "Weekly reduction (L)",
          "text": "Subtract option B water use from option A."
        }
      ],
      "example_questions": [
        "Use the Laundry water use comparison calculator.",
        "Help me calculate laundry water use comparison."
      ],
      "retrieval_phrases": [
        "Laundry water use comparison",
        "laundry water use comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,2",
            "b": "40,60",
            "c": "30,45"
          },
          "outputs": [
            {
              "label": "Option A weekly water (L)",
              "value": 240
            },
            {
              "label": "Option B weekly water (L)",
              "value": 180
            },
            {
              "label": "Weekly reduction (L)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1031",
      "name": "Line drying peg inventory",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Groups share a continuous line. Enter occupied width including the desired gap. Pegs are assigned per garment without sharing.",
      "url": "/calculators/line-drying-peg-inventory/",
      "version": "0a0ae86816bf4f19fb50f824c77b322bd7180d8dd6e01923e96cba0622e990ff",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Garment counts by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Pegs per garment by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Line width per garment by group (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Spare pegs (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Working pegs",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Pegs including spares",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Required line (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Groups share a continuous line. Enter occupied width including the desired gap. Pegs are assigned per garment without sharing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Working pegs",
          "text": "Multiply garment counts by pegs per garment and add."
        },
        {
          "label": "Pegs including spares",
          "text": "Apply spare percentage and round up."
        },
        {
          "label": "Required line (m)",
          "text": "Add occupied centimetres and divide by 100."
        }
      ],
      "example_questions": [
        "Use the Line drying peg inventory calculator.",
        "Help me calculate line drying peg inventory."
      ],
      "retrieval_phrases": [
        "Line drying peg inventory",
        "line drying peg inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "8,4",
            "b": "2,3",
            "c": "30,50",
            "d": 10
          },
          "outputs": [
            {
              "label": "Working pegs",
              "value": 28
            },
            {
              "label": "Pegs including spares",
              "value": 31
            },
            {
              "label": "Required line (m)",
              "value": 4.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1032",
      "name": "Ironing workload estimate",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "One setup per session; garments can be distributed across sessions by work minutes, so suggested sessions are a workload lower bound rather than an indivisible-garment packing schedule.",
      "url": "/calculators/ironing-workload-estimate/",
      "version": "16fcb9cd5bb244a26a11abf870830018200dce04d34e7c759c46dc46c14303e1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Garment counts by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured ironing minutes per garment",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Setup time (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Available session length (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Work minutes by type",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Hands-on ironing (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Minimum sessions by time",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One setup per session; garments can be distributed across sessions by work minutes, so suggested sessions are a workload lower bound rather than an indivisible-garment packing schedule."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Work minutes by type",
          "text": "Multiply each garment count by its measured time."
        },
        {
          "label": "Hands-on ironing (min)",
          "text": "Sum all garment processing minutes."
        },
        {
          "label": "Minimum sessions by time",
          "text": "Divide processing minutes by usable session time after setup and round up."
        }
      ],
      "example_questions": [
        "Use the Ironing workload estimate calculator.",
        "Help me calculate ironing workload estimate."
      ],
      "retrieval_phrases": [
        "Ironing workload estimate",
        "ironing workload estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,3",
            "b": "4,6",
            "c": 10,
            "d": 30
          },
          "outputs": [
            {
              "label": "Work minutes by type",
              "value": "20, 18"
            },
            {
              "label": "Hands-on ironing (min)",
              "value": 38
            },
            {
              "label": "Minimum sessions by time",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1033",
      "name": "Dry cleaning versus ownership",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Cleaning is charged after each complete wear interval, including a final complete interval; no resale value or time value of money.",
      "url": "/calculators/dry-cleaning-versus-ownership/",
      "version": "a742fa3d6041dfb6f4034d4c87765a4b9aaa0dfd2dd167c59d34f9b03dfdc20b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Garment purchase price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected lifetime wears",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Dry-cleaning charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Wears between cleanings",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Lifetime cleanings",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Lifetime ownership and care cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cost per wear",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Cleaning is charged after each complete wear interval, including a final complete interval; no resale value or time value of money."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Lifetime cleanings",
          "text": "Count completed wear intervals."
        },
        {
          "label": "Lifetime ownership and care cost",
          "text": "Add purchase price and cleaning charges."
        },
        {
          "label": "Cost per wear",
          "text": "Divide total lifetime cost by wears."
        }
      ],
      "example_questions": [
        "Use the Dry cleaning versus ownership calculator.",
        "Help me calculate dry cleaning versus ownership."
      ],
      "retrieval_phrases": [
        "Dry cleaning versus ownership",
        "dry cleaning versus ownership"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 40,
            "c": 12,
            "d": 4
          },
          "outputs": [
            {
              "label": "Lifetime cleanings",
              "value": 10
            },
            {
              "label": "Lifetime ownership and care cost",
              "value": 240
            },
            {
              "label": "Cost per wear",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1034",
      "name": "Wardrobe wear frequency",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "One count per garment over a common observation window. Rates describe the log only and do not predict future wear.",
      "url": "/calculators/wardrobe-wear-frequency/",
      "version": "7a912191f61e249ea6f2cad51f076c08d719fdcd423e582727311020d5341d64",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Wear counts by garment",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observation days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Wears per garment per week",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unused garments",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total recorded wears",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One count per garment over a common observation window. Rates describe the log only and do not predict future wear."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Wears per garment per week",
          "text": "Divide each count by observed days and multiply by seven."
        },
        {
          "label": "Unused garments",
          "text": "Count garments with zero recorded wears."
        },
        {
          "label": "Total recorded wears",
          "text": "Sum all garment wear counts."
        }
      ],
      "example_questions": [
        "Use the Wardrobe wear frequency calculator.",
        "Help me calculate wardrobe wear frequency."
      ],
      "retrieval_phrases": [
        "Wardrobe wear frequency",
        "wardrobe wear frequency"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,2,4",
            "b": 28
          },
          "outputs": [
            {
              "label": "Wears per garment per week",
              "value": "0, 0.5, 1"
            },
            {
              "label": "Unused garments",
              "value": 1
            },
            {
              "label": "Total recorded wears",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1035",
      "name": "Clothing resale net return",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Fees apply to item sale prices; shipping collected, tax and returns are excluded. Preparation is entered as a cost, including any chosen labour valuation.",
      "url": "/calculators/clothing-resale-net-return/",
      "version": "c1763e5703d7caf52b5dc8105608be008f66b30d20fc322e8e06043759421c62",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Sale prices by garment (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Platform percentage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fixed fee per garment (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Packing costs by garment (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Preparation costs by garment (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net receipts by garment",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total net receipts",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fees apply to item sale prices; shipping collected, tax and returns are excluded. Preparation is entered as a cost, including any chosen labour valuation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net receipts by garment",
          "text": "Subtract percentage fee, fixed fee, packing and preparation from each sale."
        },
        {
          "label": "Total net receipts",
          "text": "Add individual net receipts."
        }
      ],
      "example_questions": [
        "Use the Clothing resale net return calculator.",
        "Help me calculate clothing resale net return."
      ],
      "retrieval_phrases": [
        "Clothing resale net return",
        "clothing resale net return"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,50",
            "b": 10,
            "c": 1,
            "d": "2,3",
            "e": "3,4"
          },
          "outputs": [
            {
              "label": "Net receipts by garment",
              "value": "21, 37"
            },
            {
              "label": "Total net receipts",
              "value": 58
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1036",
      "name": "Clothing alteration comparison",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Each option represents buying and altering one garment; care, resale and financing are excluded.",
      "url": "/calculators/clothing-alteration-comparison/",
      "version": "aa5a8a9f2383c0a0408fc9f85aacbfb2450c9bc71390d67b243f83bf729642c4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Purchase prices by option (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Alteration quotes by option (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Expected wears by option",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Adjusted total by option",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cost per wear by option",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each option represents buying and altering one garment; care, resale and financing are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Adjusted total by option",
          "text": "Add each purchase price and alteration quote."
        },
        {
          "label": "Cost per wear by option",
          "text": "Divide each adjusted cost by its expected wears."
        }
      ],
      "example_questions": [
        "Use the Clothing alteration comparison calculator.",
        "Help me calculate clothing alteration comparison."
      ],
      "retrieval_phrases": [
        "Clothing alteration comparison",
        "clothing alteration comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "80,100",
            "b": "20,0",
            "c": "50,40"
          },
          "outputs": [
            {
              "label": "Adjusted total by option",
              "value": "100, 100"
            },
            {
              "label": "Cost per wear by option",
              "value": "2, 2.5"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1037",
      "name": "Hem shortening pin guide",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "All distances are measured from the same garment top datum. Cutting opens/removes the existing hem; new cut line must lie within current finished length.",
      "url": "/calculators/hem-shortening-pin-guide/",
      "version": "4ddf6773037cbbd60f93264740a87791b911f6b9360497f9889b5b3a0570ff04",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current finished length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired finished length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "New hem allowance (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Shortening at finished edge (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "New cut line from top (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Distance above current edge to cut (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All distances are measured from the same garment top datum. Cutting opens/removes the existing hem; new cut line must lie within current finished length."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Shortening at finished edge (cm)",
          "text": "Subtract desired finished length from current length."
        },
        {
          "label": "New cut line from top (cm)",
          "text": "Add the new hem allowance to desired finished length."
        },
        {
          "label": "Distance above current edge to cut (cm)",
          "text": "Subtract the proposed cut-line position from current finished length."
        }
      ],
      "example_questions": [
        "Use the Hem shortening pin guide calculator.",
        "Help me calculate hem shortening pin guide."
      ],
      "retrieval_phrases": [
        "Hem shortening pin guide",
        "hem shortening pin guide"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 90,
            "c": 3
          },
          "outputs": [
            {
              "label": "Shortening at finished edge (cm)",
              "value": 10
            },
            {
              "label": "New cut line from top (cm)",
              "value": 93
            },
            {
              "label": "Distance above current edge to cut (cm)",
              "value": 7
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1038",
      "name": "Sleeve alteration symmetry",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Sleeves use the same shoulder datum; existing hems are opened before cutting. Only shortening is supported.",
      "url": "/calculators/sleeve-alteration-symmetry/",
      "version": "632c5470492905a6e86961e65a4d2503c1cd032eaf0073cae1650779d05fad31",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Left sleeve length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Right sleeve length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Desired finished length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "New hem allowance (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Left finished shortening (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Right finished shortening (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Left and right cut removal (cm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Existing sleeve mismatch (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sleeves use the same shoulder datum; existing hems are opened before cutting. Only shortening is supported."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Left finished shortening (cm)",
          "text": "Subtract desired length from current left length."
        },
        {
          "label": "Right finished shortening (cm)",
          "text": "Subtract desired length from current right length."
        },
        {
          "label": "Left and right cut removal (cm)",
          "text": "Reserve the new hem allowance when determining removed cloth."
        },
        {
          "label": "Existing sleeve mismatch (cm)",
          "text": "Subtract right measured length from left."
        }
      ],
      "example_questions": [
        "Use the Sleeve alteration symmetry calculator.",
        "Help me calculate sleeve alteration symmetry."
      ],
      "retrieval_phrases": [
        "Sleeve alteration symmetry",
        "sleeve alteration symmetry"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 64,
            "b": 63,
            "c": 60,
            "d": 2
          },
          "outputs": [
            {
              "label": "Left finished shortening (cm)",
              "value": 4
            },
            {
              "label": "Right finished shortening (cm)",
              "value": 3
            },
            {
              "label": "Left and right cut removal (cm)",
              "value": "2, 1"
            },
            {
              "label": "Existing sleeve mismatch (cm)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1041",
      "name": "Garment measurement tolerance check",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Dimensions must share measurement positions and conventions; the same inclusive tolerance applies to every location.",
      "url": "/calculators/garment-measurement-tolerance-check/",
      "version": "4a27878498c924f2347acbf9a6322e3e12db7abc5d8aed11b92006378882b9e4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Advertised dimensions (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured dimensions (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Allowed absolute error (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Measured minus listed (cm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Locations outside tolerance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Dimensions must share measurement positions and conventions; the same inclusive tolerance applies to every location."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Measured minus listed (cm)",
          "text": "Subtract advertised measurement from actual measurement at each location."
        },
        {
          "label": "Locations outside tolerance",
          "text": "Count absolute discrepancies greater than the allowed error."
        }
      ],
      "example_questions": [
        "Use the Garment measurement tolerance check calculator.",
        "Help me calculate garment measurement tolerance check."
      ],
      "retrieval_phrases": [
        "Garment measurement tolerance check",
        "garment measurement tolerance check"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "50,70",
            "b": "51,68",
            "c": 1
          },
          "outputs": [
            {
              "label": "Measured minus listed (cm)",
              "value": "1, -2"
            },
            {
              "label": "Locations outside tolerance",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1042",
      "name": "Closet rail packing",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Hangers run along a straight rail at fixed center spacing, with entered end clearance. Shoulder width is checked against closet depth; this geometric check does not assess rail strength.",
      "url": "/calculators/closet-rail-packing/",
      "version": "cb130c7911823b62a5a5e0239773a492c80fa0656a3d35630bf72ac6a5086635",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rail length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hanger center spacing (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "End clearance at each end (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Garments to hang",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Garment shoulder width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "g",
          "label": "Closet internal depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Rail garment capacity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Garment overflow",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining usable rail (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Hangers run along a straight rail at fixed center spacing, with entered end clearance. Shoulder width is checked against closet depth; this geometric check does not assess rail strength."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Rail garment capacity",
          "text": "Subtract end clearances, divide by hanger spacing and round down; zero capacity if shoulders exceed depth."
        },
        {
          "label": "Garment overflow",
          "text": "Subtract usable garment capacity from requested garments."
        },
        {
          "label": "Remaining usable rail (cm)",
          "text": "Subtract occupied hanger intervals from usable rail."
        }
      ],
      "example_questions": [
        "Use the Closet rail packing calculator.",
        "Help me calculate closet rail packing."
      ],
      "retrieval_phrases": [
        "Closet rail packing",
        "closet rail packing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 5,
            "c": 10,
            "d": 25,
            "e": 45,
            "g": 60
          },
          "outputs": [
            {
              "label": "Rail garment capacity",
              "value": 20
            },
            {
              "label": "Garment overflow",
              "value": 5
            },
            {
              "label": "Remaining usable rail (cm)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1043",
      "name": "Drawer folding layout",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Identical folded blocks in a fixed axis-aligned orientation, with no compression. Returns a regular grid; does not claim optimal rotated packing.",
      "url": "/calculators/drawer-folding-layout/",
      "version": "d34f65d8bcd5c067d1671b51311ea7cbb8d0cbbe3bdbcc94b46f0bb0ebaee5cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Drawer width, depth, height (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Folded garment width, depth, height (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Garments",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Grid columns, rows, layers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Garment capacity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Overflow",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Identical folded blocks in a fixed axis-aligned orientation, with no compression. Returns a regular grid; does not claim optimal rotated packing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Grid columns, rows, layers",
          "text": "Divide each drawer dimension by its corresponding block dimension and round down."
        },
        {
          "label": "Garment capacity",
          "text": "Multiply columns, rows and layers."
        },
        {
          "label": "Overflow",
          "text": "Subtract grid capacity from garment count."
        }
      ],
      "example_questions": [
        "Use the Drawer folding layout calculator.",
        "Help me calculate drawer folding layout."
      ],
      "retrieval_phrases": [
        "Drawer folding layout",
        "drawer folding layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "60,40,20",
            "b": "15,20,5",
            "c": 20
          },
          "outputs": [
            {
              "label": "Grid columns, rows, layers",
              "value": "4, 2, 4"
            },
            {
              "label": "Garment capacity",
              "value": 32
            },
            {
              "label": "Overflow",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1044",
      "name": "Seasonal wardrobe storage",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Group order defines labels 1, 2, and so on. Groups receive separate identical containers, with contents treated as divisible measured volume.",
      "url": "/calculators/seasonal-wardrobe-storage/",
      "version": "9ba16596a6f2ff763a33bd4b6f0ab281e8d44677b34f477896d38f7af90b531b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Garment volumes by labeled group (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Container volume (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Extra packing allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Containers by group",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total containers",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Spare volume by group (L)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Group order defines labels 1, 2, and so on. Groups receive separate identical containers, with contents treated as divisible measured volume."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Containers by group",
          "text": "Apply packing allowance to each group and round up its container count."
        },
        {
          "label": "Total containers",
          "text": "Sum separately allocated containers."
        },
        {
          "label": "Spare volume by group (L)",
          "text": "Subtract adjusted group volume from allocated container volume."
        }
      ],
      "example_questions": [
        "Use the Seasonal wardrobe storage calculator.",
        "Help me calculate seasonal wardrobe storage."
      ],
      "retrieval_phrases": [
        "Seasonal wardrobe storage",
        "seasonal wardrobe storage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,50",
            "b": 20,
            "c": 20
          },
          "outputs": [
            {
              "label": "Containers by group",
              "value": "2, 3"
            },
            {
              "label": "Total containers",
              "value": 5
            },
            {
              "label": "Spare volume by group (L)",
              "value": "4, 0"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1045",
      "name": "Laundry lost-item reconciliation",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Lists correspond to the same bag identifiers in the same order; counts reveal bag-level differences without identifying particular garments.",
      "url": "/calculators/laundry-lost-item-reconciliation/",
      "version": "3a39a0eb7dd831c427012c88f27463e693a81639c8561f0f1c30e43272f3c24b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Items sent by bag",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Items returned by same bag",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Missing counts by bag",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Surplus counts by bag",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Overall sent minus returned",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Lists correspond to the same bag identifiers in the same order; counts reveal bag-level differences without identifying particular garments."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Missing counts by bag",
          "text": "Subtract returned from sent counts, retaining positive shortages."
        },
        {
          "label": "Surplus counts by bag",
          "text": "Subtract sent from returned counts, retaining positive surpluses."
        },
        {
          "label": "Overall sent minus returned",
          "text": "Compare total item counts across all bags."
        }
      ],
      "example_questions": [
        "Use the Laundry lost-item reconciliation calculator.",
        "Help me calculate laundry lost-item reconciliation."
      ],
      "retrieval_phrases": [
        "Laundry lost-item reconciliation",
        "laundry lost item reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,8,6",
            "b": "9,9,6"
          },
          "outputs": [
            {
              "label": "Missing counts by bag",
              "value": "1, 0, 0"
            },
            {
              "label": "Surplus counts by bag",
              "value": "0, 1, 0"
            },
            {
              "label": "Overall sent minus returned",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1046",
      "name": "Hotel linen par stock",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Each occupied bed holds one set; circulating inventory covers average daily changes during measured laundry turnaround, rounded up, plus explicit reserve.",
      "url": "/calculators/hotel-linen-par-stock/",
      "version": "d4ec38ebb4b1dc2387ab9b78365e93b00a29d3d243dc6ef95771f3d5848d325e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Occupied beds",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Changes per bed per day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Laundry turnaround (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reserve linen sets",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sets in laundry circulation",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total linen sets",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each occupied bed holds one set; circulating inventory covers average daily changes during measured laundry turnaround, rounded up, plus explicit reserve."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sets in laundry circulation",
          "text": "Multiply beds, daily changes and turnaround days, then round up."
        },
        {
          "label": "Total linen sets",
          "text": "Add sets on beds, sets in circulation and reserve."
        }
      ],
      "example_questions": [
        "Use the Hotel linen par stock calculator.",
        "Help me calculate hotel linen par stock."
      ],
      "retrieval_phrases": [
        "Hotel linen par stock",
        "hotel linen par stock"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 1,
            "c": 2,
            "d": 10
          },
          "outputs": [
            {
              "label": "Sets in laundry circulation",
              "value": 40
            },
            {
              "label": "Total linen sets",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1047",
      "name": "Uniform issue inventory",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Sizes follow the entered order and cannot substitute for one another. Each staff member receives identical set quantity.",
      "url": "/calculators/uniform-issue-inventory/",
      "version": "d24a836d99b4ac88be3324769bea8b74b44c212c02cb10e4c2ee56099320b472",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Staff counts by size",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Sets per person",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Spare sets by same size",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Order sets by size",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total sets",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sizes follow the entered order and cannot substitute for one another. Each staff member receives identical set quantity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Order sets by size",
          "text": "Multiply staff per size by issue sets, then add size-specific spares."
        },
        {
          "label": "Total sets",
          "text": "Add all issue sets and all spare sets."
        }
      ],
      "example_questions": [
        "Use the Uniform issue inventory calculator.",
        "Help me calculate uniform issue inventory."
      ],
      "retrieval_phrases": [
        "Uniform issue inventory",
        "uniform issue inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,8,2",
            "b": 3,
            "c": "2,2,1"
          },
          "outputs": [
            {
              "label": "Order sets by size",
              "value": "17, 26, 7"
            },
            {
              "label": "Total sets",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1049",
      "name": "Fabric stain treatment test log",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Compares measured area change in separate test patches. Negative removal indicates a measured increase; area reduction is not proof of fabric safety or removal of invisible residues.",
      "url": "/calculators/fabric-stain-treatment-test-log/",
      "version": "b281d7c0825a0fbde5fda1e3093b345efe17023fc4ed67e902bb9ca781bce370",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Before stain areas (cm²)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "After stain areas (cm²)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Treatment durations (min)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed area removal (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Area removal rate (cm²/min)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares measured area change in separate test patches. Negative removal indicates a measured increase; area reduction is not proof of fabric safety or removal of invisible residues."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed area removal (%)",
          "text": "Divide each measured reduction by its starting area."
        },
        {
          "label": "Area removal rate (cm²/min)",
          "text": "Divide each measured reduction by test duration."
        }
      ],
      "example_questions": [
        "Use the Fabric stain treatment test log calculator.",
        "Help me calculate fabric stain treatment test log."
      ],
      "retrieval_phrases": [
        "Fabric stain treatment test log",
        "fabric stain treatment test log"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "2,5",
            "c": "4,5"
          },
          "outputs": [
            {
              "label": "Observed area removal (%)",
              "value": "80, 75"
            },
            {
              "label": "Area removal rate (cm²/min)",
              "value": "2, 3"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1050",
      "name": "Garment repair break-even",
      "category": "Laundry and wardrobe logistics",
      "status": "available",
      "purpose": "Compares cost per future wear only; existing purchase is sunk, and both options exclude maintenance and resale.",
      "url": "/calculators/garment-repair-break-even/",
      "version": "a96e5abbb9859089f419b477caf86fc7cc4a66f9f9ca6b47158d8f264764380d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Repair quote (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected extra repaired wears",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Replacement purchase (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Expected replacement wears",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Repair cost per extra wear",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Replacement cost per wear",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Maximum repair price at equal cost per wear",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares cost per future wear only; existing purchase is sunk, and both options exclude maintenance and resale."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Repair cost per extra wear",
          "text": "Divide repair quote by additional expected wears."
        },
        {
          "label": "Replacement cost per wear",
          "text": "Divide replacement price by expected wears."
        },
        {
          "label": "Maximum repair price at equal cost per wear",
          "text": "Multiply replacement cost per wear by repaired garment extra wears."
        }
      ],
      "example_questions": [
        "Use the Garment repair break-even calculator.",
        "Help me calculate garment repair break-even."
      ],
      "retrieval_phrases": [
        "Garment repair break-even",
        "garment repair break even"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 20,
            "c": 100,
            "d": 50
          },
          "outputs": [
            {
              "label": "Repair cost per extra wear",
              "value": 1.5
            },
            {
              "label": "Replacement cost per wear",
              "value": 2
            },
            {
              "label": "Maximum repair price at equal cost per wear",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1051",
      "name": "Moving box allocation",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Uses measured packed volumes, not raw item bounding boxes. Each room gets separate identical boxes, contents treated as divisible volume; weight and fragile-item constraints are excluded.",
      "url": "/calculators/moving-box-allocation/",
      "version": "2e83a30cfbe444e05ac38c8abf8b7be9b4f7bd19483fe7f4139a2c1a3ba9d2e4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Packed item volume by room (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Usable box capacity (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Boxes by room",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total boxes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused box volume by room (L)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses measured packed volumes, not raw item bounding boxes. Each room gets separate identical boxes, contents treated as divisible volume; weight and fragile-item constraints are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Boxes by room",
          "text": "Round each room volume divided by box capacity up."
        },
        {
          "label": "Total boxes",
          "text": "Add room-specific whole-box counts."
        },
        {
          "label": "Unused box volume by room (L)",
          "text": "Subtract room content volume from assigned box capacity."
        }
      ],
      "example_questions": [
        "Use the Moving box allocation calculator.",
        "Help me calculate moving box allocation."
      ],
      "retrieval_phrases": [
        "Moving box allocation",
        "moving box allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "80,120",
            "b": 50
          },
          "outputs": [
            {
              "label": "Boxes by room",
              "value": "2, 3"
            },
            {
              "label": "Total boxes",
              "value": 5
            },
            {
              "label": "Unused box volume by room (L)",
              "value": "20, 30"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1052",
      "name": "Moving truck trip planner",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Volume-only planning lower bound using measured packed inventory and a user-selected usable fraction. Does not certify payload or geometric fit.",
      "url": "/calculators/moving-truck-trip-planner/",
      "version": "df5ff36845414a8b27883ffdece20d100dd0023dd73c1d42861b0240da8d3f4c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Inventory volume (m³)",
          "type": "number",
          "required": true,
          "unit": "m3",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Truck internal volume (m³)",
          "type": "number",
          "required": true,
          "unit": "m3",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable loading fraction (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usable volume per trip (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required trips",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Volume after first trip (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Volume-only planning lower bound using measured packed inventory and a user-selected usable fraction. Does not certify payload or geometric fit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usable volume per trip (m³)",
          "text": "Apply usable loading percentage to internal volume."
        },
        {
          "label": "Required trips",
          "text": "Round inventory divided by usable trip capacity up."
        },
        {
          "label": "Volume after first trip (m³)",
          "text": "Subtract first-trip capacity from inventory, floored at zero."
        }
      ],
      "example_questions": [
        "Use the Moving truck trip planner calculator.",
        "Help me calculate moving truck trip planner."
      ],
      "retrieval_phrases": [
        "Moving truck trip planner",
        "moving truck trip planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 25,
            "b": 15,
            "c": 80
          },
          "outputs": [
            {
              "label": "Usable volume per trip (m³)",
              "value": 12
            },
            {
              "label": "Required trips",
              "value": 3
            },
            {
              "label": "Volume after first trip (m³)",
              "value": 13
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1057",
      "name": "Storage retrieval access cost",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Location times include moving obstructing boxes and replacing them. Retrieves are independent; combined trips are not credited.",
      "url": "/calculators/storage-retrieval-access-cost/",
      "version": "8366c71de209c81005979afdb84b06177820cdce887a6ab41558e3c248ec73f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Expected retrievals by location",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Round-trip retrieval minutes by location",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Retrieval time by location (min)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total retrieval workload (h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Location times include moving obstructing boxes and replacing them. Retrieves are independent; combined trips are not credited."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Retrieval time by location (min)",
          "text": "Multiply expected retrieval count by measured trip time at each location."
        },
        {
          "label": "Total retrieval workload (h)",
          "text": "Sum retrieval minutes and divide by sixty."
        }
      ],
      "example_questions": [
        "Use the Storage retrieval access cost calculator.",
        "Help me calculate storage retrieval access cost."
      ],
      "retrieval_phrases": [
        "Storage retrieval access cost",
        "storage retrieval access cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,5",
            "b": "3,8"
          },
          "outputs": [
            {
              "label": "Retrieval time by location (min)",
              "value": "30, 40"
            },
            {
              "label": "Total retrieval workload (h)",
              "value": 1.1666666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1059",
      "name": "Moving elevator slot schedule",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Identical load units must satisfy building weight and size rules supplied separately. Constant cycle includes loading, unloading and return.",
      "url": "/calculators/moving-elevator-slot-schedule/",
      "version": "71daf2ffb2544a56981a1acad6377f07833fbd1b570d3ed6c14679e9d284e5da",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Identical loads to move",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Loads per elevator cycle",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Full cycle including return (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Booked window (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Elevator cycles",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required time (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Booking slack (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Identical load units must satisfy building weight and size rules supplied separately. Constant cycle includes loading, unloading and return."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Elevator cycles",
          "text": "Divide loads by cycle capacity and round up."
        },
        {
          "label": "Required time (min)",
          "text": "Multiply cycles by measured full-cycle duration."
        },
        {
          "label": "Booking slack (min)",
          "text": "Subtract required cycle time from booking window."
        }
      ],
      "example_questions": [
        "Use the Moving elevator slot schedule calculator.",
        "Help me calculate moving elevator slot schedule."
      ],
      "retrieval_phrases": [
        "Moving elevator slot schedule",
        "moving elevator slot schedule"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 4,
            "c": 8,
            "d": 45
          },
          "outputs": [
            {
              "label": "Elevator cycles",
              "value": 5
            },
            {
              "label": "Required time (min)",
              "value": 40
            },
            {
              "label": "Booking slack (min)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1061",
      "name": "Packing material shopping list",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Enter measured wrap rectangles including overlaps per item. Groups may share rolls; aggregate area is a purchase estimate, not a cutting-layout guarantee.",
      "url": "/calculators/packing-material-shopping-list/",
      "version": "e8a7a797dc6b87657d1862cf74151f20d66fed442ebec95e1eed65d27e9c9365",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Item counts by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Wrap area per layer by group (m²)",
          "type": "array",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Layers by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Roll area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Wrap area by group (m²)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total roll count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter measured wrap rectangles including overlaps per item. Groups may share rolls; aggregate area is a purchase estimate, not a cutting-layout guarantee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Wrap area by group (m²)",
          "text": "Multiply items, wrap area per layer and layer count."
        },
        {
          "label": "Total roll count",
          "text": "Divide aggregate wrapping area by roll area and round up."
        }
      ],
      "example_questions": [
        "Use the Packing material shopping list calculator.",
        "Help me calculate packing material shopping list."
      ],
      "retrieval_phrases": [
        "Packing material shopping list",
        "packing material shopping list"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,6",
            "b": "2,1",
            "c": "2,1",
            "d": 10
          },
          "outputs": [
            {
              "label": "Wrap area by group (m²)",
              "value": "16, 6"
            },
            {
              "label": "Total roll count",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1063",
      "name": "Move overlap housing cost",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "User supplies counted overlap days under their agreements. Reports double-housing cash outlay and incremental old-home-plus-extra costs relative to paying only the new home.",
      "url": "/calculators/move-overlap-housing-cost/",
      "version": "7c9560aaede6042933a19a16df013a9e8ac5c6e1c761d2fcbc512109830691b7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Overlap days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Old housing daily cost (currency/day)",
          "type": "number",
          "required": true,
          "unit": "currency/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "New housing daily cost (currency/day)",
          "type": "number",
          "required": true,
          "unit": "currency/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Extra daily utilities (currency/day)",
          "type": "number",
          "required": true,
          "unit": "currency/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Temporary storage total (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Both homes during overlap",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total overlap outlay",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Incremental overlap cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "User supplies counted overlap days under their agreements. Reports double-housing cash outlay and incremental old-home-plus-extra costs relative to paying only the new home."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Both homes during overlap",
          "text": "Multiply overlap days by both daily housing rates."
        },
        {
          "label": "Total overlap outlay",
          "text": "Add both housing rates, extra utilities and storage."
        },
        {
          "label": "Incremental overlap cost",
          "text": "Exclude the new-home cost that would occur anyway."
        }
      ],
      "example_questions": [
        "Use the Move overlap housing cost calculator.",
        "Help me calculate move overlap housing cost."
      ],
      "retrieval_phrases": [
        "Move overlap housing cost",
        "move overlap housing cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 40,
            "c": 50,
            "d": 5,
            "e": 100
          },
          "outputs": [
            {
              "label": "Both homes during overlap",
              "value": 900
            },
            {
              "label": "Total overlap outlay",
              "value": 1050
            },
            {
              "label": "Incremental overlap cost",
              "value": 550
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1065",
      "name": "Truck hire mileage allowance",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "All entered legs count against one hire allowance. Fuel, tax and deposits are excluded unless included in base hire.",
      "url": "/calculators/truck-hire-mileage-allowance/",
      "version": "8d3f826a48871b9e588248770f79d496e9eb27e8894729e5e375a75acea60ccf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Route leg distances (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Included mileage (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Excess fee (currency/km)",
          "type": "number",
          "required": true,
          "unit": "currency/km",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Base hire charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total route (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Excess mileage (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Hire charge",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All entered legs count against one hire allowance. Fuel, tax and deposits are excluded unless included in base hire."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total route (km)",
          "text": "Sum all route-leg distances."
        },
        {
          "label": "Excess mileage (km)",
          "text": "Subtract included mileage, floored at zero."
        },
        {
          "label": "Hire charge",
          "text": "Add excess mileage charge to base hire."
        }
      ],
      "example_questions": [
        "Use the Truck hire mileage allowance calculator.",
        "Help me calculate truck hire mileage allowance."
      ],
      "retrieval_phrases": [
        "Truck hire mileage allowance",
        "truck hire mileage allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,80,40",
            "b": 150,
            "c": 0.5,
            "d": 100
          },
          "outputs": [
            {
              "label": "Total route (km)",
              "value": 220
            },
            {
              "label": "Excess mileage (km)",
              "value": 70
            },
            {
              "label": "Hire charge",
              "value": 135
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1066",
      "name": "Storage introductory offer comparison",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Whole-month billing with introductory pricing only for the first entered number of months. Insurance and tax should be included in supplied prices if applicable.",
      "url": "/calculators/storage-introductory-offer-comparison/",
      "version": "84a8eedb35e56a36d666c801c870c36ae975fe389a829c950adeddd3114ba78d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Stay (whole months)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Introductory months",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Intro monthly price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Regular monthly price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "One-time fees",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Introductory cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Standard-period cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total stay cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Effective monthly cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Whole-month billing with introductory pricing only for the first entered number of months. Insurance and tax should be included in supplied prices if applicable."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Introductory cost",
          "text": "Charge the smaller of stay months and offer months at the intro price."
        },
        {
          "label": "Standard-period cost",
          "text": "Charge remaining stay months at the regular price."
        },
        {
          "label": "Total stay cost",
          "text": "Add intro cost, standard cost and one-time fees."
        },
        {
          "label": "Effective monthly cost",
          "text": "Divide total stay cost by billed months."
        }
      ],
      "example_questions": [
        "Use the Storage introductory offer comparison calculator.",
        "Help me calculate storage introductory offer comparison."
      ],
      "retrieval_phrases": [
        "Storage introductory offer comparison",
        "storage introductory offer comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6,
            "b": 2,
            "c": 20,
            "d": 60,
            "e": 30
          },
          "outputs": [
            {
              "label": "Introductory cost",
              "value": 40
            },
            {
              "label": "Standard-period cost",
              "value": 240
            },
            {
              "label": "Total stay cost",
              "value": 310
            },
            {
              "label": "Effective monthly cost",
              "value": 51.666666666666664
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1067",
      "name": "Self-move versus removals",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Each expense is entered once in the matching scenario. Self labour expense is paid labour; own time is valued separately.",
      "url": "/calculators/self-move-versus-removals/",
      "version": "b23aaa6202287c29ccc13cec594ee00f54a82a883fda6ccd1e834bf7dd6c2ca8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Self-move vehicle, labour, supplies, hotel costs",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Removal company itemized quote",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Self-move work hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Chosen hourly value of own time",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Self-move cash cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Self-move including own time",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Removal-company total",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Company minus self cash cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each expense is entered once in the matching scenario. Self labour expense is paid labour; own time is valued separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Self-move cash cost",
          "text": "Sum vehicle, paid labour, supplies and hotel expenses."
        },
        {
          "label": "Self-move including own time",
          "text": "Add chosen value of unpaid work hours."
        },
        {
          "label": "Removal-company total",
          "text": "Sum all supplied company quote line items."
        },
        {
          "label": "Company minus self cash cost",
          "text": "Subtract self-move cash cost from company total."
        }
      ],
      "example_questions": [
        "Use the Self-move versus removals calculator.",
        "Help me calculate self-move versus removals."
      ],
      "retrieval_phrases": [
        "Self-move versus removals",
        "self move versus removals"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,80,40,60",
            "b": "300,50",
            "c": 10,
            "d": 15
          },
          "outputs": [
            {
              "label": "Self-move cash cost",
              "value": 280
            },
            {
              "label": "Self-move including own time",
              "value": 430
            },
            {
              "label": "Removal-company total",
              "value": 350
            },
            {
              "label": "Company minus self cash cost",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1070",
      "name": "Decluttering sale donation ledger",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Donation items have zero receipts and any direct fee entered explicitly. Does not estimate tax benefits.",
      "url": "/calculators/decluttering-sale-donation-ledger/",
      "version": "ba113f5bb1b4798b6e82ba2cf5f601d10c9b9bfc42a037cc6bea9a9c1250e916",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Expected sale receipts by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Fees by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Handling minutes by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Chosen time value per hour",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net cash recovered",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Handling hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Recovery after chosen time value",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Donation items have zero receipts and any direct fee entered explicitly. Does not estimate tax benefits."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net cash recovered",
          "text": "Subtract all direct fees from expected receipts."
        },
        {
          "label": "Handling hours",
          "text": "Add handling minutes and convert to hours."
        },
        {
          "label": "Recovery after chosen time value",
          "text": "Subtract the entered valuation of handling time from net cash."
        }
      ],
      "example_questions": [
        "Use the Decluttering sale donation ledger calculator.",
        "Help me calculate decluttering sale donation ledger."
      ],
      "retrieval_phrases": [
        "Decluttering sale donation ledger",
        "decluttering sale donation ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,40,0",
            "b": "2,4,0",
            "c": "30,60,30",
            "d": 12
          },
          "outputs": [
            {
              "label": "Net cash recovered",
              "value": 54
            },
            {
              "label": "Handling hours",
              "value": 2
            },
            {
              "label": "Recovery after chosen time value",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1071",
      "name": "Household contents volume survey",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Each row is a labeled room/item group of identical rectangular bounding boxes. Packing multiplier allows voids; does not prove actual truck packing feasibility.",
      "url": "/calculators/household-contents-volume-survey/",
      "version": "47ed3e6382de3fc65f0dcf4d6f31145d82d669588941a7a0aa2e0f8f694a9af3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Item lengths (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Item widths (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Item heights (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Item counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Packing multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Raw volume by group (m³)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Household raw volume (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Planning volume (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each row is a labeled room/item group of identical rectangular bounding boxes. Packing multiplier allows voids; does not prove actual truck packing feasibility."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Raw volume by group (m³)",
          "text": "Multiply length, width, height and count for each group."
        },
        {
          "label": "Household raw volume (m³)",
          "text": "Sum rectangular group volumes."
        },
        {
          "label": "Planning volume (m³)",
          "text": "Multiply raw volume by the supplied packing factor."
        }
      ],
      "example_questions": [
        "Use the Household contents volume survey calculator.",
        "Help me calculate household contents volume survey."
      ],
      "retrieval_phrases": [
        "Household contents volume survey",
        "household contents volume survey"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2",
            "b": "0.5,1",
            "c": "0.5,1",
            "d": "4,2",
            "e": 1.2
          },
          "outputs": [
            {
              "label": "Raw volume by group (m³)",
              "value": "1, 4"
            },
            {
              "label": "Household raw volume (m³)",
              "value": 5
            },
            {
              "label": "Planning volume (m³)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1073",
      "name": "Storage humidity log summary",
      "category": "Moving and household storage",
      "status": "available",
      "purpose": "Each observation represents the supplied interval without interpolation. Bands are user-chosen; no preservation or health recommendation.",
      "url": "/calculators/storage-humidity-log-summary/",
      "version": "7acc1a63f50ee43fd2020431d6ed769eb16880553df7d4b51cdaedf159e3a0b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Humidity observations (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Hours represented by each reading",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Chosen lower bound (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Chosen upper bound (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Hours inside chosen band",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Hours outside chosen band",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each observation represents the supplied interval without interpolation. Bands are user-chosen; no preservation or health recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed hours",
          "text": "Add represented interval durations."
        },
        {
          "label": "Hours inside chosen band",
          "text": "Sum durations whose readings lie within inclusive bounds."
        },
        {
          "label": "Hours outside chosen band",
          "text": "Sum durations outside the bounds."
        }
      ],
      "example_questions": [
        "Use the Storage humidity log summary calculator.",
        "Help me calculate storage humidity log summary."
      ],
      "retrieval_phrases": [
        "Storage humidity log summary",
        "storage humidity log summary"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,55,70",
            "b": "2,3,1",
            "c": 45,
            "d": 65
          },
          "outputs": [
            {
              "label": "Observed hours",
              "value": 6
            },
            {
              "label": "Hours inside chosen band",
              "value": 3
            },
            {
              "label": "Hours outside chosen band",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1076",
      "name": "Bulk purchase spoilage tradeoff",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Constant consumption starts immediately. Units are divisible; expiry is a user-supplied usable window and not a food safety recommendation.",
      "url": "/calculators/bulk-purchase-spoilage-tradeoff/",
      "version": "58f8450042c11282d6903a7fff0918ca2cba156b0f7b9b191a27cd7091862c28",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pack quantity (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Usage per day (units/day)",
          "type": "number",
          "required": true,
          "unit": "units/day",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable days before expiry",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Pack price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usable quantity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unused quantity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Price per used unit",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant consumption starts immediately. Units are divisible; expiry is a user-supplied usable window and not a food safety recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usable quantity",
          "text": "Use no more than pack contents or demand before expiry."
        },
        {
          "label": "Unused quantity",
          "text": "Subtract demand before expiry from pack contents."
        },
        {
          "label": "Price per used unit",
          "text": "Divide pack cost by quantity actually used."
        }
      ],
      "example_questions": [
        "Use the Bulk purchase spoilage tradeoff calculator.",
        "Help me calculate bulk purchase spoilage tradeoff."
      ],
      "retrieval_phrases": [
        "Bulk purchase spoilage tradeoff",
        "bulk purchase spoilage tradeoff"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 2,
            "c": 30,
            "d": 20
          },
          "outputs": [
            {
              "label": "Usable quantity",
              "value": 60
            },
            {
              "label": "Unused quantity",
              "value": 40
            },
            {
              "label": "Price per used unit",
              "value": 0.3333333333333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1077",
      "name": "Reusable versus disposable payback",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "One reusable item lasts the supplied whole-use lifetime, then is replaced at the same price. Reports first-item break-even and recurring lifetime economics.",
      "url": "/calculators/reusable-versus-disposable-payback/",
      "version": "8634e32ba1e727a4278eebe9831358dd23389d30820730b61b83ea338868ef3a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Reusable purchase price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Disposable price per use",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reusable cleaning cost per use",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reusable lifetime (uses)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "First-item break-even uses",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Reusable lifetime cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Disposable cost over same uses",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Break-even within first lifetime",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One reusable item lasts the supplied whole-use lifetime, then is replaced at the same price. Reports first-item break-even and recurring lifetime economics."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "First-item break-even uses",
          "text": "Divide purchase price by savings per use and round up."
        },
        {
          "label": "Reusable lifetime cost",
          "text": "Add purchase and cleaning over the supplied life."
        },
        {
          "label": "Disposable cost over same uses",
          "text": "Multiply disposable per-use price by reusable life."
        },
        {
          "label": "Break-even within first lifetime",
          "text": "Compare break-even use count with supplied lifetime."
        }
      ],
      "example_questions": [
        "Use the Reusable versus disposable payback calculator.",
        "Help me calculate reusable versus disposable payback."
      ],
      "retrieval_phrases": [
        "Reusable versus disposable payback",
        "reusable versus disposable payback"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 1,
            "c": 0.2,
            "d": 50
          },
          "outputs": [
            {
              "label": "First-item break-even uses",
              "value": 25
            },
            {
              "label": "Reusable lifetime cost",
              "value": 30
            },
            {
              "label": "Disposable cost over same uses",
              "value": 50
            },
            {
              "label": "Break-even within first lifetime",
              "value": "Yes"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1078",
      "name": "Appliance warranty scenario",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Single possible covered repair with entered probability; warranty pays the remainder of that repair. Excludes exclusions, multiple failures, timing and reimbursement risk.",
      "url": "/calculators/appliance-warranty-scenario/",
      "version": "1782e1de0cb14aeb009df60594e8cd1f2052d6d36e663c6bf7d9f4de7c1f15e7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Warranty price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "User-assumed covered failure probability (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Repair cost without warranty",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Repair excess with warranty",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected repair cost without warranty",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected cost with warranty",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected warranty cost difference",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single possible covered repair with entered probability; warranty pays the remainder of that repair. Excludes exclusions, multiple failures, timing and reimbursement risk."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected repair cost without warranty",
          "text": "Multiply supplied failure probability by repair cost."
        },
        {
          "label": "Expected cost with warranty",
          "text": "Add warranty price to probability-weighted excess."
        },
        {
          "label": "Expected warranty cost difference",
          "text": "Subtract expected no-warranty cost from with-warranty cost."
        }
      ],
      "example_questions": [
        "Use the Appliance warranty scenario calculator.",
        "Help me calculate appliance warranty scenario."
      ],
      "retrieval_phrases": [
        "Appliance warranty scenario",
        "appliance warranty scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 20,
            "c": 250,
            "d": 20
          },
          "outputs": [
            {
              "label": "Expected repair cost without warranty",
              "value": 50
            },
            {
              "label": "Expected cost with warranty",
              "value": 64
            },
            {
              "label": "Expected warranty cost difference",
              "value": 14
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1079",
      "name": "Subscription delivery stock balance",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Delivery arrives at the start of each cycle, then constant consumption occurs. Negative closing balances indicate unmet demand; no perishability model.",
      "url": "/calculators/subscription-delivery-stock-balance/",
      "version": "cde52a148b226f6bb4fd3788c472ae51800163e846b7adb4c575f83e91423bce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starting inventory (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Delivery quantity (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Delivery interval (days)",
          "type": "integer",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Consumption (units/day)",
          "type": "number",
          "required": true,
          "unit": "units/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Delivery cycles to project",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Closing inventory after each cycle",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net inventory change per cycle",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Projected shortage at worst cycle (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Delivery arrives at the start of each cycle, then constant consumption occurs. Negative closing balances indicate unmet demand; no perishability model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Closing inventory after each cycle",
          "text": "For each completed cycle add deliveries and subtract interval consumption."
        },
        {
          "label": "Net inventory change per cycle",
          "text": "Subtract cycle consumption from delivered quantity."
        },
        {
          "label": "Projected shortage at worst cycle (units)",
          "text": "For this linear trajectory inspect first and final closing balances."
        }
      ],
      "example_questions": [
        "Use the Subscription delivery stock balance calculator.",
        "Help me calculate subscription delivery stock balance."
      ],
      "retrieval_phrases": [
        "Subscription delivery stock balance",
        "subscription delivery stock balance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 10,
            "c": 7,
            "d": 1,
            "e": 3
          },
          "outputs": [
            {
              "label": "Closing inventory after each cycle",
              "value": "8, 11, 14"
            },
            {
              "label": "Net inventory change per cycle",
              "value": 3
            },
            {
              "label": "Projected shortage at worst cycle (units)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1080",
      "name": "Coupon basket eligibility",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Single percentage coupon; threshold tests eligible subtotal before discount. Excluded items never count toward the threshold. No stacking or taxes.",
      "url": "/calculators/coupon-basket-eligibility/",
      "version": "b65c3e96153660eae1f40511096d863a56a1b67904a2f37965402abd4507e1bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible item subtotal",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Excluded item subtotal",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Required eligible spend",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Coupon rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Discount cap",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Coupon qualifies",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Discount",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Final basket",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single percentage coupon; threshold tests eligible subtotal before discount. Excluded items never count toward the threshold. No stacking or taxes."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Coupon qualifies",
          "text": "Compare eligible subtotal with the stated threshold."
        },
        {
          "label": "Discount",
          "text": "If eligible, apply percentage discount capped at the supplied limit."
        },
        {
          "label": "Final basket",
          "text": "Subtract discount from all item subtotals."
        }
      ],
      "example_questions": [
        "Use the Coupon basket eligibility calculator.",
        "Help me calculate coupon basket eligibility."
      ],
      "retrieval_phrases": [
        "Coupon basket eligibility",
        "coupon basket eligibility"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 20,
            "c": 50,
            "d": 25,
            "e": 15
          },
          "outputs": [
            {
              "label": "Coupon qualifies",
              "value": "Yes"
            },
            {
              "label": "Discount",
              "value": 15
            },
            {
              "label": "Final basket",
              "value": 85
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1081",
      "name": "Buy-one-get-one basket optimizer",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Buy-c-get-d-free applies only to identical items at one price. Full groups receive free units; incomplete groups are charged normally. Quantity is fixed, so no extra items are added.",
      "url": "/calculators/buy-one-get-one-basket-optimizer/",
      "version": "9e755409f9a9d8ee9d2d46fa795c698ec0272ae2b10640aa80f6ba85afd7de70",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Identical item quantity",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Regular unit price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Paid items per promotion group",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Free items per promotion group",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Free units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Charged units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Basket price",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Buy-c-get-d-free applies only to identical items at one price. Full groups receive free units; incomplete groups are charged normally. Quantity is fixed, so no extra items are added."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Free units",
          "text": "Count complete promotion groups and multiply by free units."
        },
        {
          "label": "Charged units",
          "text": "Subtract free units from requested quantity."
        },
        {
          "label": "Basket price",
          "text": "Multiply charged units by regular unit price."
        }
      ],
      "example_questions": [
        "Use the Buy-one-get-one basket optimizer calculator.",
        "Help me calculate buy-one-get-one basket optimizer."
      ],
      "retrieval_phrases": [
        "Buy-one-get-one basket optimizer",
        "buy one get one basket optimizer"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 7,
            "b": 5,
            "c": 1,
            "d": 1
          },
          "outputs": [
            {
              "label": "Free units",
              "value": 3
            },
            {
              "label": "Charged units",
              "value": 4
            },
            {
              "label": "Basket price",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1082",
      "name": "Gift card breakage estimate",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Each card has a separate spend plan, already restricted to purchases before its expiry. No transfers between cards or future purchases are assumed.",
      "url": "/calculators/gift-card-breakage-estimate/",
      "version": "73f6cd6ef1700cdf0fbdafd049e09eb9ecf7ac8a1d3b44f2b29db78e8c631da1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gift-card balances",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Eligible planned spend before each expiry",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usable value by card",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Stranded total balance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total additional cash needed",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each card has a separate spend plan, already restricted to purchases before its expiry. No transfers between cards or future purchases are assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usable value by card",
          "text": "Take the smaller of each balance and eligible planned spend."
        },
        {
          "label": "Stranded total balance",
          "text": "Sum card balances not covered by planned spend."
        },
        {
          "label": "Total additional cash needed",
          "text": "Sum planned spend exceeding each corresponding balance."
        }
      ],
      "example_questions": [
        "Use the Gift card breakage estimate calculator.",
        "Help me calculate gift card breakage estimate."
      ],
      "retrieval_phrases": [
        "Gift card breakage estimate",
        "gift card breakage estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,50",
            "b": "20,80"
          },
          "outputs": [
            {
              "label": "Usable value by card",
              "value": "20, 50"
            },
            {
              "label": "Stranded total balance",
              "value": 10
            },
            {
              "label": "Total additional cash needed",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1083",
      "name": "Reward points redemption comparison",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Values each redemption against its comparable supplied cash price, net of mandatory cash fees. No external point valuation or availability is assumed.",
      "url": "/calculators/reward-points-redemption-comparison/",
      "version": "88488533cfbffbf996eab703dfffde4f90434c022bc252ab912e4035971b3da7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cash prices by option",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Points required by option",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Mandatory cash fees by option",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Value per point by option",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cash avoided by option",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Values each redemption against its comparable supplied cash price, net of mandatory cash fees. No external point valuation or availability is assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Value per point by option",
          "text": "Subtract mandatory cash fee from comparable cash price and divide by required points."
        },
        {
          "label": "Cash avoided by option",
          "text": "Subtract redemption fee from the cash alternative."
        }
      ],
      "example_questions": [
        "Use the Reward points redemption comparison calculator.",
        "Help me calculate reward points redemption comparison."
      ],
      "retrieval_phrases": [
        "Reward points redemption comparison",
        "reward points redemption comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,150",
            "b": "10000,12000",
            "c": "20,30"
          },
          "outputs": [
            {
              "label": "Value per point by option",
              "value": "0.008, 0.01"
            },
            {
              "label": "Cash avoided by option",
              "value": "80, 120"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1084",
      "name": "Cashback capped offer planner",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "One cashback offer on eligible spend; threshold is tested before reward and cap is an absolute reward amount.",
      "url": "/calculators/cashback-capped-offer-planner/",
      "version": "88519f3faf48f3c30e0a5933951d2a362f9b43063a6e18e445a2a711560e722c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible spend",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cashback rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reward cap",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Qualification threshold",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Reward earned",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Effective eligible purchase cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Spend at which cap is reached",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One cashback offer on eligible spend; threshold is tested before reward and cap is an absolute reward amount."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Reward earned",
          "text": "Apply percentage reward only above threshold, limited by cap."
        },
        {
          "label": "Effective eligible purchase cost",
          "text": "Subtract reward from eligible spend."
        },
        {
          "label": "Spend at which cap is reached",
          "text": "Divide reward cap by reward rate and respect the qualification threshold; zero rate returns zero."
        }
      ],
      "example_questions": [
        "Use the Cashback capped offer planner calculator.",
        "Help me calculate cashback capped offer planner."
      ],
      "retrieval_phrases": [
        "Cashback capped offer planner",
        "cashback capped offer planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 250,
            "b": 5,
            "c": 10,
            "d": 100
          },
          "outputs": [
            {
              "label": "Reward earned",
              "value": 10
            },
            {
              "label": "Effective eligible purchase cost",
              "value": 240
            },
            {
              "label": "Spend at which cap is reached",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1086",
      "name": "Return postage purchase risk",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Returned item receives purchase price less percentage restocking charge. Original shipping and return postage are not refunded. No probability assumption.",
      "url": "/calculators/return-postage-purchase-risk/",
      "version": "5459e97c0cd32cfefcce4358dbaad5ff5da8a031c7092710705ad083c97e501e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Purchase price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Original nonrefundable shipping",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Return postage",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Restocking rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Keep outcome cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Return refund",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Return outcome net cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Returned item receives purchase price less percentage restocking charge. Original shipping and return postage are not refunded. No probability assumption."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Keep outcome cost",
          "text": "Add purchase price and original shipping."
        },
        {
          "label": "Return refund",
          "text": "Deduct restocking percentage from item price."
        },
        {
          "label": "Return outcome net cost",
          "text": "Add nonrefunded shipping, return postage and restocking deduction."
        }
      ],
      "example_questions": [
        "Use the Return postage purchase risk calculator.",
        "Help me calculate return postage purchase risk."
      ],
      "retrieval_phrases": [
        "Return postage purchase risk",
        "return postage purchase risk"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 5,
            "c": 10,
            "d": 15
          },
          "outputs": [
            {
              "label": "Keep outcome cost",
              "value": 105
            },
            {
              "label": "Return refund",
              "value": 85
            },
            {
              "label": "Return outcome net cost",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1087",
      "name": "Refill packaging price comparison",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "A container is bought before the first refill and replaced after each full lifetime if more refills follow. All refills deliver the same number of uses.",
      "url": "/calculators/refill-packaging-price-comparison/",
      "version": "4e49833651dd157543467e3992d5e28eabdb6ab5e4408f65179a794d59e581d5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starter container cost",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Refill pack price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Yield per refill (uses)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Container replacement interval (refills)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Refills to compare",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Containers purchased",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total repeated-refill cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cost per delivered use",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A container is bought before the first refill and replaced after each full lifetime if more refills follow. All refills deliver the same number of uses."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Containers purchased",
          "text": "Divide refill count by container lifetime and round up."
        },
        {
          "label": "Total repeated-refill cost",
          "text": "Add container purchases and all refill costs."
        },
        {
          "label": "Cost per delivered use",
          "text": "Divide total cost by refill count times delivered uses."
        }
      ],
      "example_questions": [
        "Use the Refill packaging price comparison calculator.",
        "Help me calculate refill packaging price comparison."
      ],
      "retrieval_phrases": [
        "Refill packaging price comparison",
        "refill packaging price comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 6,
            "c": 20,
            "d": 5,
            "e": 10
          },
          "outputs": [
            {
              "label": "Containers purchased",
              "value": 2
            },
            {
              "label": "Total repeated-refill cost",
              "value": 84
            },
            {
              "label": "Cost per delivered use",
              "value": 0.42
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1088",
      "name": "Household membership break-even",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Discounts apply to the supplied category spend without caps or exclusions. Break-even scale preserves this exact category mix.",
      "url": "/calculators/household-membership-break-even/",
      "version": "132717766667913153e6585a5a60d2c82b8210b74319473d55c7694113ac52a0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual membership fee",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual spending by category",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Supplied discount by category (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual gross savings",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net savings after fee",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Break-even total spend at this mix",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Discounts apply to the supplied category spend without caps or exclusions. Break-even scale preserves this exact category mix."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual gross savings",
          "text": "Multiply each category spend by its discount and add."
        },
        {
          "label": "Net savings after fee",
          "text": "Subtract membership fee from discounts."
        },
        {
          "label": "Break-even total spend at this mix",
          "text": "Scale total basket spend until discounts equal the fee."
        }
      ],
      "example_questions": [
        "Use the Household membership break-even calculator.",
        "Help me calculate household membership break-even."
      ],
      "retrieval_phrases": [
        "Household membership break-even",
        "household membership break even"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": "500,200",
            "c": "10,5"
          },
          "outputs": [
            {
              "label": "Annual gross savings",
              "value": 60
            },
            {
              "label": "Net savings after fee",
              "value": 0
            },
            {
              "label": "Break-even total spend at this mix",
              "value": 700
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1089",
      "name": "Shopping travel savings threshold",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Travel cost per kilometre is supplied by the user and can include fuel and running cost. All travel is attributed to this shopping trip.",
      "url": "/calculators/shopping-travel-savings-threshold/",
      "version": "ed1bcfc793f728a6fb1923da8991010be89678dc295a41c51ee19a8194cb2d67",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Basket saving before travel",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Round-trip distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Travel cost (currency/km)",
          "type": "number",
          "required": true,
          "unit": "currency/km",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Trip time (h)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Chosen time value (currency/h)",
          "type": "number",
          "required": true,
          "unit": "currency/h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Parking and tolls",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cash travel cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net saving including time",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Minimum basket saving to break even",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Travel cost per kilometre is supplied by the user and can include fuel and running cost. All travel is attributed to this shopping trip."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cash travel cost",
          "text": "Add distance cost, parking and tolls."
        },
        {
          "label": "Net saving including time",
          "text": "Subtract cash travel expense and valued trip time from basket savings."
        },
        {
          "label": "Minimum basket saving to break even",
          "text": "Add all cash and time costs."
        }
      ],
      "example_questions": [
        "Use the Shopping travel savings threshold calculator.",
        "Help me calculate shopping travel savings threshold."
      ],
      "retrieval_phrases": [
        "Shopping travel savings threshold",
        "shopping travel savings threshold"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 25,
            "b": 20,
            "c": 0.3,
            "d": 1,
            "e": 10,
            "g": 2
          },
          "outputs": [
            {
              "label": "Cash travel cost",
              "value": 8
            },
            {
              "label": "Net saving including time",
              "value": 7
            },
            {
              "label": "Minimum basket saving to break even",
              "value": 18
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1091",
      "name": "Shared bulk order settlement",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Discount and delivery are allocated in proportion to quantities. Charges are mathematical shares before currency rounding; they sum to the order total.",
      "url": "/calculators/shared-bulk-order-settlement/",
      "version": "1fe514bddac3b64336dfebf809e15ff3425921881626fcce148c7a9067843152",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Participant quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Unit price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Order-wide discount (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Delivery fee",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Participant charges",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total order charge",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Discount and delivery are allocated in proportion to quantities. Charges are mathematical shares before currency rounding; they sum to the order total."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Participant charges",
          "text": "Allocate discounted goods and delivery proportionally by participant quantity."
        },
        {
          "label": "Total order charge",
          "text": "Apply goods discount then add delivery."
        }
      ],
      "example_questions": [
        "Use the Shared bulk order settlement calculator.",
        "Help me calculate shared bulk order settlement."
      ],
      "retrieval_phrases": [
        "Shared bulk order settlement",
        "shared bulk order settlement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3,5",
            "b": 10,
            "c": 10,
            "d": 10
          },
          "outputs": [
            {
              "label": "Participant charges",
              "value": "20, 30, 50"
            },
            {
              "label": "Total order charge",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1092",
      "name": "Produce pack edible value",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Edible fractions come from the user’s measured trimming yields; no nutrition or freshness assessment.",
      "url": "/calculators/produce-pack-edible-value/",
      "version": "d2cd63eef622bfd292c1c8f5d828d6f98cf946acfffbd0b9c181f98d9f991a33",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pack weights by option (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observed edible fraction by option (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Pack prices",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Edible mass by option (kg)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cost per edible kg",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Edible fractions come from the user’s measured trimming yields; no nutrition or freshness assessment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Edible mass by option (kg)",
          "text": "Multiply gross pack mass by edible fraction."
        },
        {
          "label": "Cost per edible kg",
          "text": "Divide pack price by edible mass."
        }
      ],
      "example_questions": [
        "Use the Produce pack edible value calculator.",
        "Help me calculate produce pack edible value."
      ],
      "retrieval_phrases": [
        "Produce pack edible value",
        "produce pack edible value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": "75,80",
            "c": "6,12"
          },
          "outputs": [
            {
              "label": "Edible mass by option (kg)",
              "value": "1.5, 2.4"
            },
            {
              "label": "Cost per edible kg",
              "value": "4, 5"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1094",
      "name": "Replacement-part versus appliance cost",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Undiscounted cost per assumed service year; excludes energy, reliability changes and resale. User estimates useful lives.",
      "url": "/calculators/replacement-part-versus-appliance-cost/",
      "version": "9944c2fa91b533238f27f98c0a11abb42bbf4291fc441290490239c91543d8a5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Replacement part price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Fitting charge",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Expected extra service (years)",
          "type": "number",
          "required": true,
          "unit": "years",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "New appliance installed price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Expected new appliance service (years)",
          "type": "number",
          "required": true,
          "unit": "years",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Repair option cost per service year",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Replacement cost per service year",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Maximum total repair cost at equal annual cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Undiscounted cost per assumed service year; excludes energy, reliability changes and resale. User estimates useful lives."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Repair option cost per service year",
          "text": "Add part and fitting, then divide by extra life."
        },
        {
          "label": "Replacement cost per service year",
          "text": "Divide new installed price by its assumed life."
        },
        {
          "label": "Maximum total repair cost at equal annual cost",
          "text": "Multiply replacement annual cost by repair extension years."
        }
      ],
      "example_questions": [
        "Use the Replacement-part versus appliance cost calculator.",
        "Help me calculate replacement-part versus appliance cost."
      ],
      "retrieval_phrases": [
        "Replacement-part versus appliance cost",
        "replacement part versus appliance cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 60,
            "c": 2,
            "d": 600,
            "e": 10
          },
          "outputs": [
            {
              "label": "Repair option cost per service year",
              "value": 50
            },
            {
              "label": "Replacement cost per service year",
              "value": 60
            },
            {
              "label": "Maximum total repair cost at equal annual cost",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1095",
      "name": "Shopping basket inflation tracker",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Constant-quantity basket with exactly matched items; substitutions must be converted to comparable unit quantities before entry. Index base is 100.",
      "url": "/calculators/shopping-basket-inflation-tracker/",
      "version": "fb241ee372a4a00d4193470a8dc207de672a453c1fae1634b0b3716f8a0c99dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fixed basket quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Base-period unit prices",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Current unit prices",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Base basket cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Current basket cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Price index (base 100)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant-quantity basket with exactly matched items; substitutions must be converted to comparable unit quantities before entry. Index base is 100."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Base basket cost",
          "text": "Multiply fixed quantities by base prices and sum."
        },
        {
          "label": "Current basket cost",
          "text": "Price the same quantities at current prices."
        },
        {
          "label": "Price index (base 100)",
          "text": "Divide current basket cost by base cost and multiply by 100."
        }
      ],
      "example_questions": [
        "Use the Shopping basket inflation tracker calculator.",
        "Help me calculate shopping basket inflation tracker."
      ],
      "retrieval_phrases": [
        "Shopping basket inflation tracker",
        "shopping basket inflation tracker"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": "5,10",
            "c": "6,12"
          },
          "outputs": [
            {
              "label": "Base basket cost",
              "value": 40
            },
            {
              "label": "Current basket cost",
              "value": 48
            },
            {
              "label": "Price index (base 100)",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1096",
      "name": "Price protection claim value",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Assumes the user has verified policy eligibility. Claim is the nonnegative price drop less deduction, capped by the entered policy maximum.",
      "url": "/calculators/price-protection-claim-value/",
      "version": "73d29bfdd651d02b99708952c709ab241593dd1428d0e972032ecf5af04230a9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original eligible purchase price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current eligible price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Claim deduction",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplied maximum refund",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gross price decrease",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Potential claim",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Effective original purchase cost after claim",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the user has verified policy eligibility. Claim is the nonnegative price drop less deduction, capped by the entered policy maximum."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gross price decrease",
          "text": "Subtract current eligible price from original price, floored at zero."
        },
        {
          "label": "Potential claim",
          "text": "Subtract deduction from price decrease and apply the cap."
        },
        {
          "label": "Effective original purchase cost after claim",
          "text": "Subtract potential claim from original price."
        }
      ],
      "example_questions": [
        "Use the Price protection claim value calculator.",
        "Help me calculate price protection claim value."
      ],
      "retrieval_phrases": [
        "Price protection claim value",
        "price protection claim value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 90,
            "c": 5,
            "d": 50
          },
          "outputs": [
            {
              "label": "Gross price decrease",
              "value": 30
            },
            {
              "label": "Potential claim",
              "value": 25
            },
            {
              "label": "Effective original purchase cost after claim",
              "value": 95
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1097",
      "name": "Loyalty tier qualification",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Assumes constant points rate and all new spend is qualifying before the user-supplied deadline. No bonuses or expiring current points.",
      "url": "/calculators/loyalty-tier-qualification/",
      "version": "c3a060ffb07c1ac10c4368810023e79f7e97a2e0205b61b685241a8e7e0bcc5d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current qualifying points",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tier threshold points",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Qualifying points per currency spent",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Days remaining in qualification period",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Points still required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Eligible spend still required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Average required spend per remaining day",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes constant points rate and all new spend is qualifying before the user-supplied deadline. No bonuses or expiring current points."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Points still required",
          "text": "Subtract current qualifying points from the threshold."
        },
        {
          "label": "Eligible spend still required",
          "text": "Divide remaining points by points per currency unit."
        },
        {
          "label": "Average required spend per remaining day",
          "text": "Spread remaining spend evenly over supplied days."
        }
      ],
      "example_questions": [
        "Use the Loyalty tier qualification calculator.",
        "Help me calculate loyalty tier qualification."
      ],
      "retrieval_phrases": [
        "Loyalty tier qualification",
        "loyalty tier qualification"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 700,
            "b": 1000,
            "c": 2,
            "d": 30
          },
          "outputs": [
            {
              "label": "Points still required",
              "value": 300
            },
            {
              "label": "Eligible spend still required",
              "value": 150
            },
            {
              "label": "Average required spend per remaining day",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1098",
      "name": "Free-gift purchase comparison",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Assumes threshold can be reached with exactly the required extra spend. Extra items have no additional value unless included in the user’s gift valuation.",
      "url": "/calculators/free-gift-purchase-comparison/",
      "version": "8b3dbd2df6bbf5e9a82915d31dab2a16b4586e671727d7e65fe8caee741d252a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gift qualification threshold",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Already intended eligible purchases",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Your value of gift",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Extra spend to qualify",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Gift value minus extra spend",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes threshold can be reached with exactly the required extra spend. Extra items have no additional value unless included in the user’s gift valuation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Extra spend to qualify",
          "text": "Subtract intended purchases from required spend."
        },
        {
          "label": "Gift value minus extra spend",
          "text": "Subtract incremental spending from chosen gift value."
        }
      ],
      "example_questions": [
        "Use the Free-gift purchase comparison calculator.",
        "Help me calculate free-gift purchase comparison."
      ],
      "retrieval_phrases": [
        "Free-gift purchase comparison",
        "free gift purchase comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 70,
            "c": 20
          },
          "outputs": [
            {
              "label": "Extra spend to qualify",
              "value": 30
            },
            {
              "label": "Gift value minus extra spend",
              "value": -10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1100",
      "name": "Purchase bundle return repricing",
      "category": "Household purchasing decisions",
      "status": "available",
      "purpose": "Supported rule: initial refund is returned-item share of original bundle price, then the merchant may recover discount on retained items up to a stated cap. Refund never goes below zero.",
      "url": "/calculators/purchase-bundle-return-repricing/",
      "version": "9b7b6926ef322da5539bbeb97b49299f0166b4fdcd19328425fdb046d7cd8164",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original bundle amount paid",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Standalone prices of retained items",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Standalone prices of returned items",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Promotion reversal cap",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Initial prorated refund",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Promotion discount recovered",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Adjusted refund",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Retained-item net cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supported rule: initial refund is returned-item share of original bundle price, then the merchant may recover discount on retained items up to a stated cap. Refund never goes below zero."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Initial prorated refund",
          "text": "Allocate original payment by standalone price weights."
        },
        {
          "label": "Promotion discount recovered",
          "text": "Compare retained standalone value with its original payment share and cap recovery."
        },
        {
          "label": "Adjusted refund",
          "text": "Subtract promotion recovery from prorated refund, floored at zero."
        },
        {
          "label": "Retained-item net cost",
          "text": "Subtract adjusted refund from original bundle payment."
        }
      ],
      "example_questions": [
        "Use the Purchase bundle return repricing calculator.",
        "Help me calculate purchase bundle return repricing."
      ],
      "retrieval_phrases": [
        "Purchase bundle return repricing",
        "purchase bundle return repricing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "40,30",
            "c": "50",
            "d": 30
          },
          "outputs": [
            {
              "label": "Initial prorated refund",
              "value": 41.666666666666664
            },
            {
              "label": "Promotion discount recovered",
              "value": 11.666666666666664
            },
            {
              "label": "Adjusted refund",
              "value": 30
            },
            {
              "label": "Retained-item net cost",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1101",
      "name": "Room rent allocation by area",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "One resident per room. Divide shared area equally, add it to private area, apply agreed quality weights, then normalize to total rent. Amounts are before currency rounding.",
      "url": "/calculators/room-rent-allocation-by-area/",
      "version": "512d70f4a24657560b6aa330bc1398a4ba16ac2d3c097c1c9108ab5a5067a498",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Private room areas (m²)",
          "type": "array",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Shared area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Agreed room quality weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Total rent",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weighted area scores",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rent shares",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One resident per room. Divide shared area equally, add it to private area, apply agreed quality weights, then normalize to total rent. Amounts are before currency rounding."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weighted area scores",
          "text": "Add equal common-area share to each room and apply its agreed weight."
        },
        {
          "label": "Rent shares",
          "text": "Normalize weighted area scores to the total rent."
        }
      ],
      "example_questions": [
        "Use the Room rent allocation by area calculator.",
        "Help me calculate room rent allocation by area."
      ],
      "retrieval_phrases": [
        "Room rent allocation by area",
        "room rent allocation by area"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": 30,
            "c": "1,1",
            "d": 900
          },
          "outputs": [
            {
              "label": "Weighted area scores",
              "value": "25, 35"
            },
            {
              "label": "Rent shares",
              "value": "375, 525"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1102",
      "name": "Shared utility occupancy split",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Fixed cost is split equally among listed residents; variable cost is proportional to counted occupied days. Days are supplied under the household’s agreement.",
      "url": "/calculators/shared-utility-occupancy-split/",
      "version": "e52809275e306adb507cdc90ba1d01cda0a08f5b68bf272c12e3e615ba7df0dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Resident occupied days in bill period",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Fixed portion of bill",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Variable portion of bill",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Bill-period days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Variable charges by resident",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total charges by resident",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed cost is split equally among listed residents; variable cost is proportional to counted occupied days. Days are supplied under the household’s agreement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Variable charges by resident",
          "text": "Allocate variable bill by resident-days."
        },
        {
          "label": "Total charges by resident",
          "text": "Add equal fixed-cost shares to occupancy-weighted variable charges."
        }
      ],
      "example_questions": [
        "Use the Shared utility occupancy split calculator.",
        "Help me calculate shared utility occupancy split."
      ],
      "retrieval_phrases": [
        "Shared utility occupancy split",
        "shared utility occupancy split"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,15",
            "b": 60,
            "c": 90,
            "d": 30
          },
          "outputs": [
            {
              "label": "Variable charges by resident",
              "value": "60, 30"
            },
            {
              "label": "Total charges by resident",
              "value": "90, 60"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1103",
      "name": "Shared grocery ownership ledger",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "One common grocery pool. Remove personal purchases from each payer’s contribution; remaining shared expenses are allocated by agreed consumption weights. Positive balance is money owed back to the payer.",
      "url": "/calculators/shared-grocery-ownership-ledger/",
      "version": "474fd80e6a31562dec55a33348632c5233f41dbbcc780e43ce0a822e86e7bead",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Amount each resident paid",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Agreed consumption weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Excluded personal purchases by payer",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Shared cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Balances by resident",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One common grocery pool. Remove personal purchases from each payer’s contribution; remaining shared expenses are allocated by agreed consumption weights. Positive balance is money owed back to the payer."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Shared cost",
          "text": "Subtract personal purchases from total paid."
        },
        {
          "label": "Balances by resident",
          "text": "Subtract each resident’s weighted shared cost from their eligible payment."
        }
      ],
      "example_questions": [
        "Use the Shared grocery ownership ledger calculator.",
        "Help me calculate shared grocery ownership ledger."
      ],
      "retrieval_phrases": [
        "Shared grocery ownership ledger",
        "shared grocery ownership ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "80,20",
            "b": "3,2",
            "c": "10,0"
          },
          "outputs": [
            {
              "label": "Shared cost",
              "value": 90
            },
            {
              "label": "Balances by resident",
              "value": "16, -16"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1104",
      "name": "Guest stay household contribution",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Applies only an agreed household policy. Nightly charge and additional shared expenses are distinct to avoid double-counting.",
      "url": "/calculators/guest-stay-household-contribution/",
      "version": "cf4a52af7b3d56265498b14753a474560ef68f1247c047218a3e810ad9c0009d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Guest nights",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Agreed charge per night",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Additional shared expenses",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Guest share of additional expenses (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Nightly contribution",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Additional expense share",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total guest contribution",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Applies only an agreed household policy. Nightly charge and additional shared expenses are distinct to avoid double-counting."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Nightly contribution",
          "text": "Multiply guest nights by agreed rate."
        },
        {
          "label": "Additional expense share",
          "text": "Apply agreed percentage to additional expenses."
        },
        {
          "label": "Total guest contribution",
          "text": "Add nightly and expense contributions."
        }
      ],
      "example_questions": [
        "Use the Guest stay household contribution calculator.",
        "Help me calculate guest stay household contribution."
      ],
      "retrieval_phrases": [
        "Guest stay household contribution",
        "guest stay household contribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 10,
            "c": 30,
            "d": 50
          },
          "outputs": [
            {
              "label": "Nightly contribution",
              "value": 50
            },
            {
              "label": "Additional expense share",
              "value": 15
            },
            {
              "label": "Total guest contribution",
              "value": 65
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1105",
      "name": "Shared appliance ownership buyout",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Ownership is proportional to original contributions. Remaining owners buy out the departing owner in proportion to their existing contributions; value is agreed, not appraised.",
      "url": "/calculators/shared-appliance-ownership-buyout/",
      "version": "16c4df12e78d13eb3af140eb18cbbeb8c243494acb18cc9304ab6d3d879ce354",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original owner contributions",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Agreed current appliance value",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Departing owner number",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Departing owner buyout",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Payments by remaining owners",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining ownership shares (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ownership is proportional to original contributions. Remaining owners buy out the departing owner in proportion to their existing contributions; value is agreed, not appraised."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Departing owner buyout",
          "text": "Multiply current agreed value by departing ownership share."
        },
        {
          "label": "Payments by remaining owners",
          "text": "Allocate buyout among remaining contribution weights."
        },
        {
          "label": "Remaining ownership shares (%)",
          "text": "Normalize remaining contributions to 100%."
        }
      ],
      "example_questions": [
        "Use the Shared appliance ownership buyout calculator.",
        "Help me calculate shared appliance ownership buyout."
      ],
      "retrieval_phrases": [
        "Shared appliance ownership buyout",
        "shared appliance ownership buyout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200,100",
            "b": 200,
            "c": 2
          },
          "outputs": [
            {
              "label": "Departing owner buyout",
              "value": 100
            },
            {
              "label": "Payments by remaining owners",
              "value": "50, 50"
            },
            {
              "label": "Remaining ownership shares (%)",
              "value": "50, 50"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1106",
      "name": "Security deposit deduction split",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Deductions are allocated using agreed weights, not legal responsibility. Negative refund means the assigned deduction exceeds that resident’s deposit.",
      "url": "/calculators/security-deposit-deduction-split/",
      "version": "d33a9b7e2fe3b3a1885c2d7c82f213f0f01a9d531c5332fb9c5762b6274ae639",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Deposits contributed by resident",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Total documented deductions",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Agreed deduction responsibility weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Deductions by resident",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Refunds by resident",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total refunded",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Deductions are allocated using agreed weights, not legal responsibility. Negative refund means the assigned deduction exceeds that resident’s deposit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Deductions by resident",
          "text": "Normalize responsibility weights against total deductions."
        },
        {
          "label": "Refunds by resident",
          "text": "Subtract assigned deductions from each original deposit."
        },
        {
          "label": "Total refunded",
          "text": "Subtract all deductions from deposited total."
        }
      ],
      "example_questions": [
        "Use the Security deposit deduction split calculator.",
        "Help me calculate security deposit deduction split."
      ],
      "retrieval_phrases": [
        "Security deposit deduction split",
        "security deposit deduction split"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "500,500",
            "b": 120,
            "c": "2,1"
          },
          "outputs": [
            {
              "label": "Deductions by resident",
              "value": "80, 40"
            },
            {
              "label": "Refunds by resident",
              "value": "420, 460"
            },
            {
              "label": "Total refunded",
              "value": 880
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1107",
      "name": "Building lift cost allocation",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Supported agreed policy uses floor number times usage multiplier. Ground-floor units have zero weight unless an agreed positive equivalent floor number is supplied.",
      "url": "/calculators/building-lift-cost-allocation/",
      "version": "c1677b19aa81442d0fe42da8a61c1f1ed4bfae14e4ca19c7c8dae5ff347bdcd4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unit floor numbers",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Agreed usage multipliers",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Lift maintenance budget",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Allocation weights",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unit charges",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supported agreed policy uses floor number times usage multiplier. Ground-floor units have zero weight unless an agreed positive equivalent floor number is supplied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Allocation weights",
          "text": "Multiply each floor index by its agreed usage multiplier."
        },
        {
          "label": "Unit charges",
          "text": "Normalize weights to total maintenance budget."
        }
      ],
      "example_questions": [
        "Use the Building lift cost allocation calculator.",
        "Help me calculate building lift cost allocation."
      ],
      "retrieval_phrases": [
        "Building lift cost allocation",
        "building lift cost allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3",
            "b": "1,1,2",
            "c": 900
          },
          "outputs": [
            {
              "label": "Allocation weights",
              "value": "1, 2, 6"
            },
            {
              "label": "Unit charges",
              "value": "100, 200, 600"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1110",
      "name": "Residents reserve fund projection",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Interest is applied to each opening nonnegative balance, then contribution and spending occur. Negative balances earn no interest and represent a funding shortfall; no borrowing cost.",
      "url": "/calculators/residents-reserve-fund-projection/",
      "version": "8aedd4fd16556a75fc32bb87b8a7d1cca0020a8c4cbf37aa440d3337fb262bc9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Opening reserve",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Contributions by period",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Planned works spending by period",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Interest per period (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Closing fund by period",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Largest projected shortfall",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Interest is applied to each opening nonnegative balance, then contribution and spending occur. Negative balances earn no interest and represent a funding shortfall; no borrowing cost."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Closing fund by period",
          "text": "Roll forward opening balance, interest, contribution and planned works for every period."
        },
        {
          "label": "Largest projected shortfall",
          "text": "Find the largest negative closing balance."
        }
      ],
      "example_questions": [
        "Use the Residents reserve fund projection calculator.",
        "Help me calculate residents reserve fund projection."
      ],
      "retrieval_phrases": [
        "Residents reserve fund projection",
        "residents reserve fund projection"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": "200,200,200",
            "c": "100,1500,100",
            "d": 0
          },
          "outputs": [
            {
              "label": "Closing fund by period",
              "value": "1100, -200, -100"
            },
            {
              "label": "Largest projected shortfall",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1111",
      "name": "Apartment metered water reconciliation",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Bills each unit for its own meter plus an equal share of verified common use. Unexplained volume is reported separately and not charged automatically.",
      "url": "/calculators/apartment-metered-water-reconciliation/",
      "version": "7556a01371a4c616c99f01825b3ae57a9ef8a669822ebed7db47ae46ad124db5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Building metered volume (m³)",
          "type": "number",
          "required": true,
          "unit": "m3",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit metered volumes (m³)",
          "type": "array",
          "required": true,
          "unit": "m3",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Verified common-use volume (m³)",
          "type": "number",
          "required": true,
          "unit": "m3",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Unit water price (currency/m³)",
          "type": "number",
          "required": true,
          "unit": "currency/m³",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unexplained meter difference (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unit charges",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unallocated difference value",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Bills each unit for its own meter plus an equal share of verified common use. Unexplained volume is reported separately and not charged automatically."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unexplained meter difference (m³)",
          "text": "Subtract unit readings and verified common use from building volume."
        },
        {
          "label": "Unit charges",
          "text": "Add equal common-use volume to each unit reading and apply rate."
        },
        {
          "label": "Unallocated difference value",
          "text": "Value the signed unexplained difference at supplied rate."
        }
      ],
      "example_questions": [
        "Use the Apartment metered water reconciliation calculator.",
        "Help me calculate apartment metered water reconciliation."
      ],
      "retrieval_phrases": [
        "Apartment metered water reconciliation",
        "apartment metered water reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "30,50",
            "c": 10,
            "d": 2
          },
          "outputs": [
            {
              "label": "Unexplained meter difference (m³)",
              "value": 10
            },
            {
              "label": "Unit charges",
              "value": "70, 110"
            },
            {
              "label": "Unallocated difference value",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1112",
      "name": "District heating usage allocation",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Usage is metered; standing charge is distributed under supplied weights. The tool does not determine legal allocation rules.",
      "url": "/calculators/district-heating-usage-allocation/",
      "version": "f282d3b0bfee9fa64ba464a46d5d366a19fcfb3c2602ccee413894b83a303a41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unit heat usage (kWh)",
          "type": "array",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Energy price (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": "currency/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Building standing charge",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Standing-charge weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usage charges by unit",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Complete unit bills",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Reconciled total",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Usage is metered; standing charge is distributed under supplied weights. The tool does not determine legal allocation rules."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usage charges by unit",
          "text": "Multiply each unit usage by energy price."
        },
        {
          "label": "Complete unit bills",
          "text": "Add the weighted standing-charge share."
        },
        {
          "label": "Reconciled total",
          "text": "Add metered energy cost and building standing charge."
        }
      ],
      "example_questions": [
        "Use the District heating usage allocation calculator.",
        "Help me calculate district heating usage allocation."
      ],
      "retrieval_phrases": [
        "District heating usage allocation",
        "district heating usage allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,300",
            "b": 0.1,
            "c": 60,
            "d": "1,2"
          },
          "outputs": [
            {
              "label": "Usage charges by unit",
              "value": "10, 30"
            },
            {
              "label": "Complete unit bills",
              "value": "30, 70"
            },
            {
              "label": "Reconciled total",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1113",
      "name": "Community solar share settlement",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Each member receives weighted production; entered self-use cannot exceed that share and the remainder is exported. Tariffs are supplied assumptions.",
      "url": "/calculators/community-solar-share-settlement/",
      "version": "a8440ebbc8560ac741d3031f10d1860e5a18660e1914026b2ac314f183edef6a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total production (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Member production weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Member self-use allocations (kWh)",
          "type": "array",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Avoided purchase value (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": "currency/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Export value (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": "currency/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Member generation shares (kWh)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Member value",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each member receives weighted production; entered self-use cannot exceed that share and the remainder is exported. Tariffs are supplied assumptions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Member generation shares (kWh)",
          "text": "Allocate generation by member weights."
        },
        {
          "label": "Member value",
          "text": "Value self-use at avoided purchase rate and remaining generation at export rate."
        }
      ],
      "example_questions": [
        "Use the Community solar share settlement calculator.",
        "Help me calculate community solar share settlement."
      ],
      "retrieval_phrases": [
        "Community solar share settlement",
        "community solar share settlement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": "1,3",
            "c": "200,500",
            "d": 0.2,
            "e": 0.05
          },
          "outputs": [
            {
              "label": "Member generation shares (kWh)",
              "value": "250, 750"
            },
            {
              "label": "Member value",
              "value": "42.5, 112.5"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1114",
      "name": "Shared internet plan allocation",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Base bill is allocated by agreed weights; individual add-ons are assigned entirely to their matching users. Amounts are before currency rounding.",
      "url": "/calculators/shared-internet-plan-allocation/",
      "version": "7fdee5599d32eb6475a94e191e653fdfedfaf424c3609bd93bd2da74a34508ac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Shared internet base bill",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Agreed user weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Individual add-ons",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "User contributions",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total bill",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Base bill is allocated by agreed weights; individual add-ons are assigned entirely to their matching users. Amounts are before currency rounding."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "User contributions",
          "text": "Allocate base bill proportionally and add each user’s own extras."
        },
        {
          "label": "Total bill",
          "text": "Add base charge and all individual extras."
        }
      ],
      "example_questions": [
        "Use the Shared internet plan allocation calculator.",
        "Help me calculate shared internet plan allocation."
      ],
      "retrieval_phrases": [
        "Shared internet plan allocation",
        "shared internet plan allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": "1,2,1",
            "c": "0,10,5"
          },
          "outputs": [
            {
              "label": "User contributions",
              "value": "15, 40, 20"
            },
            {
              "label": "Total bill",
              "value": 75
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1115",
      "name": "Resident voting threshold check",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Abstentions count toward quorum but not approval denominator. Both thresholds are inclusive. This is a supplied-rule check, not a legal determination.",
      "url": "/calculators/resident-voting-threshold-check/",
      "version": "10cf99d3831b608e13127c1fbde8a1750e489cb263208622cafb67f24e0b5c1b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible voters",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Yes ballots",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "No ballots",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Abstentions",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Quorum (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Required yes share of yes-plus-no (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Participation (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Approval among decisive votes (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Threshold result",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Abstentions count toward quorum but not approval denominator. Both thresholds are inclusive. This is a supplied-rule check, not a legal determination."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Participation (%)",
          "text": "Divide all submitted ballots by eligible voters."
        },
        {
          "label": "Approval among decisive votes (%)",
          "text": "Divide yes votes by yes plus no; no decisive ballots reports zero."
        },
        {
          "label": "Threshold result",
          "text": "Require quorum, at least one decisive vote, and the approval threshold."
        }
      ],
      "example_questions": [
        "Use the Resident voting threshold check calculator.",
        "Help me calculate resident voting threshold check."
      ],
      "retrieval_phrases": [
        "Resident voting threshold check",
        "resident voting threshold check"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 35,
            "c": 15,
            "d": 10,
            "e": 50,
            "g": 60
          },
          "outputs": [
            {
              "label": "Participation (%)",
              "value": 60
            },
            {
              "label": "Approval among decisive votes (%)",
              "value": 70
            },
            {
              "label": "Threshold result",
              "value": "Pass"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1119",
      "name": "Community bulk energy scenario",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Uniform tariff options for each member; no tiering, taxes, export credit or switching fees unless included in supplied prices.",
      "url": "/calculators/community-bulk-energy-scenario/",
      "version": "418948cadc203ba8348b975c399c7d7e48ada3cf450bcece39b0713a078bc2b2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Member annual energy use (kWh)",
          "type": "array",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Option A rate (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": "currency/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Option A annual standing charge per member",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Option B rate (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": "currency/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Option B annual standing charge per member",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Option A member costs",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Option B member costs",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Group saving from B",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform tariff options for each member; no tiering, taxes, export credit or switching fees unless included in supplied prices."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Option A member costs",
          "text": "Multiply each member use by A rate and add A standing charge."
        },
        {
          "label": "Option B member costs",
          "text": "Repeat using B tariff."
        },
        {
          "label": "Group saving from B",
          "text": "Subtract aggregate option B cost from option A."
        }
      ],
      "example_questions": [
        "Use the Community bulk energy scenario calculator.",
        "Help me calculate community bulk energy scenario."
      ],
      "retrieval_phrases": [
        "Community bulk energy scenario",
        "community bulk energy scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,2000",
            "b": 0.2,
            "c": 100,
            "d": 0.18,
            "e": 120
          },
          "outputs": [
            {
              "label": "Option A member costs",
              "value": "300, 500"
            },
            {
              "label": "Option B member costs",
              "value": "300, 480"
            },
            {
              "label": "Group saving from B",
              "value": 20.000000000000057
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1121",
      "name": "Household newcomer proration",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Bill accrues evenly by day. On newcomer days it is split equally among existing residents plus newcomer; on other days only existing residents share it.",
      "url": "/calculators/household-newcomer-proration/",
      "version": "395d1761aabf8aad7fd6afc7018dd9a9f006e5e1c38b53e75579e5358d4daa03",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bill-period days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Days newcomer is included",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Period shared bill",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Existing residents",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Newcomer contribution",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Each existing resident contribution",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total reconciled bill",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Bill accrues evenly by day. On newcomer days it is split equally among existing residents plus newcomer; on other days only existing residents share it."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Newcomer contribution",
          "text": "Apply daily bill rate for newcomer days and divide among all residents present."
        },
        {
          "label": "Each existing resident contribution",
          "text": "Divide the remaining bill equally among existing residents."
        },
        {
          "label": "Total reconciled bill",
          "text": "Newcomer plus existing-resident contributions sum to the original bill."
        }
      ],
      "example_questions": [
        "Use the Household newcomer proration calculator.",
        "Help me calculate household newcomer proration."
      ],
      "retrieval_phrases": [
        "Household newcomer proration",
        "household newcomer proration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 10,
            "c": 300,
            "d": 2
          },
          "outputs": [
            {
              "label": "Newcomer contribution",
              "value": 33.333333333333336
            },
            {
              "label": "Each existing resident contribution",
              "value": 133.33333333333334
            },
            {
              "label": "Total reconciled bill",
              "value": 300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1122",
      "name": "Housemate departure reconciliation",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "One departing resident; all bill shares, deposit refund and goods valuation are entered agreements. Positive settlement is paid to the departing resident.",
      "url": "/calculators/housemate-departure-reconciliation/",
      "version": "f53942bf7e663f3343857291f2a89e54cc3c208b0a6f3bd0f45c2830b94bfa3a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Resident deposit refundable",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unpaid shared bills",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Resident agreed bill share (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Agreed owned-goods buyout receivable",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Other agreed deductions",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Resident unpaid bill obligation",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net departure settlement",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One departing resident; all bill shares, deposit refund and goods valuation are entered agreements. Positive settlement is paid to the departing resident."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Resident unpaid bill obligation",
          "text": "Apply the agreed percentage to unpaid bills."
        },
        {
          "label": "Net departure settlement",
          "text": "Add refundable deposit and goods buyout, then subtract bill share and other deductions."
        }
      ],
      "example_questions": [
        "Use the Housemate departure reconciliation calculator.",
        "Help me calculate housemate departure reconciliation."
      ],
      "retrieval_phrases": [
        "Housemate departure reconciliation",
        "housemate departure reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 120,
            "c": 25,
            "d": 80,
            "e": 20
          },
          "outputs": [
            {
              "label": "Resident unpaid bill obligation",
              "value": 30
            },
            {
              "label": "Net departure settlement",
              "value": 530
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1123",
      "name": "Shared freezer shelf allocation",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Single usable freezer volume allocated by agreed weights; all volumes must be measured consistently, including packing voids.",
      "url": "/calculators/shared-freezer-shelf-allocation/",
      "version": "b7e0986e348c61185902898468cdc35b94149e7fa9992f72dd9af613797c7cfa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Freezer shelf capacity (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Agreed resident quota weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Resident stored volume (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Resident quota volumes (L)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Resident unused quota (L)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Physical free volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single usable freezer volume allocated by agreed weights; all volumes must be measured consistently, including packing voids."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Resident quota volumes (L)",
          "text": "Allocate shelf capacity in proportion to quota weights."
        },
        {
          "label": "Resident unused quota (L)",
          "text": "Subtract stored volume from each allocated quota; negative is over quota."
        },
        {
          "label": "Physical free volume (L)",
          "text": "Subtract total stored volume from shelf capacity."
        }
      ],
      "example_questions": [
        "Use the Shared freezer shelf allocation calculator.",
        "Help me calculate shared freezer shelf allocation."
      ],
      "retrieval_phrases": [
        "Shared freezer shelf allocation",
        "shared freezer shelf allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "1,1,2",
            "c": "20,30,40"
          },
          "outputs": [
            {
              "label": "Resident quota volumes (L)",
              "value": "25, 25, 50"
            },
            {
              "label": "Resident unused quota (L)",
              "value": "5, -5, 10"
            },
            {
              "label": "Physical free volume (L)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1124",
      "name": "Community compost contribution ledger",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Member entitlement uses agreed contribution points, not a biological yield model. Compost amount is measured after processing.",
      "url": "/calculators/community-compost-contribution-ledger/",
      "version": "b2cf23e0a5eb89271aa0eda659f8da81a8a4005b12a303c7e04d2c2f4b1c20a2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Deposited material by member (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Labour credits by member",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Agreed points per kg input",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Agreed points per labour credit",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Finished compost to share (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Member contribution points",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Member compost entitlement (L)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Member entitlement uses agreed contribution points, not a biological yield model. Compost amount is measured after processing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Member contribution points",
          "text": "Add material points and labour points for each member."
        },
        {
          "label": "Member compost entitlement (L)",
          "text": "Normalize member points to measured finished compost."
        }
      ],
      "example_questions": [
        "Use the Community compost contribution ledger calculator.",
        "Help me calculate community compost contribution ledger."
      ],
      "retrieval_phrases": [
        "Community compost contribution ledger",
        "community compost contribution ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "2,1",
            "c": 1,
            "d": 10,
            "e": 90
          },
          "outputs": [
            {
              "label": "Member contribution points",
              "value": "30, 30"
            },
            {
              "label": "Member compost entitlement (L)",
              "value": "45, 45"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1125",
      "name": "Resident emergency reserve target",
      "category": "Shared homes and building communities",
      "status": "available",
      "purpose": "Voluntary target using user-selected expenses and duration. Equal contributions; no investment growth or mandatory reserve recommendation.",
      "url": "/calculators/resident-emergency-reserve-target/",
      "version": "4b56d251920b41a5dbcd03dcc9194f7fe93aac727097b800f6dafa2e5e22f019",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Selected monthly communal expenses",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Chosen months of coverage",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Current reserve",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Participating households",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Chosen reserve target",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Funding gap",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Equal additional contribution per household",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Voluntary target using user-selected expenses and duration. Equal contributions; no investment growth or mandatory reserve recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Chosen reserve target",
          "text": "Multiply selected monthly expenses by chosen coverage months."
        },
        {
          "label": "Funding gap",
          "text": "Subtract current reserve, floored at zero."
        },
        {
          "label": "Equal additional contribution per household",
          "text": "Divide funding gap by participating households."
        }
      ],
      "example_questions": [
        "Use the Resident emergency reserve target calculator.",
        "Help me calculate resident emergency reserve target."
      ],
      "retrieval_phrases": [
        "Resident emergency reserve target",
        "resident emergency reserve target"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,150,50",
            "b": 3,
            "c": 200,
            "d": 5
          },
          "outputs": [
            {
              "label": "Chosen reserve target",
              "value": 900
            },
            {
              "label": "Funding gap",
              "value": 700
            },
            {
              "label": "Equal additional contribution per household",
              "value": 140
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1127",
      "name": "Nursery fee session comparison",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Session prices and chargeable weeks must reflect provider rules, including holiday billing. Monthly result is annual cost divided by twelve, not a specific invoice.",
      "url": "/calculators/nursery-fee-session-comparison/",
      "version": "526bc774095df6fd087f47685d876c9a7f481b57d883e1d25df3abc7035e1088",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Weekly sessions by tariff type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Price per session by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Chargeable weeks per year",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Additional weekly fees",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weekly nursery cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Annual nursery cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Average monthly cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Session prices and chargeable weeks must reflect provider rules, including holiday billing. Monthly result is annual cost divided by twelve, not a specific invoice."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weekly nursery cost",
          "text": "Multiply sessions by their rates and add weekly extras."
        },
        {
          "label": "Annual nursery cost",
          "text": "Multiply weekly cost by chargeable weeks."
        },
        {
          "label": "Average monthly cost",
          "text": "Spread annual charges across twelve months."
        }
      ],
      "example_questions": [
        "Use the Nursery fee session comparison calculator.",
        "Help me calculate nursery fee session comparison."
      ],
      "retrieval_phrases": [
        "Nursery fee session comparison",
        "nursery fee session comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,2",
            "b": "40,30",
            "c": 48,
            "d": 10
          },
          "outputs": [
            {
              "label": "Weekly nursery cost",
              "value": 190
            },
            {
              "label": "Annual nursery cost",
              "value": 9120
            },
            {
              "label": "Average monthly cost",
              "value": 760
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1131",
      "name": "Babysitter minimum-booking cost",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Billed hours are the larger of actual attendance and the provider’s minimum. No partial-hour rounding unless already reflected in actual billed hours.",
      "url": "/calculators/babysitter-minimum-booking-cost/",
      "version": "1ef3fce268e0ce27196fc2d0a0c111526455503bc069b493f5b0f7daff37ba2d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Actual session hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hourly rate",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Minimum billed hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Travel charge",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Billed hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minimum-booking unused hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total session fee",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Billed hours are the larger of actual attendance and the provider’s minimum. No partial-hour rounding unless already reflected in actual billed hours."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Billed hours",
          "text": "Apply the minimum booking length."
        },
        {
          "label": "Minimum-booking unused hours",
          "text": "Subtract actual session hours from the minimum."
        },
        {
          "label": "Total session fee",
          "text": "Multiply billed hours by rate and add travel charge."
        }
      ],
      "example_questions": [
        "Use the Babysitter minimum-booking cost calculator.",
        "Help me calculate babysitter minimum-booking cost."
      ],
      "retrieval_phrases": [
        "Babysitter minimum-booking cost",
        "babysitter minimum booking cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2.5,
            "b": 12,
            "c": 3,
            "d": 5
          },
          "outputs": [
            {
              "label": "Billed hours",
              "value": 3
            },
            {
              "label": "Minimum-booking unused hours",
              "value": 0.5
            },
            {
              "label": "Total session fee",
              "value": 41
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1133",
      "name": "Childcare voucher allocation",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Uses amounts already verified eligible and payable before expiry. Applies a single supplied maximum; no scheme-specific legal or tax interpretation.",
      "url": "/calculators/childcare-voucher-allocation/",
      "version": "4eeb46f3bb7d1f64b3bbaea178b72d5ff79680f3682921ff6942410ce701ff70",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Available voucher balance",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Eligible fees due before expiry",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Ineligible fees",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplied maximum voucher payment",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Voucher amount applied",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Fees payable in cash",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused voucher balance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses amounts already verified eligible and payable before expiry. Applies a single supplied maximum; no scheme-specific legal or tax interpretation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Voucher amount applied",
          "text": "Take the smallest of balance, eligible fees and supplied payment cap."
        },
        {
          "label": "Fees payable in cash",
          "text": "Subtract applied credit from all fees."
        },
        {
          "label": "Unused voucher balance",
          "text": "Subtract credit applied from available balance."
        }
      ],
      "example_questions": [
        "Use the Childcare voucher allocation calculator.",
        "Help me calculate childcare voucher allocation."
      ],
      "retrieval_phrases": [
        "Childcare voucher allocation",
        "childcare voucher allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 180,
            "c": 40,
            "d": 150
          },
          "outputs": [
            {
              "label": "Voucher amount applied",
              "value": 150
            },
            {
              "label": "Fees payable in cash",
              "value": 70
            },
            {
              "label": "Unused voucher balance",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1135",
      "name": "School lunch prepaid balance",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "One meal per supplied attendance day at constant price. Top-up day is an attendance-day index starting at 1, not a calendar date.",
      "url": "/calculators/school-lunch-prepaid-balance/",
      "version": "73ed42249049a7fa3c5fdc76bee5384b4f3b2f698f6ca8f63f71441597d1966a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current lunch balance",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Meal price",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Scheduled lunch attendance days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Desired ending balance",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Whole meals funded",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "First attendance day needing top-up",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Top-up for planned meals and ending balance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One meal per supplied attendance day at constant price. Top-up day is an attendance-day index starting at 1, not a calendar date."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Whole meals funded",
          "text": "Divide current balance by meal price and round down."
        },
        {
          "label": "First attendance day needing top-up",
          "text": "Return the first unfunded attendance day, or zero if the plan is fully funded."
        },
        {
          "label": "Top-up for planned meals and ending balance",
          "text": "Add planned meal cost and ending balance, then subtract current balance."
        }
      ],
      "example_questions": [
        "Use the School lunch prepaid balance calculator.",
        "Help me calculate school lunch prepaid balance."
      ],
      "retrieval_phrases": [
        "School lunch prepaid balance",
        "school lunch prepaid balance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 25,
            "b": 3,
            "c": 10,
            "d": 5
          },
          "outputs": [
            {
              "label": "Whole meals funded",
              "value": 8
            },
            {
              "label": "First attendance day needing top-up",
              "value": 9
            },
            {
              "label": "Top-up for planned meals and ending balance",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1136",
      "name": "Packed lunch batch planner",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "One container per portion, with all planned portions stored simultaneously. Batch capacity is a supplied operational limit; does not advise storage duration or food safety.",
      "url": "/calculators/packed-lunch-batch-planner/",
      "version": "928326bdd6c343ef52dd1c0a926e341560064b571426c8a53a350154197489fa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "School days to prepare",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Portions per day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Portions per preparation batch",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Available portion containers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total portions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Preparation batches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Extra containers required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One container per portion, with all planned portions stored simultaneously. Batch capacity is a supplied operational limit; does not advise storage duration or food safety."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total portions",
          "text": "Multiply school days by daily portions."
        },
        {
          "label": "Preparation batches",
          "text": "Divide total portions by batch capacity and round up."
        },
        {
          "label": "Extra containers required",
          "text": "Subtract available containers from total portions."
        }
      ],
      "example_questions": [
        "Use the Packed lunch batch planner calculator.",
        "Help me calculate packed lunch batch planner."
      ],
      "retrieval_phrases": [
        "Packed lunch batch planner",
        "packed lunch batch planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 2,
            "c": 4,
            "d": 8
          },
          "outputs": [
            {
              "label": "Total portions",
              "value": 10
            },
            {
              "label": "Preparation batches",
              "value": 3
            },
            {
              "label": "Extra containers required",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1138",
      "name": "School supply pack comparison",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "One supplied pack option for each required supply type; unlike a combinatorial optimizer, no mixing between substitute pack sizes is supported.",
      "url": "/calculators/school-supply-pack-comparison/",
      "version": "79fd61cd8112485fabc2678c183e0daaf65118cd7071ab7bf04c56e1f6832a76",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required quantities by supply type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Pack contents by matching type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Pack prices by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Packs by type",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Surplus by type",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Purchase total",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One supplied pack option for each required supply type; unlike a combinatorial optimizer, no mixing between substitute pack sizes is supported."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Packs by type",
          "text": "Round each required quantity divided by its pack count up."
        },
        {
          "label": "Surplus by type",
          "text": "Subtract required units from whole-pack units."
        },
        {
          "label": "Purchase total",
          "text": "Multiply packs by their prices and add."
        }
      ],
      "example_questions": [
        "Use the School supply pack comparison calculator.",
        "Help me calculate school supply pack comparison."
      ],
      "retrieval_phrases": [
        "School supply pack comparison",
        "school supply pack comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "25,12",
            "b": "10,5",
            "c": "4,3"
          },
          "outputs": [
            {
              "label": "Packs by type",
              "value": "3, 3"
            },
            {
              "label": "Surplus by type",
              "value": "5, 3"
            },
            {
              "label": "Purchase total",
              "value": 21
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1139",
      "name": "Child party invitation grouping",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "All household members share the same assumed attendance rate for an expected-count scenario. Full RSVP capacity is checked separately; fractional expectations are not seat assignments.",
      "url": "/calculators/child-party-invitation-grouping/",
      "version": "71aa7c5126cbbb6a1c6ac1cc4df6aaa420fb87a07d4e167ec970b588d2b492d6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Invited children by household",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Invited adults by household",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Venue guest capacity",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Assumed attendance rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Children and adults invited",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Maximum invited guests",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected attendance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Full-attendance capacity margin",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All household members share the same assumed attendance rate for an expected-count scenario. Full RSVP capacity is checked separately; fractional expectations are not seat assignments."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Children and adults invited",
          "text": "Add children and adult counts separately."
        },
        {
          "label": "Maximum invited guests",
          "text": "Add all children and adults."
        },
        {
          "label": "Expected attendance",
          "text": "Apply supplied attendance percentage."
        },
        {
          "label": "Full-attendance capacity margin",
          "text": "Subtract all invited guests from venue capacity."
        }
      ],
      "example_questions": [
        "Use the Child party invitation grouping calculator.",
        "Help me calculate child party invitation grouping."
      ],
      "retrieval_phrases": [
        "Child party invitation grouping",
        "child party invitation grouping"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,1,3",
            "b": "1,2,2",
            "c": 12,
            "d": 80
          },
          "outputs": [
            {
              "label": "Children and adults invited",
              "value": "6, 5"
            },
            {
              "label": "Maximum invited guests",
              "value": 11
            },
            {
              "label": "Expected attendance",
              "value": 8.8
            },
            {
              "label": "Full-attendance capacity margin",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1140",
      "name": "School bus waiting window",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Same-day time arithmetic using minutes after midnight. Recommended departure protects against earliest pickup; latest departure only meets the latest stated pickup.",
      "url": "/calculators/school-bus-waiting-window/",
      "version": "59589ba5f405f71b6b53683290a0e318b33de433cd25cc6dea7aa1c971b7c4d1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Earliest pickup minute after midnight",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Latest pickup minute after midnight",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Walking time (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Required arrival buffer (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Departure for earliest pickup (minute of day)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Departure for latest pickup (minute of day)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Pickup uncertainty window (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Same-day time arithmetic using minutes after midnight. Recommended departure protects against earliest pickup; latest departure only meets the latest stated pickup."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Departure for earliest pickup (minute of day)",
          "text": "Subtract walking time and buffer from earliest pickup."
        },
        {
          "label": "Departure for latest pickup (minute of day)",
          "text": "Subtract walking time and buffer from latest pickup."
        },
        {
          "label": "Pickup uncertainty window (min)",
          "text": "Subtract earliest pickup from latest pickup."
        }
      ],
      "example_questions": [
        "Use the School bus waiting window calculator.",
        "Help me calculate school bus waiting window."
      ],
      "retrieval_phrases": [
        "School bus waiting window",
        "school bus waiting window"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 480,
            "b": 490,
            "c": 10,
            "d": 5
          },
          "outputs": [
            {
              "label": "Departure for earliest pickup (minute of day)",
              "value": 465
            },
            {
              "label": "Departure for latest pickup (minute of day)",
              "value": 475
            },
            {
              "label": "Pickup uncertainty window (min)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1143",
      "name": "Care handover overlap",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Same-day handover at the care location. Incoming arrival is departure plus travel; negative overlap indicates an uncovered gap.",
      "url": "/calculators/care-handover-overlap/",
      "version": "83463487b6623f861214072685d508e84e01c5db483778e0aebf6df9e5d2b478",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Outgoing carer shift end (minute of day)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Incoming carer departure (minute of day)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Incoming travel duration (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Required handover overlap (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Incoming arrival (minute of day)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Actual overlap (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional coverage needed (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Same-day handover at the care location. Incoming arrival is departure plus travel; negative overlap indicates an uncovered gap."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Incoming arrival (minute of day)",
          "text": "Add travel time to incoming departure."
        },
        {
          "label": "Actual overlap (min)",
          "text": "Subtract incoming arrival from outgoing shift end."
        },
        {
          "label": "Additional coverage needed (min)",
          "text": "Subtract actual overlap from required handover time."
        }
      ],
      "example_questions": [
        "Use the Care handover overlap calculator.",
        "Help me calculate care handover overlap."
      ],
      "retrieval_phrases": [
        "Care handover overlap",
        "care handover overlap"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1020,
            "b": 990,
            "c": 20,
            "d": 15
          },
          "outputs": [
            {
              "label": "Incoming arrival (minute of day)",
              "value": 1010
            },
            {
              "label": "Actual overlap (min)",
              "value": 10
            },
            {
              "label": "Additional coverage needed (min)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1144",
      "name": "Holiday shared-care contribution",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Effort is hours times agreed multiplier. Positive balance means contribution above the household’s target share of total effort.",
      "url": "/calculators/holiday-shared-care-contribution/",
      "version": "f7e897213453c78a1e2c5936b274e4e11607f71fdab00719dd29cc2f7664422e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Care hours by household",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Agreed effort multiplier",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Agreed target share weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weighted effort by household",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Balance against target effort",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Effort is hours times agreed multiplier. Positive balance means contribution above the household’s target share of total effort."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weighted effort by household",
          "text": "Multiply each household’s care hours by agreed effort weight."
        },
        {
          "label": "Balance against target effort",
          "text": "Subtract target share of total effort from actual weighted contribution."
        }
      ],
      "example_questions": [
        "Use the Holiday shared-care contribution calculator.",
        "Help me calculate holiday shared-care contribution."
      ],
      "retrieval_phrases": [
        "Holiday shared-care contribution",
        "holiday shared care contribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "2,1",
            "c": "1,1"
          },
          "outputs": [
            {
              "label": "Weighted effort by household",
              "value": "20, 20"
            },
            {
              "label": "Balance against target effort",
              "value": "0, 0"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1145",
      "name": "Child activity annual commitment",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Annual session count is derived from the user’s actual term calendar; all sessions share the same fee and travel assumptions.",
      "url": "/calculators/child-activity-annual-commitment/",
      "version": "8b431acf5e4e88217cfe8241f5271be06491bc0afd043fdab1be2205547d0b31",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual sessions",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Session fee",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Travel cost per session",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Equipment cost per year",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Activity duration per session (h)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Travel time per session (h)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual activity cash cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Annual time commitment (h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total cash per attended session",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Annual session count is derived from the user’s actual term calendar; all sessions share the same fee and travel assumptions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual activity cash cost",
          "text": "Multiply sessions by fee plus travel cost and add annual equipment."
        },
        {
          "label": "Annual time commitment (h)",
          "text": "Multiply sessions by activity plus travel hours."
        },
        {
          "label": "Total cash per attended session",
          "text": "Spread all annual cost over sessions, or return zero if none are scheduled."
        }
      ],
      "example_questions": [
        "Use the Child activity annual commitment calculator.",
        "Help me calculate child activity annual commitment."
      ],
      "retrieval_phrases": [
        "Child activity annual commitment",
        "child activity annual commitment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 10,
            "c": 4,
            "d": 80,
            "e": 1.5,
            "g": 0.5
          },
          "outputs": [
            {
              "label": "Annual activity cash cost",
              "value": 500
            },
            {
              "label": "Annual time commitment (h)",
              "value": 60
            },
            {
              "label": "Total cash per attended session",
              "value": 16.666666666666668
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1146",
      "name": "Pocket money rule ledger",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Transparent period ledger using values agreed by the household. A negative balance is carried as a ledger balance rather than silently clamped.",
      "url": "/calculators/pocket-money-rule-ledger/",
      "version": "bc911f3d31d299cd27683e1d9db51465fdaa5795f15d6253d2692e9eb365e24a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Base allowance",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Completed agreed chore rewards",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Bonuses",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Agreed deductions",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total earned before deductions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net period allowance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total deductions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Transparent period ledger using values agreed by the household. A negative balance is carried as a ledger balance rather than silently clamped."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total earned before deductions",
          "text": "Add base allowance, completed chore rewards and bonuses."
        },
        {
          "label": "Net period allowance",
          "text": "Subtract agreed deductions."
        },
        {
          "label": "Total deductions",
          "text": "Sum individual agreed deductions."
        }
      ],
      "example_questions": [
        "Use the Pocket money rule ledger calculator.",
        "Help me calculate pocket money rule ledger."
      ],
      "retrieval_phrases": [
        "Pocket money rule ledger",
        "pocket money rule ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": "2,3",
            "c": "1",
            "d": "2"
          },
          "outputs": [
            {
              "label": "Total earned before deductions",
              "value": 16
            },
            {
              "label": "Net period allowance",
              "value": 14
            },
            {
              "label": "Total deductions",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1147",
      "name": "Children's savings gift allocation",
      "category": "Family scheduling and childcare logistics",
      "status": "available",
      "purpose": "Uses largest-remainder allocation in whole cents. Floor each ideal share, then assign leftover cents by descending fractional remainder; earlier list order breaks ties.",
      "url": "/calculators/children-s-savings-gift-allocation/",
      "version": "6b38592ba9272b6e38755cb559c7c41f0c0321254413e598ed3d6a3341d91910",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gift amount in whole cents",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Agreed beneficiary weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Allocated gift by beneficiary (cents)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Reconciled total (cents)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses largest-remainder allocation in whole cents. Floor each ideal share, then assign leftover cents by descending fractional remainder; earlier list order breaks ties."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Allocated gift by beneficiary (cents)",
          "text": "Floor ideal weighted cent shares, then distribute remaining cents to the largest remainders."
        },
        {
          "label": "Reconciled total (cents)",
          "text": "Whole-cent allocation preserves the original gift total."
        }
      ],
      "example_questions": [
        "Use the Children's savings gift allocation calculator.",
        "Help me calculate children's savings gift allocation."
      ],
      "retrieval_phrases": [
        "Children's savings gift allocation",
        "children s savings gift allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": "1,1,1"
          },
          "outputs": [
            {
              "label": "Allocated gift by beneficiary (cents)",
              "value": "334, 333, 333"
            },
            {
              "label": "Reconciled total (cents)",
              "value": 1000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1151",
      "name": "Pet food pack duration",
      "category": "Pet household logistics",
      "status": "available",
      "purpose": "Inventory arithmetic only; daily portion must be supplied independently. Starts with a full pack and constant consumption, with day zero as today.",
      "url": "/calculators/pet-food-pack-duration/",
      "version": "d45fa0e73602feb7a8d74c287aacd16c9e9b465f582828f2638ab008d23c1f3d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Food pack mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Owner-supplied daily portion per pet (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Pets using this pack",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Order lead time (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pack duration (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Latest reorder day from start",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Food used during lead time (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Inventory arithmetic only; daily portion must be supplied independently. Starts with a full pack and constant consumption, with day zero as today."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pack duration (days)",
          "text": "Divide pack mass by combined supplied daily portions."
        },
        {
          "label": "Latest reorder day from start",
          "text": "Subtract delivery lead time from depletion day, floored at zero."
        },
        {
          "label": "Food used during lead time (g)",
          "text": "Multiply combined daily use by order lead time."
        }
      ],
      "example_questions": [
        "Use the Pet food pack duration calculator.",
        "Help me calculate pet food pack duration."
      ],
      "retrieval_phrases": [
        "Pet food pack duration",
        "pet food pack duration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2000,
            "b": 100,
            "c": 2,
            "d": 3
          },
          "outputs": [
            {
              "label": "Pack duration (days)",
              "value": 10
            },
            {
              "label": "Latest reorder day from start",
              "value": 7
            },
            {
              "label": "Food used during lead time (g)",
              "value": 600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1153",
      "name": "Kennel boarding invoice",
      "category": "Pet household logistics",
      "status": "available",
      "purpose": "Started billing blocks are charged in full from arrival. Extra-pet surcharge is already the combined surcharge for all additional pets.",
      "url": "/calculators/kennel-boarding-invoice/",
      "version": "860938befe314583d28c9a8b5655ca3a2e6b86825ff8e0488c726694a70a5d3b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Stay duration from arrival to departure (h)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Billable block duration (h)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Charge per block",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Fixed booking extras",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional pet surcharge per block",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Billable blocks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Base boarding charge",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total boarding invoice",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Started billing blocks are charged in full from arrival. Extra-pet surcharge is already the combined surcharge for all additional pets."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Billable blocks",
          "text": "Divide total stay hours by supplied billing block and round up."
        },
        {
          "label": "Base boarding charge",
          "text": "Multiply billed blocks by base rate."
        },
        {
          "label": "Total boarding invoice",
          "text": "Add surcharge per block and fixed extras."
        }
      ],
      "example_questions": [
        "Use the Kennel boarding invoice calculator.",
        "Help me calculate kennel boarding invoice."
      ],
      "retrieval_phrases": [
        "Kennel boarding invoice",
        "kennel boarding invoice"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 24,
            "c": 30,
            "d": 15,
            "e": 10
          },
          "outputs": [
            {
              "label": "Billable blocks",
              "value": 3
            },
            {
              "label": "Base boarding charge",
              "value": 90
            },
            {
              "label": "Total boarding invoice",
              "value": 135
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1154",
      "name": "Dog walking group capacity",
      "category": "Pet household logistics",
      "status": "available",
      "purpose": "One staff member handles one group at a time; every walk occupies the same duration. Group limits are provided by the operator, with dog compatibility assessed separately.",
      "url": "/calculators/dog-walking-group-capacity/",
      "version": "eee8f059a185edf6d4b1fd41df4d159d75ced5fc28d0443ad0ca0e4df2e0ba26",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Booked dogs",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Supplied maximum dogs per group",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Minutes per walk group",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Available staff",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Minutes available per staff member",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Walk groups",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Groups staff can complete",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unserved groups",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One staff member handles one group at a time; every walk occupies the same duration. Group limits are provided by the operator, with dog compatibility assessed separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Walk groups",
          "text": "Round dog count divided by supplied group limit up."
        },
        {
          "label": "Groups staff can complete",
          "text": "Multiply staff by complete walk slots per person."
        },
        {
          "label": "Unserved groups",
          "text": "Subtract staff group capacity from required groups."
        }
      ],
      "example_questions": [
        "Use the Dog walking group capacity calculator.",
        "Help me calculate dog walking group capacity."
      ],
      "retrieval_phrases": [
        "Dog walking group capacity",
        "dog walking group capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 14,
            "b": 4,
            "c": 60,
            "d": 2,
            "e": 120
          },
          "outputs": [
            {
              "label": "Walk groups",
              "value": 4
            },
            {
              "label": "Groups staff can complete",
              "value": 4
            },
            {
              "label": "Unserved groups",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1157",
      "name": "Pet household annual expense ledger",
      "category": "Pet household logistics",
      "status": "available",
      "purpose": "An expense ledger only, with user-entered planned appointments and equipment. Monthly reserve covers annual nonrecurring costs after existing savings.",
      "url": "/calculators/pet-household-annual-expense-ledger/",
      "version": "8367a6a3e48061cd64030948e2df6b930d3f78336722766f3f3a33fc8d2774ba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Recurring monthly pet costs",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Planned annual appointment costs",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Annual equipment purchases",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Already saved for annual costs",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual household pet cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Monthly nonrecurring reserve",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Monthly all-in budget",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An expense ledger only, with user-entered planned appointments and equipment. Monthly reserve covers annual nonrecurring costs after existing savings."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual household pet cost",
          "text": "Annualize monthly costs and add annual appointments and equipment."
        },
        {
          "label": "Monthly nonrecurring reserve",
          "text": "Spread unfunded annual nonrecurring costs over twelve months."
        },
        {
          "label": "Monthly all-in budget",
          "text": "Add recurring monthly cost and additional reserve."
        }
      ],
      "example_questions": [
        "Use the Pet household annual expense ledger calculator.",
        "Help me calculate pet household annual expense ledger."
      ],
      "retrieval_phrases": [
        "Pet household annual expense ledger",
        "pet household annual expense ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,20",
            "b": "100,80",
            "c": "60",
            "d": 100
          },
          "outputs": [
            {
              "label": "Annual household pet cost",
              "value": 960
            },
            {
              "label": "Monthly nonrecurring reserve",
              "value": 11.666666666666666
            },
            {
              "label": "Monthly all-in budget",
              "value": 71.66666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1158",
      "name": "Litter tray supply usage",
      "category": "Pet household logistics",
      "status": "available",
      "purpose": "Planning period begins immediately after a full replacement. Counts subsequent replacements on interval-end days, including the final day, plus daily top-ups.",
      "url": "/calculators/litter-tray-supply-usage/",
      "version": "4ea9adb098bc966b9990f4af7b0bec4662eb3fe8c639f0ee597d6981fff6ffbb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Full replacement quantity (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Days between full replacements",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Additional top-up use (L/day)",
          "type": "number",
          "required": true,
          "unit": "L/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Planning days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Pack size (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Full replacements in period",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Supply used (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Packs to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Planning period begins immediately after a full replacement. Counts subsequent replacements on interval-end days, including the final day, plus daily top-ups."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Full replacements in period",
          "text": "Count complete replacement intervals within the plan."
        },
        {
          "label": "Supply used (L)",
          "text": "Add full-replacement volume and daily top-ups."
        },
        {
          "label": "Packs to purchase",
          "text": "Round supply use divided by pack size up."
        }
      ],
      "example_questions": [
        "Use the Litter tray supply usage calculator.",
        "Help me calculate litter tray supply usage."
      ],
      "retrieval_phrases": [
        "Litter tray supply usage",
        "litter tray supply usage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 15,
            "c": 0.2,
            "d": 30,
            "e": 20
          },
          "outputs": [
            {
              "label": "Full replacements in period",
              "value": 2
            },
            {
              "label": "Supply used (L)",
              "value": 26
            },
            {
              "label": "Packs to purchase",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1166",
      "name": "Dog exercise time ledger",
      "category": "Pet household logistics",
      "status": "available",
      "purpose": "Descriptive time ledger only. Target is owner supplied; the tool provides no activity prescription.",
      "url": "/calculators/dog-exercise-time-ledger/",
      "version": "ab9ede27ed461d23ebab1bda9ba17c029bc0509de98c15e0a581f055d6b75bf5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Owner-defined weekly activity target (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Logged sessions (min)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Completed activity (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Target completed (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining target (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Descriptive time ledger only. Target is owner supplied; the tool provides no activity prescription."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Completed activity (min)",
          "text": "Sum logged session durations."
        },
        {
          "label": "Target completed (%)",
          "text": "Divide completed minutes by the owner-defined target."
        },
        {
          "label": "Remaining target (min)",
          "text": "Subtract completed minutes from target, floored at zero."
        }
      ],
      "example_questions": [
        "Use the Dog exercise time ledger calculator.",
        "Help me calculate dog exercise time ledger."
      ],
      "retrieval_phrases": [
        "Dog exercise time ledger",
        "dog exercise time ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": "30,45,60,45"
          },
          "outputs": [
            {
              "label": "Completed activity (min)",
              "value": 180
            },
            {
              "label": "Target completed (%)",
              "value": 60
            },
            {
              "label": "Remaining target (min)",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1168",
      "name": "Pet camera recording retention",
      "category": "Pet household logistics",
      "status": "available",
      "purpose": "Constant measured bitrate, decimal GB and Mbit/s; usable storage must already exclude system overhead. Recording schedule repeats daily.",
      "url": "/calculators/pet-camera-recording-retention/",
      "version": "28472cf9c50ecdbbcc6c9dcf76668403f4abf84e5390a0c113e16528653637bd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Actual recording bitrate (Mbit/s)",
          "type": "number",
          "required": true,
          "unit": "Mbit/s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Recording hours per day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable storage (decimal GB)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Recorded data per day (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Recorded footage retained (h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Calendar retention (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant measured bitrate, decimal GB and Mbit/s; usable storage must already exclude system overhead. Recording schedule repeats daily."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Recorded data per day (GB)",
          "text": "Multiply Mbit/s by recorded seconds and divide by 8,000 to obtain decimal GB."
        },
        {
          "label": "Recorded footage retained (h)",
          "text": "Divide usable storage by recording data rate."
        },
        {
          "label": "Calendar retention (days)",
          "text": "Divide usable storage by daily recorded data."
        }
      ],
      "example_questions": [
        "Use the Pet camera recording retention calculator.",
        "Help me calculate pet camera recording retention."
      ],
      "retrieval_phrases": [
        "Pet camera recording retention",
        "pet camera recording retention"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 12,
            "c": 108
          },
          "outputs": [
            {
              "label": "Recorded data per day (GB)",
              "value": 10.8
            },
            {
              "label": "Recorded footage retained (h)",
              "value": 120
            },
            {
              "label": "Calendar retention (days)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1171",
      "name": "Pet foster placement supplies",
      "category": "Pet household logistics",
      "status": "available",
      "purpose": "All placements use the same user-supplied kit. One pack size per item; no substitution or animal-care requirement is inferred.",
      "url": "/calculators/pet-foster-placement-supplies/",
      "version": "6e5061b69cb11feb16d5568fc551fb6534bffe677291b99315b78c64b5756b6b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "New foster placements",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Required units per kit by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Available stock by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Supplier pack units by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Item shortages",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Packs to order by item",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All placements use the same user-supplied kit. One pack size per item; no substitution or animal-care requirement is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Item shortages",
          "text": "Multiply placements by per-kit item quantities and subtract stock."
        },
        {
          "label": "Packs to order by item",
          "text": "Divide each shortage by its supplier pack quantity and round up."
        }
      ],
      "example_questions": [
        "Use the Pet foster placement supplies calculator.",
        "Help me calculate pet foster placement supplies."
      ],
      "retrieval_phrases": [
        "Pet foster placement supplies",
        "pet foster placement supplies"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": "2,1,3",
            "c": "6,8,10",
            "d": "4,2,5"
          },
          "outputs": [
            {
              "label": "Item shortages",
              "value": "4, 0, 5"
            },
            {
              "label": "Packs to order by item",
              "value": "1, 0, 1"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1402",
      "name": "Fleet deadhead distance",
      "category": "Commercial fleet operations",
      "status": "available",
      "purpose": "Uses completed loaded and empty legs; empty travel is classified by the operator. No rerouting or fuel model is assumed.",
      "url": "/calculators/fleet-deadhead-distance/",
      "version": "78d9973182a49d64e1fcdf2233e3ea5939923ae3abd26fbbf5ea248c1e5b390e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Loaded route-leg distances (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Empty route-leg distances (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Empty-running distance (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total traveled distance (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Empty-running share (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses completed loaded and empty legs; empty travel is classified by the operator. No rerouting or fuel model is assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Empty-running distance (km)",
          "text": "Add all empty route legs."
        },
        {
          "label": "Total traveled distance (km)",
          "text": "Add loaded and empty distances."
        },
        {
          "label": "Empty-running share (%)",
          "text": "Divide empty distance by total traveled distance."
        }
      ],
      "example_questions": [
        "Use the Fleet deadhead distance calculator.",
        "Help me calculate fleet deadhead distance."
      ],
      "retrieval_phrases": [
        "Fleet deadhead distance",
        "fleet deadhead distance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,150",
            "b": "20,30"
          },
          "outputs": [
            {
              "label": "Empty-running distance (km)",
              "value": 50
            },
            {
              "label": "Total traveled distance (km)",
              "value": 300
            },
            {
              "label": "Empty-running share (%)",
              "value": 16.666666666666668
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1409",
      "name": "Fleet odometer gap audit",
      "category": "Commercial fleet operations",
      "status": "available",
      "purpose": "Single dated observation interval without rollover or odometer replacement. Positive unexplained distance indicates distance missing from trip logs.",
      "url": "/calculators/fleet-odometer-gap-audit/",
      "version": "597909bf217505f0b90fae88c7ef2e1a737845d9dd8fddf2e6149f53e97a4b7e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Start odometer (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "End odometer (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recorded trip distances (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Odometer distance (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Logged distance (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unexplained distance (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single dated observation interval without rollover or odometer replacement. Positive unexplained distance indicates distance missing from trip logs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Odometer distance (km)",
          "text": "Subtract start reading from end reading."
        },
        {
          "label": "Logged distance (km)",
          "text": "Add recorded trips within the interval."
        },
        {
          "label": "Unexplained distance (km)",
          "text": "Subtract trip-log distance from odometer increase."
        }
      ],
      "example_questions": [
        "Use the Fleet odometer gap audit calculator.",
        "Help me calculate fleet odometer gap audit."
      ],
      "retrieval_phrases": [
        "Fleet odometer gap audit",
        "fleet odometer gap audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 10500,
            "c": "100,150,200"
          },
          "outputs": [
            {
              "label": "Odometer distance (km)",
              "value": 500
            },
            {
              "label": "Logged distance (km)",
              "value": 450
            },
            {
              "label": "Unexplained distance (km)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1412",
      "name": "Fleet delivery service windows",
      "category": "Commercial fleet operations",
      "status": "available",
      "purpose": "Same-day deliveries with inclusive windows, no exclusions. Early and late arrivals both count as outside the promised window; lateness measures only arrival after window end.",
      "url": "/calculators/fleet-delivery-service-windows/",
      "version": "d5734e6c9500e420fbf4d03df64ea399c208235f3da1096500cc12b7f4f524d0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Actual arrival minutes after midnight",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Window start minutes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Window end minutes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "On-time deliveries (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Lateness by delivery (min)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Early deliveries",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Same-day deliveries with inclusive windows, no exclusions. Early and late arrivals both count as outside the promised window; lateness measures only arrival after window end."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "On-time deliveries (%)",
          "text": "Count arrivals inside their windows and divide by deliveries."
        },
        {
          "label": "Lateness by delivery (min)",
          "text": "Subtract window end from arrival, floored at zero."
        },
        {
          "label": "Early deliveries",
          "text": "Count arrivals before promised window start."
        }
      ],
      "example_questions": [
        "Use the Fleet delivery service windows calculator.",
        "Help me calculate fleet delivery service windows."
      ],
      "retrieval_phrases": [
        "Fleet delivery service windows",
        "fleet delivery service windows"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "550,610,680",
            "b": "540,600,660",
            "c": "560,620,670"
          },
          "outputs": [
            {
              "label": "On-time deliveries (%)",
              "value": 66.66666666666667
            },
            {
              "label": "Lateness by delivery (min)",
              "value": "0, 0, 10"
            },
            {
              "label": "Early deliveries",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1413",
      "name": "Fleet route change savings",
      "category": "Commercial fleet operations",
      "status": "available",
      "purpose": "Uses user-supplied per-distance and per-time costs; they must not count the same expense twice. Compares one route traversal.",
      "url": "/calculators/fleet-route-change-savings/",
      "version": "df1a6d0345e3e607d29cf812eb7b82a26c9a01069b69b48164bfa8bf9bc7ab5c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Old route distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New route distance (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Old route duration (h)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "New route duration (h)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Distance cost (currency/km)",
          "type": "number",
          "required": true,
          "unit": "currency/km",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Time cost (currency/h)",
          "type": "number",
          "required": true,
          "unit": "currency/h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "h",
          "label": "Old tolls",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "i",
          "label": "New tolls",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Old route operating cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "New route operating cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Saving per traversal",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses user-supplied per-distance and per-time costs; they must not count the same expense twice. Compares one route traversal."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Old route operating cost",
          "text": "Add old distance, time and toll costs."
        },
        {
          "label": "New route operating cost",
          "text": "Add new distance, time and toll costs."
        },
        {
          "label": "Saving per traversal",
          "text": "Subtract new operating cost from old."
        }
      ],
      "example_questions": [
        "Use the Fleet route change savings calculator.",
        "Help me calculate fleet route change savings."
      ],
      "retrieval_phrases": [
        "Fleet route change savings",
        "fleet route change savings"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 80,
            "c": 3,
            "d": 2.5,
            "e": 0.4,
            "g": 20,
            "h": 5,
            "i": 8
          },
          "outputs": [
            {
              "label": "Old route operating cost",
              "value": 105
            },
            {
              "label": "New route operating cost",
              "value": 90
            },
            {
              "label": "Saving per traversal",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1416",
      "name": "Fleet fuel efficiency normalization",
      "category": "Commercial fleet operations",
      "status": "available",
      "purpose": "Numeric class codes represent user-defined combinations of route and load band. Within each group, consumption is ratio of total fuel to total distance, not average trip rates.",
      "url": "/calculators/fleet-fuel-efficiency-normalization/",
      "version": "09ac62c5ed1675e89129d2e56d4b45af424569825eaaa66c1f402e2c4f7fda41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fuel by observed trip (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Trip distances (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Route-load class codes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Class codes",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Class consumption (L/100 km)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Whole-fleet consumption (L/100 km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Numeric class codes represent user-defined combinations of route and load band. Within each group, consumption is ratio of total fuel to total distance, not average trip rates."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Class codes",
          "text": "List distinct supplied class codes in numeric order."
        },
        {
          "label": "Class consumption (L/100 km)",
          "text": "For each class divide summed fuel by summed distance and multiply by 100."
        },
        {
          "label": "Whole-fleet consumption (L/100 km)",
          "text": "Divide all fuel by all distance and multiply by 100."
        }
      ],
      "example_questions": [
        "Use the Fleet fuel efficiency normalization calculator.",
        "Help me calculate fleet fuel efficiency normalization."
      ],
      "retrieval_phrases": [
        "Fleet fuel efficiency normalization",
        "fleet fuel efficiency normalization"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,12,20",
            "b": "100,200,200",
            "c": "1,1,2"
          },
          "outputs": [
            {
              "label": "Class codes",
              "value": "1, 2"
            },
            {
              "label": "Class consumption (L/100 km)",
              "value": "7.333333, 10"
            },
            {
              "label": "Whole-fleet consumption (L/100 km)",
              "value": 8.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1419",
      "name": "Fleet telematics data budget",
      "category": "Commercial fleet operations",
      "status": "available",
      "purpose": "Constant event rate and payload size; overhead is added to payload data. Decimal GB equals one billion bytes. No minimum plan charges.",
      "url": "/calculators/fleet-telematics-data-budget/",
      "version": "57106d5ca494a5f4489df2bd97eabadff470a5549449d43d4deb360c4f659b19",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Vehicles",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Events per vehicle per day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bytes per event",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Upload overhead (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Days in billing period",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "g",
          "label": "Price per decimal GB",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Payload data per period (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total uploaded data (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Data usage cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant event rate and payload size; overhead is added to payload data. Decimal GB equals one billion bytes. No minimum plan charges."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Payload data per period (GB)",
          "text": "Multiply vehicles, daily events, event bytes and days; convert bytes to decimal GB."
        },
        {
          "label": "Total uploaded data (GB)",
          "text": "Apply upload overhead to payload bytes."
        },
        {
          "label": "Data usage cost",
          "text": "Multiply uploaded GB by per-GB price."
        }
      ],
      "example_questions": [
        "Use the Fleet telematics data budget calculator.",
        "Help me calculate fleet telematics data budget."
      ],
      "retrieval_phrases": [
        "Fleet telematics data budget",
        "fleet telematics data budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 1000,
            "c": 200,
            "d": 25,
            "e": 30,
            "g": 2
          },
          "outputs": [
            {
              "label": "Payload data per period (GB)",
              "value": 0.12
            },
            {
              "label": "Total uploaded data (GB)",
              "value": 0.15
            },
            {
              "label": "Data usage cost",
              "value": 0.3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1420",
      "name": "Fleet toll account funding",
      "category": "Commercial fleet operations",
      "status": "available",
      "purpose": "One account, no pending transactions; all crossings charged exactly as entered. Top-up timing is the first crossing index whose cumulative cost exceeds available balance.",
      "url": "/calculators/fleet-toll-account-funding/",
      "version": "fff5c451222c3969a6f318aedbd1b9518f7635abfc23b5022152772e10aac8ab",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Planned crossing charges in chronological order",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Current toll account balance",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Required ending balance",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total planned toll charges",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required top-up",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "First crossing requiring top-up",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One account, no pending transactions; all crossings charged exactly as entered. Top-up timing is the first crossing index whose cumulative cost exceeds available balance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total planned toll charges",
          "text": "Sum supplied crossing charges."
        },
        {
          "label": "Required top-up",
          "text": "Add desired ending balance to charges and subtract current balance."
        },
        {
          "label": "First crossing requiring top-up",
          "text": "Find the first cumulative charge above current balance; zero means none."
        }
      ],
      "example_questions": [
        "Use the Fleet toll account funding calculator.",
        "Help me calculate fleet toll account funding."
      ],
      "retrieval_phrases": [
        "Fleet toll account funding",
        "fleet toll account funding"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,10,5",
            "b": 12,
            "c": 5
          },
          "outputs": [
            {
              "label": "Total planned toll charges",
              "value": 20
            },
            {
              "label": "Required top-up",
              "value": 13
            },
            {
              "label": "First crossing requiring top-up",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1422",
      "name": "Fleet asset utilization calendar",
      "category": "Commercial fleet operations",
      "status": "available",
      "purpose": "One common reporting period. Available hours equal nominal hours minus excluded downtime; booked hours must be within availability.",
      "url": "/calculators/fleet-asset-utilization-calendar/",
      "version": "ad2a9b74d73625b7529b147dc7a2f4f4182d6aae84339ef70a968de3a0894aa9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal hours by vehicle",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Excluded downtime hours",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Booked hours",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Available hours by vehicle",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Utilization by vehicle (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Fleet weighted utilization (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One common reporting period. Available hours equal nominal hours minus excluded downtime; booked hours must be within availability."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Available hours by vehicle",
          "text": "Subtract excluded downtime from nominal hours."
        },
        {
          "label": "Utilization by vehicle (%)",
          "text": "Divide booked hours by available hours."
        },
        {
          "label": "Fleet weighted utilization (%)",
          "text": "Divide total booked hours by total available hours."
        }
      ],
      "example_questions": [
        "Use the Fleet asset utilization calendar calculator.",
        "Help me calculate fleet asset utilization calendar."
      ],
      "retrieval_phrases": [
        "Fleet asset utilization calendar",
        "fleet asset utilization calendar"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,40",
            "b": "5,10",
            "c": "28,24"
          },
          "outputs": [
            {
              "label": "Available hours by vehicle",
              "value": "35, 30"
            },
            {
              "label": "Utilization by vehicle (%)",
              "value": "80, 80"
            },
            {
              "label": "Fleet weighted utilization (%)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1452",
      "name": "Bus round-trip vehicle requirement",
      "category": "Public transport service planning",
      "status": "available",
      "purpose": "Steady repeating service with equal headway in both directions; cycle includes both runs and terminal recoveries. Spare vehicles and driver constraints are excluded.",
      "url": "/calculators/bus-round-trip-vehicle-requirement/",
      "version": "f04ee7a195f883b7f1084293fd87b5fc72d0f415dfaea34f84d93c6670c9cae2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Outbound running time (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Inbound running time (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Recovery at first terminal (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Recovery at second terminal (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Target headway (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Round-trip cycle (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minimum scheduled buses",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Extra cycle time from whole-bus rounding (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady repeating service with equal headway in both directions; cycle includes both runs and terminal recoveries. Spare vehicles and driver constraints are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Round-trip cycle (min)",
          "text": "Add both running times and both terminal recoveries."
        },
        {
          "label": "Minimum scheduled buses",
          "text": "Divide cycle time by headway and round up."
        },
        {
          "label": "Extra cycle time from whole-bus rounding (min)",
          "text": "Subtract required cycle from buses times headway."
        }
      ],
      "example_questions": [
        "Use the Bus round-trip vehicle requirement calculator.",
        "Help me calculate bus round-trip vehicle requirement."
      ],
      "retrieval_phrases": [
        "Bus round-trip vehicle requirement",
        "bus round trip vehicle requirement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 35,
            "c": 10,
            "d": 5,
            "e": 15
          },
          "outputs": [
            {
              "label": "Round-trip cycle (min)",
              "value": 90
            },
            {
              "label": "Minimum scheduled buses",
              "value": 6
            },
            {
              "label": "Extra cycle time from whole-bus rounding (min)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1453",
      "name": "Bus passenger load profile",
      "category": "Public transport service planning",
      "status": "available",
      "purpose": "Alighting happens before boarding at each stop. Counts describe one trip, and overload is reported rather than treated as feasible seating.",
      "url": "/calculators/bus-passenger-load-profile/",
      "version": "9c88a83ca1ad619e6a89d388a65c2c5febbe047093dcf09869df85f0a872f35f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Boarding counts by stop",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Alighting counts by stop",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Initial onboard passengers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Vehicle passenger capacity",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Onboard after each stop",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Peak onboard passengers",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Segments over capacity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Alighting happens before boarding at each stop. Counts describe one trip, and overload is reported rather than treated as feasible seating."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Onboard after each stop",
          "text": "Roll initial load forward with boardings minus alightings."
        },
        {
          "label": "Peak onboard passengers",
          "text": "Take the maximum initial or after-stop load."
        },
        {
          "label": "Segments over capacity",
          "text": "Count after-stop loads above vehicle capacity."
        }
      ],
      "example_questions": [
        "Use the Bus passenger load profile calculator.",
        "Help me calculate bus passenger load profile."
      ],
      "retrieval_phrases": [
        "Bus passenger load profile",
        "bus passenger load profile"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,8,2",
            "b": "0,3,12",
            "c": 0,
            "d": 15
          },
          "outputs": [
            {
              "label": "Onboard after each stop",
              "value": "10, 15, 5"
            },
            {
              "label": "Peak onboard passengers",
              "value": 15
            },
            {
              "label": "Segments over capacity",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1454",
      "name": "Bus stop dwell time model",
      "category": "Public transport service planning",
      "status": "available",
      "purpose": "Boarding and alighting use separate dedicated doors simultaneously. Passenger flow is evenly shared among corresponding doors; this is a measured operational estimate.",
      "url": "/calculators/bus-stop-dwell-time-model/",
      "version": "4a6147531bb2624c7a960cd66f37a7670f1c76f06ff9ab3254e558b3015dd2e3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Boarders by stop",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Alighters by stop",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured boarding rate (people/s/door)",
          "type": "number",
          "required": true,
          "unit": "people/s/door",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Measured alighting rate (people/s/door)",
          "type": "number",
          "required": true,
          "unit": "people/s/door",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Dedicated boarding doors",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "g",
          "label": "Dedicated alighting doors",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "h",
          "label": "Fixed door overhead per stop (s)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated dwell by stop (s)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total modeled stop dwell (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Boarding and alighting use separate dedicated doors simultaneously. Passenger flow is evenly shared among corresponding doors; this is a measured operational estimate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated dwell by stop (s)",
          "text": "Take the slower simultaneous boarding/alighting duration and add door overhead."
        },
        {
          "label": "Total modeled stop dwell (s)",
          "text": "Sum modeled dwell over stops."
        }
      ],
      "example_questions": [
        "Use the Bus stop dwell time model calculator.",
        "Help me calculate bus stop dwell time model."
      ],
      "retrieval_phrases": [
        "Bus stop dwell time model",
        "bus stop dwell time model"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "5,10",
            "c": 1,
            "d": 2,
            "e": 1,
            "g": 1,
            "h": 5
          },
          "outputs": [
            {
              "label": "Estimated dwell by stop (s)",
              "value": "15, 25"
            },
            {
              "label": "Total modeled stop dwell (s)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1457",
      "name": "Transit fare cap comparison",
      "category": "Public transport service planning",
      "status": "available",
      "purpose": "All journeys are eligible under the same fare account. Apply each day’s cap first, then a weekly cap across the entered single week; no excluded fares.",
      "url": "/calculators/transit-fare-cap-comparison/",
      "version": "959c211f41a8bd358eb17fb22e55c7c03a08030a7c7c3f957243e9761ed07943",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Daily uncapped eligible journey totals",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Daily fare cap",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Weekly fare cap",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Daily capped fares",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Weekly amount charged",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Saving from caps",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All journeys are eligible under the same fare account. Apply each day’s cap first, then a weekly cap across the entered single week; no excluded fares."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Daily capped fares",
          "text": "Take the smaller of each day’s fare total and daily cap."
        },
        {
          "label": "Weekly amount charged",
          "text": "Apply weekly cap to the sum of capped daily fares."
        },
        {
          "label": "Saving from caps",
          "text": "Subtract charged amount from uncapped journey totals."
        }
      ],
      "example_questions": [
        "Use the Transit fare cap comparison calculator.",
        "Help me calculate transit fare cap comparison."
      ],
      "retrieval_phrases": [
        "Transit fare cap comparison",
        "transit fare cap comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "8,12,6,10,4",
            "b": 8,
            "c": 30
          },
          "outputs": [
            {
              "label": "Daily capped fares",
              "value": "8, 8, 6, 8, 4"
            },
            {
              "label": "Weekly amount charged",
              "value": 30
            },
            {
              "label": "Saving from caps",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1459",
      "name": "Transit timetable clockface generator",
      "category": "Public transport service planning",
      "status": "available",
      "purpose": "Same-day inclusive service window. Exclusions remove exact scheduled departures; they do not shift later departures.",
      "url": "/calculators/transit-timetable-clockface-generator/",
      "version": "3b8efd52d7c9ca9f794694681184206ee0b412daf76ef06cb649f64988225ab0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First departure (minute after midnight)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Last allowed departure (minute after midnight)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Headway (min)",
          "type": "integer",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Excluded departure minutes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Departure clock times",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Departures",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Same-day inclusive service window. Exclusions remove exact scheduled departures; they do not shift later departures."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Departure clock times",
          "text": "Generate every headway from first departure through the end, remove exclusions, then format HH:MM."
        },
        {
          "label": "Departures",
          "text": "Count generated departures after exclusions."
        }
      ],
      "example_questions": [
        "Use the Transit timetable clockface generator calculator.",
        "Help me calculate transit timetable clockface generator."
      ],
      "retrieval_phrases": [
        "Transit timetable clockface generator",
        "transit timetable clockface generator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 360,
            "b": 420,
            "c": 15,
            "d": "390"
          },
          "outputs": [
            {
              "label": "Departure clock times",
              "value": "06:00, 06:15, 06:45, 07:00"
            },
            {
              "label": "Departures",
              "value": 4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1465",
      "name": "Transit station access catchment",
      "category": "Public transport service planning",
      "status": "available",
      "purpose": "Uses supplied walk times and origin weights; threshold is inclusive. No straight-line conversion, road-network routing or accessibility claim.",
      "url": "/calculators/transit-station-access-catchment/",
      "version": "4e6adb4256ee47f3a0c8cc3b730aec28e6cde2fe480223aec5c8832653686bd8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Supplied walk times from origins (min)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Population or demand at those origins",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Chosen catchment time (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Origins inside catchment",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Demand inside catchment",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Demand coverage (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses supplied walk times and origin weights; threshold is inclusive. No straight-line conversion, road-network routing or accessibility claim."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Origins inside catchment",
          "text": "Count origins with supplied time no greater than threshold."
        },
        {
          "label": "Demand inside catchment",
          "text": "Add demand for origins inside the threshold."
        },
        {
          "label": "Demand coverage (%)",
          "text": "Divide covered demand by all origin demand."
        }
      ],
      "example_questions": [
        "Use the Transit station access catchment calculator.",
        "Help me calculate transit station access catchment."
      ],
      "retrieval_phrases": [
        "Transit station access catchment",
        "transit station access catchment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,10,20",
            "b": "100,200,400",
            "c": 10
          },
          "outputs": [
            {
              "label": "Origins inside catchment",
              "value": 2
            },
            {
              "label": "Demand inside catchment",
              "value": 300
            },
            {
              "label": "Demand coverage (%)",
              "value": 42.857142857142854
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1468",
      "name": "Transit route overlap mileage",
      "category": "Public transport service planning",
      "status": "available",
      "purpose": "Each physical directed segment appears once per route. Identical identifiers must carry the same distance. Opposite directions should use different IDs if treated separately.",
      "url": "/calculators/transit-route-overlap-mileage/",
      "version": "f62460b07c6882eab04b40366c80d4c771c0cc58e4c144ed071dc3814e0c6756",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Segment identifiers on route A",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Segment distances on route A (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Segment identifiers on route B",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Segment distances on route B (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Shared route distance (km)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Route A overlap (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Route B overlap (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each physical directed segment appears once per route. Identical identifiers must carry the same distance. Opposite directions should use different IDs if treated separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Shared route distance (km)",
          "text": "Sum route A segment lengths whose identifiers also occur on route B."
        },
        {
          "label": "Route A overlap (%)",
          "text": "Divide shared length by route A total."
        },
        {
          "label": "Route B overlap (%)",
          "text": "Divide shared length by route B total."
        }
      ],
      "example_questions": [
        "Use the Transit route overlap mileage calculator.",
        "Help me calculate transit route overlap mileage."
      ],
      "retrieval_phrases": [
        "Transit route overlap mileage",
        "transit route overlap mileage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3",
            "b": "2,3,5",
            "c": "2,3,4",
            "d": "3,5,4"
          },
          "outputs": [
            {
              "label": "Shared route distance (km)",
              "value": 8
            },
            {
              "label": "Route A overlap (%)",
              "value": 80
            },
            {
              "label": "Route B overlap (%)",
              "value": 66.66666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1475",
      "name": "Transit schedule recovery margin",
      "category": "Public transport service planning",
      "status": "available",
      "purpose": "Empirical sample proportions only; recovery is available after scheduled running time. No probability extrapolation beyond observed trips.",
      "url": "/calculators/transit-schedule-recovery-margin/",
      "version": "36449edfe38c6ad6a72b4ff1f4c93d57053903a50699b33b18e83a42ce822a75",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Observed running times (min)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Scheduled running time (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Additional recovery allowance (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Trips exceeding schedule (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Trips exceeding schedule plus recovery (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Worst observed remaining delay (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Empirical sample proportions only; recovery is available after scheduled running time. No probability extrapolation beyond observed trips."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Trips exceeding schedule (%)",
          "text": "Count observed running times exceeding scheduled minutes."
        },
        {
          "label": "Trips exceeding schedule plus recovery (%)",
          "text": "Count observed times beyond the schedule plus recovery."
        },
        {
          "label": "Worst observed remaining delay (min)",
          "text": "Subtract scheduled time and recovery from the largest observation."
        }
      ],
      "example_questions": [
        "Use the Transit schedule recovery margin calculator.",
        "Help me calculate transit schedule recovery margin."
      ],
      "retrieval_phrases": [
        "Transit schedule recovery margin",
        "transit schedule recovery margin"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,45,50,55",
            "b": 50,
            "c": 5
          },
          "outputs": [
            {
              "label": "Trips exceeding schedule (%)",
              "value": 25
            },
            {
              "label": "Trips exceeding schedule plus recovery (%)",
              "value": 0
            },
            {
              "label": "Worst observed remaining delay (min)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1480",
      "name": "Model railway platform train fit",
      "category": "Model railways and miniature transport",
      "status": "available",
      "purpose": "Bodies exclude coupling gaps. A locomotive plus the listed cars creates one gap per car. This checks straight-platform length only.",
      "url": "/calculators/model-railway-platform-train-fit/",
      "version": "ef5d41e0ea7b1517c295636e4eab2d844f1c9159c05c9fbd908b9e0bc95d242c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Car body lengths (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Locomotive body length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Inter-vehicle coupling gap (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable platform length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Complete train length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Platform spare length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Fits platform",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Bodies exclude coupling gaps. A locomotive plus the listed cars creates one gap per car. This checks straight-platform length only."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Complete train length (mm)",
          "text": "Add all bodies plus the gaps between adjacent vehicles."
        },
        {
          "label": "Platform spare length (mm)",
          "text": "Subtract train length from platform length."
        },
        {
          "label": "Fits platform",
          "text": "Compare complete train length with usable platform."
        }
      ],
      "example_questions": [
        "Use the Model railway platform train fit calculator.",
        "Help me calculate model railway platform train fit."
      ],
      "retrieval_phrases": [
        "Model railway platform train fit",
        "model railway platform train fit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "200,220,200",
            "b": 180,
            "c": 10,
            "d": 850
          },
          "outputs": [
            {
              "label": "Complete train length (mm)",
              "value": 830
            },
            {
              "label": "Platform spare length (mm)",
              "value": 20
            },
            {
              "label": "Fits platform",
              "value": "Yes"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1485",
      "name": "Model railway scenery plaster batch",
      "category": "Model railways and miniature transport",
      "status": "available",
      "purpose": "Uses measured mixed-volume yield for the selected plaster. Flat patch volume equals area times thickness; thickness in mm directly gives litres per m².",
      "url": "/calculators/model-railway-scenery-plaster-batch/",
      "version": "710a0f639c02f56cf062175c9d51ecdd85623aa6d9f6b21cf5bd7f56a5c07866",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Terrain patch areas (m²)",
          "type": "array",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Plaster thickness by patch (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured mixed yield (L/kg dry)",
          "type": "number",
          "required": true,
          "unit": "L/kg dry",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Maximum dry batch size (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mixed plaster volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required dry plaster (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Mixing batches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses measured mixed-volume yield for the selected plaster. Flat patch volume equals area times thickness; thickness in mm directly gives litres per m²."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mixed plaster volume (L)",
          "text": "Multiply each patch area by millimetre thickness and add litres."
        },
        {
          "label": "Required dry plaster (kg)",
          "text": "Divide mixed volume by measured litres per dry kg."
        },
        {
          "label": "Mixing batches",
          "text": "Round dry requirement divided by maximum dry batch mass up."
        }
      ],
      "example_questions": [
        "Use the Model railway scenery plaster batch calculator.",
        "Help me calculate model railway scenery plaster batch."
      ],
      "retrieval_phrases": [
        "Model railway scenery plaster batch",
        "model railway scenery plaster batch"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0.5,1",
            "b": "4,6",
            "c": 1.25,
            "d": 2
          },
          "outputs": [
            {
              "label": "Mixed plaster volume (L)",
              "value": 8
            },
            {
              "label": "Required dry plaster (kg)",
              "value": 6.4
            },
            {
              "label": "Mixing batches",
              "value": 4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1487",
      "name": "Model railway foam contour layers",
      "category": "Model railways and miniature transport",
      "status": "available",
      "purpose": "Nested stepped terrain, each footprint covers its own elevation band starting at the previous contour. Every band rounds up to full sheet layers. Sheet count is aggregate area only, not a cutting layout.",
      "url": "/calculators/model-railway-foam-contour-layers/",
      "version": "96562868b2a509a724c90c56f67ed30ded2660da7c3fbfa5fab4fb4ba9bf6d08",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Contour top elevations (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Contour footprint areas (m²)",
          "type": "array",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Foam sheet thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Purchased sheet area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Layers in each elevation band",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total foam area (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Minimum sheets by area",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Nested stepped terrain, each footprint covers its own elevation band starting at the previous contour. Every band rounds up to full sheet layers. Sheet count is aggregate area only, not a cutting layout."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Layers in each elevation band",
          "text": "Divide each band rise by sheet thickness and round up."
        },
        {
          "label": "Total foam area (m²)",
          "text": "Multiply layers in each band by its footprint area and add."
        },
        {
          "label": "Minimum sheets by area",
          "text": "Divide aggregate foam area by sheet area and round up."
        }
      ],
      "example_questions": [
        "Use the Model railway foam contour layers calculator.",
        "Help me calculate model railway foam contour layers."
      ],
      "retrieval_phrases": [
        "Model railway foam contour layers",
        "model railway foam contour layers"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,40,60",
            "b": "2,1.5,1",
            "c": 20,
            "d": 1
          },
          "outputs": [
            {
              "label": "Layers in each elevation band",
              "value": "1, 1, 1"
            },
            {
              "label": "Total foam area (m²)",
              "value": 4.5
            },
            {
              "label": "Minimum sheets by area",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1488",
      "name": "Model railway timetable compression",
      "category": "Model railways and miniature transport",
      "status": "available",
      "purpose": "Prototype event times are offsets from a common start, not wall-clock dates. Constant fast-clock rate throughout session.",
      "url": "/calculators/model-railway-timetable-compression/",
      "version": "c63cb2a5e0b91eb6895191039159c7deb5e1762ebbcf1f46f66164269781ec5e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Prototype event times (min from session start)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Fast-clock ratio (prototype minutes per real minute)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Real setup allowance before session (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Real event offsets including setup (min)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Real operating session duration (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Real elapsed time to last event (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Prototype event times are offsets from a common start, not wall-clock dates. Constant fast-clock rate throughout session."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Real event offsets including setup (min)",
          "text": "Divide prototype offsets by fast-clock ratio and add setup allowance."
        },
        {
          "label": "Real operating session duration (min)",
          "text": "Scale interval between first and last events."
        },
        {
          "label": "Real elapsed time to last event (min)",
          "text": "Scale last event offset and include setup."
        }
      ],
      "example_questions": [
        "Use the Model railway timetable compression calculator.",
        "Help me calculate model railway timetable compression."
      ],
      "retrieval_phrases": [
        "Model railway timetable compression",
        "model railway timetable compression"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,30,90,120",
            "b": 4,
            "c": 10
          },
          "outputs": [
            {
              "label": "Real event offsets including setup (min)",
              "value": "10, 17.5, 32.5, 40"
            },
            {
              "label": "Real operating session duration (min)",
              "value": 30
            },
            {
              "label": "Real elapsed time to last event (min)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1493",
      "name": "Model railway turnout control inventory",
      "category": "Model railways and miniature transport",
      "status": "available",
      "purpose": "Separate incompatible control groups each use one module capacity. Wire quantity counts individual conductor lengths; no current, voltage or installation guidance.",
      "url": "/calculators/model-railway-turnout-control-inventory/",
      "version": "ef4357c430713256f60275feb83c3bda1f96bce4c33c9a11e0c0269c1ffd5a39",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Turnouts by control group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Turnouts supported per module by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Wires per turnout by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Average wire run per turnout by group (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Control modules by group",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Conductor length by group (m)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused module outputs",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Separate incompatible control groups each use one module capacity. Wire quantity counts individual conductor lengths; no current, voltage or installation guidance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Control modules by group",
          "text": "Round turnout count divided by compatible module capacity up."
        },
        {
          "label": "Conductor length by group (m)",
          "text": "Multiply turnouts, wires per turnout and average run length."
        },
        {
          "label": "Unused module outputs",
          "text": "Sum module output capacity left after connecting all turnouts."
        }
      ],
      "example_questions": [
        "Use the Model railway turnout control inventory calculator.",
        "Help me calculate model railway turnout control inventory."
      ],
      "retrieval_phrases": [
        "Model railway turnout control inventory",
        "model railway turnout control inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "8,5",
            "b": "4,2",
            "c": "3,2",
            "d": "2,3"
          },
          "outputs": [
            {
              "label": "Control modules by group",
              "value": "2, 3"
            },
            {
              "label": "Conductor length by group (m)",
              "value": "48, 30"
            },
            {
              "label": "Unused module outputs",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1494",
      "name": "Model railway tunnel clearance envelope",
      "category": "Model railways and miniature transport",
      "status": "available",
      "purpose": "Rectangular conceptual tunnel envelope around a model railway. Supplied curve offsets already include the chosen rolling stock sweep; no prototype engineering certification.",
      "url": "/calculators/model-railway-tunnel-clearance-envelope/",
      "version": "b734b2b5eabc5d14626f8a10bec7e85c3c5a718c85cc6b0ea6445db15fca8cd8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Model rolling-stock body width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Body height above rail (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured outward curve offset (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Measured inward curve offset (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Supplied lateral margin each side (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Supplied top margin (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required tunnel opening width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required height above rail (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Rectangular opening area (mm²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rectangular conceptual tunnel envelope around a model railway. Supplied curve offsets already include the chosen rolling stock sweep; no prototype engineering certification."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required tunnel opening width (mm)",
          "text": "Add body width, inward and outward sweeps, and both lateral margins."
        },
        {
          "label": "Required height above rail (mm)",
          "text": "Add body height and top margin."
        },
        {
          "label": "Rectangular opening area (mm²)",
          "text": "Multiply required width and height."
        }
      ],
      "example_questions": [
        "Use the Model railway tunnel clearance envelope calculator.",
        "Help me calculate model railway tunnel clearance envelope."
      ],
      "retrieval_phrases": [
        "Model railway tunnel clearance envelope",
        "model railway tunnel clearance envelope"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 50,
            "c": 4,
            "d": 3,
            "e": 2,
            "g": 5
          },
          "outputs": [
            {
              "label": "Required tunnel opening width (mm)",
              "value": 51
            },
            {
              "label": "Required height above rail (mm)",
              "value": 55
            },
            {
              "label": "Rectangular opening area (mm²)",
              "value": 2805
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1498",
      "name": "Model railway repaint decal scaling",
      "category": "Model railways and miniature transport",
      "status": "available",
      "purpose": "Uniform reduction at a supplied model scale. Raster dimensions round up to whole pixels to avoid undersizing; one inch is exactly 25.4 mm.",
      "url": "/calculators/model-railway-repaint-decal-scaling/",
      "version": "7ac48ba3a215bd5b8586d6b1f04d738fb74eb5cdf8a9bc484ccc76990d353d44",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Prototype lettering width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Prototype lettering height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Scale denominator",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Print resolution (pixels/inch)",
          "type": "number",
          "required": true,
          "unit": "pixels/inch",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Printed width and height (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minimum raster width and height (pixels)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform reduction at a supplied model scale. Raster dimensions round up to whole pixels to avoid undersizing; one inch is exactly 25.4 mm."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Printed width and height (mm)",
          "text": "Divide prototype lettering dimensions by scale denominator."
        },
        {
          "label": "Minimum raster width and height (pixels)",
          "text": "Convert scaled millimetres to inches, apply print resolution and round up."
        }
      ],
      "example_questions": [
        "Use the Model railway repaint decal scaling calculator.",
        "Help me calculate model railway repaint decal scaling."
      ],
      "retrieval_phrases": [
        "Model railway repaint decal scaling",
        "model railway repaint decal scaling"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 500,
            "c": 100,
            "d": 254
          },
          "outputs": [
            {
              "label": "Printed width and height (mm)",
              "value": "10, 5"
            },
            {
              "label": "Minimum raster width and height (pixels)",
              "value": "100, 50"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1501",
      "name": "Bakery oven deck loading",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Fixed tray orientation and a rectangular grid on identical decks, with gaps only between trays. All trays share bake duration; no thermal or food-safety modeling.",
      "url": "/calculators/bakery-oven-deck-loading/",
      "version": "8c0852d528621d62ef7009369392e08d7a22d06f72971ce5446345219e3c5234",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Oven deck width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Tray width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Clearance between trays (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Identical oven decks",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Total trays to bake",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Bake duration per load (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Trays per oven load",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sequential oven loads",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Baking sequence duration (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed tray orientation and a rectangular grid on identical decks, with gaps only between trays. All trays share bake duration; no thermal or food-safety modeling."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Trays per oven load",
          "text": "Fit trays across each deck axis, then multiply by deck count."
        },
        {
          "label": "Sequential oven loads",
          "text": "Divide total trays by one oven load and round up."
        },
        {
          "label": "Baking sequence duration (min)",
          "text": "Multiply sequential loads by bake duration; loading time is excluded."
        }
      ],
      "example_questions": [
        "Use the Bakery oven deck loading calculator.",
        "Help me calculate bakery oven deck loading."
      ],
      "retrieval_phrases": [
        "Bakery oven deck loading",
        "bakery oven deck loading"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,80",
            "b": "40,30",
            "c": 5,
            "d": 2,
            "e": 20,
            "g": 20
          },
          "outputs": [
            {
              "label": "Trays per oven load",
              "value": 8
            },
            {
              "label": "Sequential oven loads",
              "value": 3
            },
            {
              "label": "Baking sequence duration (min)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1505",
      "name": "Bakery flour inventory by recipe",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Flour fractions are fractions of total dough mass, not baker’s percentages. All recipes use the same compatible flour stock.",
      "url": "/calculators/bakery-flour-inventory-by-recipe/",
      "version": "44f69821672d35dded57211a24a0ee2178a447cbb649d4075c66e1c8f4ed4b9b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Planned dough mass by recipe (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Flour fraction of total dough by recipe (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Flour in stock (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Flour by recipe (kg)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Flour required (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Flour shortage (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Flour fractions are fractions of total dough mass, not baker’s percentages. All recipes use the same compatible flour stock."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Flour by recipe (kg)",
          "text": "Multiply each dough production mass by its flour fraction."
        },
        {
          "label": "Flour required (kg)",
          "text": "Sum recipe flour requirements."
        },
        {
          "label": "Flour shortage (kg)",
          "text": "Subtract stock from flour demand, floored at zero."
        }
      ],
      "example_questions": [
        "Use the Bakery flour inventory by recipe calculator.",
        "Help me calculate bakery flour inventory by recipe."
      ],
      "retrieval_phrases": [
        "Bakery flour inventory by recipe",
        "bakery flour inventory by recipe"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "50,60",
            "c": 15
          },
          "outputs": [
            {
              "label": "Flour by recipe (kg)",
              "value": "5, 12"
            },
            {
              "label": "Flour required (kg)",
              "value": 17
            },
            {
              "label": "Flour shortage (kg)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1506",
      "name": "Bakery starter refresh inventory",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "One arithmetic refresh with starter:flour:water ratio 1:c:d. Build exactly production demand plus retained starter; no fermentation timing or maturity prediction.",
      "url": "/calculators/bakery-starter-refresh-inventory/",
      "version": "f83d141555a31117d8c88f3ec356ff2a36a88de712a5e25bdc1ddcbf55e218ec",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Production levain demand (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starter retained after production (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Feed flour parts per starter part",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Feed water parts per starter part",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Starter currently available (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Starter required for refresh (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Flour and water additions (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Current starter surplus (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One arithmetic refresh with starter:flour:water ratio 1:c:d. Build exactly production demand plus retained starter; no fermentation timing or maturity prediction."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Starter required for refresh (g)",
          "text": "Divide total desired refreshed mass by total ratio parts."
        },
        {
          "label": "Flour and water additions (g)",
          "text": "Multiply required starter mass by the flour and water ratio parts."
        },
        {
          "label": "Current starter surplus (g)",
          "text": "Subtract required starting starter from available starter; negative means shortage."
        }
      ],
      "example_questions": [
        "Use the Bakery starter refresh inventory calculator.",
        "Help me calculate bakery starter refresh inventory."
      ],
      "retrieval_phrases": [
        "Bakery starter refresh inventory",
        "bakery starter refresh inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 900,
            "b": 100,
            "c": 2,
            "d": 2,
            "e": 250
          },
          "outputs": [
            {
              "label": "Starter required for refresh (g)",
              "value": 200
            },
            {
              "label": "Flour and water additions (g)",
              "value": "400, 400"
            },
            {
              "label": "Current starter surplus (g)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1508",
      "name": "Bakery laminated dough layer count",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Idealized fat-layer count: each fold multiplies existing distinct layers, assuming no merged, broken or trimmed layers. Multipliers are integers from two through six.",
      "url": "/calculators/bakery-laminated-dough-layer-count/",
      "version": "2a0888ad30e1ae5512e73fb65026edb61cd653048d2ec2e0d8bc28a919be409e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial fat-layer count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Fold multipliers in chronological order",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fat layers after each fold",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Final theoretical fat layers",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Idealized fat-layer count: each fold multiplies existing distinct layers, assuming no merged, broken or trimmed layers. Multipliers are integers from two through six."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fat layers after each fold",
          "text": "Multiply initial fat layers successively by each fold multiplier."
        },
        {
          "label": "Final theoretical fat layers",
          "text": "Multiply all fold factors by the initial count."
        }
      ],
      "example_questions": [
        "Use the Bakery laminated dough layer count calculator.",
        "Help me calculate bakery laminated dough layer count."
      ],
      "retrieval_phrases": [
        "Bakery laminated dough layer count",
        "bakery laminated dough layer count"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": "3,3,4"
          },
          "outputs": [
            {
              "label": "Fat layers after each fold",
              "value": "3, 9, 36"
            },
            {
              "label": "Final theoretical fat layers",
              "value": 36
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1509",
      "name": "Bakery croissant cutting layout",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Supported layout partitions the trimmed sheet into base-by-height rectangles and cuts each diagonally into two right triangles. Does not model staggered isosceles croissant layouts or stretching.",
      "url": "/calculators/bakery-croissant-cutting-layout/",
      "version": "293f3df69a99be17ff139261dc70f4665747a92e59a6bdd9a9511d7131eb383f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Dough sheet width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Dough sheet depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Triangle base (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Triangle height (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Edge trim on each side (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Triangles cut",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Used triangle area (cm²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Offcut including edge trim (cm²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supported layout partitions the trimmed sheet into base-by-height rectangles and cuts each diagonally into two right triangles. Does not model staggered isosceles croissant layouts or stretching."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Triangles cut",
          "text": "Count base-by-height rectangles in a fixed orientation and double for diagonal cuts."
        },
        {
          "label": "Used triangle area (cm²)",
          "text": "Multiply complete rectangle count by its area."
        },
        {
          "label": "Offcut including edge trim (cm²)",
          "text": "Subtract area of cut triangles from the original sheet."
        }
      ],
      "example_questions": [
        "Use the Bakery croissant cutting layout calculator.",
        "Help me calculate bakery croissant cutting layout."
      ],
      "retrieval_phrases": [
        "Bakery croissant cutting layout",
        "bakery croissant cutting layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 40,
            "c": 10,
            "d": 20,
            "e": 0
          },
          "outputs": [
            {
              "label": "Triangles cut",
              "value": 24
            },
            {
              "label": "Used triangle area (cm²)",
              "value": 2400
            },
            {
              "label": "Offcut including edge trim (cm²)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1510",
      "name": "Bakery pastry sheet shrinkage fit",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Independent linear shrinkage fractions measured on the same pastry process. Trim is added to raw dimensions after compensating shrinkage.",
      "url": "/calculators/bakery-pastry-sheet-shrinkage-fit/",
      "version": "ea568a6e1b25762ee598455c6cc06658ff618d46b64b1ace86abb23e8b463cd0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required baked width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Required baked depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Observed width shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Observed depth shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Raw cutting trim per side (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Raw width to cut (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Raw depth to cut (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Raw cutting area (cm²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Independent linear shrinkage fractions measured on the same pastry process. Trim is added to raw dimensions after compensating shrinkage."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Raw width to cut (cm)",
          "text": "Divide required width by retained width fraction and add both raw trim margins."
        },
        {
          "label": "Raw depth to cut (cm)",
          "text": "Apply the corresponding depth shrinkage correction and raw margins."
        },
        {
          "label": "Raw cutting area (cm²)",
          "text": "Multiply raw cutting dimensions."
        }
      ],
      "example_questions": [
        "Use the Bakery pastry sheet shrinkage fit calculator.",
        "Help me calculate bakery pastry sheet shrinkage fit."
      ],
      "retrieval_phrases": [
        "Bakery pastry sheet shrinkage fit",
        "bakery pastry sheet shrinkage fit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 24,
            "b": 16,
            "c": 20,
            "d": 20,
            "e": 1
          },
          "outputs": [
            {
              "label": "Raw width to cut (cm)",
              "value": 32
            },
            {
              "label": "Raw depth to cut (cm)",
              "value": 22
            },
            {
              "label": "Raw cutting area (cm²)",
              "value": 704
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1511",
      "name": "Bakery muffin deposit weights",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Baking loss is a fraction of raw deposited mass; deposit waste is a separate fraction of prepared batch lost before filling cavities.",
      "url": "/calculators/bakery-muffin-deposit-weights/",
      "version": "c6a79a4c76f9d21c2cf37e4dea948aa434f41bb6980e948d93154d2ac83c6752",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target baked muffin mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Observed baking mass loss (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cavities to fill",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Measured deposit waste (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Raw deposit per cavity (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mass deposited in cavities (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Batch to prepare (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Baking loss is a fraction of raw deposited mass; deposit waste is a separate fraction of prepared batch lost before filling cavities."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Raw deposit per cavity (g)",
          "text": "Divide baked target by retained baking fraction."
        },
        {
          "label": "Mass deposited in cavities (g)",
          "text": "Multiply per-cavity raw deposit by cavity count."
        },
        {
          "label": "Batch to prepare (g)",
          "text": "Divide deposited mass by fraction retained during depositing."
        }
      ],
      "example_questions": [
        "Use the Bakery muffin deposit weights calculator.",
        "Help me calculate bakery muffin deposit weights."
      ],
      "retrieval_phrases": [
        "Bakery muffin deposit weights",
        "bakery muffin deposit weights"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 20,
            "c": 12,
            "d": 4
          },
          "outputs": [
            {
              "label": "Raw deposit per cavity (g)",
              "value": 75
            },
            {
              "label": "Mass deposited in cavities (g)",
              "value": 900
            },
            {
              "label": "Batch to prepare (g)",
              "value": 937.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1512",
      "name": "Bakery bread bake-loss audit",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Observational mass loss only, with matched batches and no additions after initial weighing. Sellable yield assumes all cooled product is saleable.",
      "url": "/calculators/bakery-bread-bake-loss-audit/",
      "version": "1a1330375a8cd6e3d4994d76f06fdb9d632c76f2f528f7d86c977d4594cc5fde",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pre-bake batch masses (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Cooled baked batch masses (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Bake loss by batch (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total cooled yield (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Weighted overall bake loss (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Observational mass loss only, with matched batches and no additions after initial weighing. Sellable yield assumes all cooled product is saleable."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Bake loss by batch (%)",
          "text": "Divide each batch mass decrease by pre-bake mass."
        },
        {
          "label": "Total cooled yield (kg)",
          "text": "Sum all cooled batch masses."
        },
        {
          "label": "Weighted overall bake loss (%)",
          "text": "Divide total mass decrease by total pre-bake mass."
        }
      ],
      "example_questions": [
        "Use the Bakery bread bake-loss audit calculator.",
        "Help me calculate bakery bread bake-loss audit."
      ],
      "retrieval_phrases": [
        "Bakery bread bake-loss audit",
        "bakery bread bake loss audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "8,17"
          },
          "outputs": [
            {
              "label": "Bake loss by batch (%)",
              "value": "20, 15"
            },
            {
              "label": "Total cooled yield (kg)",
              "value": 25
            },
            {
              "label": "Weighted overall bake loss (%)",
              "value": 16.666666666666668
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1513",
      "name": "Bakery loaf tin dough capacity",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Scales one observed loading by internal volume using the same dough and process. Relative loading factor is user chosen; it does not predict proofing, doneness or safety.",
      "url": "/calculators/bakery-loaf-tin-dough-capacity/",
      "version": "dbab4be876edd82611f25a0340d8aec3f9e91f3aa3646125444543fbf78b14d4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Test tin internal volume (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Successful test dough load (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "New tin internal volumes (mL)",
          "type": "array",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Chosen relative loading factor",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "New dough loads (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Combined dough required (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Dough loading density (g/mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Scales one observed loading by internal volume using the same dough and process. Relative loading factor is user chosen; it does not predict proofing, doneness or safety."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "New dough loads (g)",
          "text": "Scale test load by new-to-test volume ratio and chosen loading factor."
        },
        {
          "label": "Combined dough required (g)",
          "text": "Add all scaled tin loads."
        },
        {
          "label": "Dough loading density (g/mL)",
          "text": "Divide test mass by test volume and apply chosen relative factor."
        }
      ],
      "example_questions": [
        "Use the Bakery loaf tin dough capacity calculator.",
        "Help me calculate bakery loaf tin dough capacity."
      ],
      "retrieval_phrases": [
        "Bakery loaf tin dough capacity",
        "bakery loaf tin dough capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 500,
            "c": "800,1200",
            "d": 1
          },
          "outputs": [
            {
              "label": "New dough loads (g)",
              "value": "400, 600"
            },
            {
              "label": "Combined dough required (g)",
              "value": 1000
            },
            {
              "label": "Dough loading density (g/mL)",
              "value": 0.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1514",
      "name": "Bakery cookie spread spacing",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Identical circular cookies are placed on a rectangular grid using measured final diameter, gaps only between cookies, no tray-edge margin. No staggered packing.",
      "url": "/calculators/bakery-cookie-spread-spacing/",
      "version": "7a4944536517ccdac2d96724b29b2b42d8a841650381cde56af64de128661ff4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Tray width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Test-baked cookie diameter (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Gap between baked cookies (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total cookies",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cookies per tray",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Trays needed",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Empty spaces across purchased trays",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Identical circular cookies are placed on a rectangular grid using measured final diameter, gaps only between cookies, no tray-edge margin. No staggered packing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cookies per tray",
          "text": "Fit diameter-plus-gap intervals along each tray dimension."
        },
        {
          "label": "Trays needed",
          "text": "Round required cookies divided by tray capacity up."
        },
        {
          "label": "Empty spaces across purchased trays",
          "text": "Subtract cookie count from total grid spaces on needed trays."
        }
      ],
      "example_questions": [
        "Use the Bakery cookie spread spacing calculator.",
        "Help me calculate bakery cookie spread spacing."
      ],
      "retrieval_phrases": [
        "Bakery cookie spread spacing",
        "bakery cookie spread spacing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,30",
            "b": 8,
            "c": 2,
            "d": 25
          },
          "outputs": [
            {
              "label": "Cookies per tray",
              "value": 12
            },
            {
              "label": "Trays needed",
              "value": 3
            },
            {
              "label": "Empty spaces across purchased trays",
              "value": 11
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1517",
      "name": "Bakery filling allocation",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "All products use one compatible filling. Process loss is a fraction of prepared filling, and supplier packages contain ready-to-use filling or an equivalent measured yield.",
      "url": "/calculators/bakery-filling-allocation/",
      "version": "30a3671309661ccae69de3474f53641c179e06ce672140c26eb29a238dbc7bb8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Piece counts by product",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Chosen filling mass per piece (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured filling process loss (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Ingredient package mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Maximum filling batch mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Deposited filling required (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Filling to prepare (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Packages needed",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Production batches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All products use one compatible filling. Process loss is a fraction of prepared filling, and supplier packages contain ready-to-use filling or an equivalent measured yield."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Deposited filling required (g)",
          "text": "Multiply each product count by filling per piece and add."
        },
        {
          "label": "Filling to prepare (g)",
          "text": "Divide deposit requirement by retained process fraction."
        },
        {
          "label": "Packages needed",
          "text": "Round prepared filling mass divided by package mass up."
        },
        {
          "label": "Production batches",
          "text": "Round prepared mass divided by maximum batch mass up."
        }
      ],
      "example_questions": [
        "Use the Bakery filling allocation calculator.",
        "Help me calculate bakery filling allocation."
      ],
      "retrieval_phrases": [
        "Bakery filling allocation",
        "bakery filling allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "10,20",
            "c": 20,
            "d": 1000,
            "e": 1500
          },
          "outputs": [
            {
              "label": "Deposited filling required (g)",
              "value": 2000
            },
            {
              "label": "Filling to prepare (g)",
              "value": 2500
            },
            {
              "label": "Packages needed",
              "value": 3
            },
            {
              "label": "Production batches",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1518",
      "name": "Bakery slicing yield",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Uniform straight slices with negligible knife kerf. Both end trims are removed before slicing; residual is the final unsliced portion.",
      "url": "/calculators/bakery-slicing-yield/",
      "version": "fc86b836e3f5871003978c1a51fe9f05065f7b72c15554042fa88c15e02499e3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Loaf length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "End trim per end (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Slice thickness (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usable loaf length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Full slices",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Residual end piece (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform straight slices with negligible knife kerf. Both end trims are removed before slicing; residual is the final unsliced portion."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usable loaf length (cm)",
          "text": "Subtract both end trims."
        },
        {
          "label": "Full slices",
          "text": "Divide usable length by slice thickness and round down."
        },
        {
          "label": "Residual end piece (cm)",
          "text": "Subtract full-slice length from usable loaf length."
        }
      ],
      "example_questions": [
        "Use the Bakery slicing yield calculator.",
        "Help me calculate bakery slicing yield."
      ],
      "retrieval_phrases": [
        "Bakery slicing yield",
        "bakery slicing yield"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 1,
            "c": 1.5
          },
          "outputs": [
            {
              "label": "Usable loaf length (cm)",
              "value": 28
            },
            {
              "label": "Full slices",
              "value": 18
            },
            {
              "label": "Residual end piece (cm)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1520",
      "name": "Bakery day-old markdown scenario",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Expected sales are allowed to be fractional. Donation value is a user-chosen comparison score, not cash revenue or a tax benefit.",
      "url": "/calculators/bakery-day-old-markdown-scenario/",
      "version": "4ae0b5b0657e26274098fc6a852689854ed387488eb7da77e0cb443a0b2230d6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unsold units",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Regular price per unit",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Markdown percentage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Assumed fraction sold at markdown (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Chosen non-cash donation value per remaining unit",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Markdown selling price",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected cash recovered",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining units expected",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Cash plus chosen donation value",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Expected sales are allowed to be fractional. Donation value is a user-chosen comparison score, not cash revenue or a tax benefit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Markdown selling price",
          "text": "Apply percentage markdown to regular price."
        },
        {
          "label": "Expected cash recovered",
          "text": "Multiply expected markdown sales by markdown price."
        },
        {
          "label": "Remaining units expected",
          "text": "Subtract expected sold fraction from unsold stock."
        },
        {
          "label": "Cash plus chosen donation value",
          "text": "Add expected cash and user-valued donation of remaining units."
        }
      ],
      "example_questions": [
        "Use the Bakery day-old markdown scenario calculator.",
        "Help me calculate bakery day-old markdown scenario."
      ],
      "retrieval_phrases": [
        "Bakery day-old markdown scenario",
        "bakery day old markdown scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 3,
            "c": 50,
            "d": 80,
            "e": 0.5
          },
          "outputs": [
            {
              "label": "Markdown selling price",
              "value": 1.5
            },
            {
              "label": "Expected cash recovered",
              "value": 120
            },
            {
              "label": "Remaining units expected",
              "value": 19.999999999999996
            },
            {
              "label": "Cash plus chosen donation value",
              "value": 130
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1521",
      "name": "Bakery wholesale order aggregation",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Single product; customer order counts are whole sales packs. Production occurs only in whole minimum batches; excess units remain unallocated.",
      "url": "/calculators/bakery-wholesale-order-aggregation/",
      "version": "dd3a485c05dc895f5addda478017d74b0f3330a4e450acd6def92745ee94ed0f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Customer orders in packs",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Units per sales pack",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Units per minimum production batch",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ordered product units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Production batches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Excess production units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single product; customer order counts are whole sales packs. Production occurs only in whole minimum batches; excess units remain unallocated."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ordered product units",
          "text": "Add customer packs and multiply by units per pack."
        },
        {
          "label": "Production batches",
          "text": "Round required units divided by minimum batch size up."
        },
        {
          "label": "Excess production units",
          "text": "Subtract order units from whole-batch production."
        }
      ],
      "example_questions": [
        "Use the Bakery wholesale order aggregation calculator.",
        "Help me calculate bakery wholesale order aggregation."
      ],
      "retrieval_phrases": [
        "Bakery wholesale order aggregation",
        "bakery wholesale order aggregation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,5,2",
            "b": 6,
            "c": 24
          },
          "outputs": [
            {
              "label": "Ordered product units",
              "value": 60
            },
            {
              "label": "Production batches",
              "value": 3
            },
            {
              "label": "Excess production units",
              "value": 12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1524",
      "name": "Bakery delivery tray return ledger",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "Cumulative issued/returned counts for a closed record period. Deposit liability equals deposits collected on issues less refunds already made; refunds still due relate only to recorded returns.",
      "url": "/calculators/bakery-delivery-tray-return-ledger/",
      "version": "a18b35a9a7c0290c8510422d36276e6babd8bdd4878aa6717808f2bb484311a4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Trays issued by customer",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Trays returned by customer",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Deposit per tray",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Deposits already refunded by customer",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Outstanding trays by customer",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Refund still due by customer",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total deposit liability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Cumulative issued/returned counts for a closed record period. Deposit liability equals deposits collected on issues less refunds already made; refunds still due relate only to recorded returns."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Outstanding trays by customer",
          "text": "Subtract returned trays from issued trays."
        },
        {
          "label": "Refund still due by customer",
          "text": "Value returned trays at deposit rate and subtract refunds already paid."
        },
        {
          "label": "Total deposit liability",
          "text": "Subtract refunded deposits from deposits originally collected."
        }
      ],
      "example_questions": [
        "Use the Bakery delivery tray return ledger calculator.",
        "Help me calculate bakery delivery tray return ledger."
      ],
      "retrieval_phrases": [
        "Bakery delivery tray return ledger",
        "bakery delivery tray return ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,15",
            "b": "15,10",
            "c": 5,
            "d": "50,25"
          },
          "outputs": [
            {
              "label": "Outstanding trays by customer",
              "value": "5, 5"
            },
            {
              "label": "Refund still due by customer",
              "value": "25, 25"
            },
            {
              "label": "Total deposit liability",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1525",
      "name": "Bakery product-range workload",
      "category": "Bakery production planning",
      "status": "available",
      "purpose": "One setup per active SKU and sequential work on one capacity pool. Zero-volume SKUs incur no setup; overlap and multiple machines are excluded.",
      "url": "/calculators/bakery-product-range-workload/",
      "version": "e00ba58427672d9fd084f201cb997234970b02fd00af72407021c4cb080dc85c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Production units by SKU",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Setup minutes by SKU",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Processing minutes per unit by SKU",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Available production minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Workload by SKU (min)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total workload (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Capacity slack (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One setup per active SKU and sequential work on one capacity pool. Zero-volume SKUs incur no setup; overlap and multiple machines are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Workload by SKU (min)",
          "text": "For each active SKU add setup time and unit processing time."
        },
        {
          "label": "Total workload (min)",
          "text": "Sum all active SKU work times."
        },
        {
          "label": "Capacity slack (min)",
          "text": "Subtract total workload from available production minutes."
        }
      ],
      "example_questions": [
        "Use the Bakery product-range workload calculator.",
        "Help me calculate bakery product-range workload."
      ],
      "retrieval_phrases": [
        "Bakery product-range workload",
        "bakery product range workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "20,30",
            "c": "0.5,1",
            "d": 180
          },
          "outputs": [
            {
              "label": "Workload by SKU (min)",
              "value": "70, 80"
            },
            {
              "label": "Total workload (min)",
              "value": 150
            },
            {
              "label": "Capacity slack (min)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1526",
      "name": "Chocolate mold fill quantity",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Shell/fill fraction is supplied by volume, with complete cavity fill and no handling waste. Densities must be measured for the actual ingredients.",
      "url": "/calculators/chocolate-mold-fill-quantity/",
      "version": "f31998e41fe2b32014a3984bfff2fce4240f6fccc125deaaf376cc797eba7645",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cavity volume (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cavity count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Shell share of cavity volume (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Measured chocolate density (g/mL)",
          "type": "number",
          "required": true,
          "unit": "g/mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Measured filling density (g/mL)",
          "type": "number",
          "required": true,
          "unit": "g/mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Chocolate shell mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Filling mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Combined product mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Shell/fill fraction is supplied by volume, with complete cavity fill and no handling waste. Densities must be measured for the actual ingredients."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Chocolate shell mass (g)",
          "text": "Multiply total cavity volume by shell volume fraction and chocolate density."
        },
        {
          "label": "Filling mass (g)",
          "text": "Multiply remaining cavity volume by filling density."
        },
        {
          "label": "Combined product mass (g)",
          "text": "Add shell and filling masses."
        }
      ],
      "example_questions": [
        "Use the Chocolate mold fill quantity calculator.",
        "Help me calculate chocolate mold fill quantity."
      ],
      "retrieval_phrases": [
        "Chocolate mold fill quantity",
        "chocolate mold fill quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 30,
            "c": 25,
            "d": 1.2,
            "e": 1
          },
          "outputs": [
            {
              "label": "Chocolate shell mass (g)",
              "value": 180
            },
            {
              "label": "Filling mass (g)",
              "value": 450
            },
            {
              "label": "Combined product mass (g)",
              "value": 630
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1527",
      "name": "Chocolate shell thickness volume",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Open-top rectangular shell with four sides and a bottom, no lid; outside cavity corners are sharp. Geometry only, with uniform wall thickness.",
      "url": "/calculators/chocolate-shell-thickness-volume/",
      "version": "89055e0b705d392ba58efde7b45b2052396713ab451daed1927ab2c8afd5abee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rectangular cavity width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Rectangular cavity depth (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Rectangular cavity height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Uniform shell thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Outer cavity volume (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Filling void (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Chocolate shell volume (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Open-top rectangular shell with four sides and a bottom, no lid; outside cavity corners are sharp. Geometry only, with uniform wall thickness."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Outer cavity volume (mL)",
          "text": "Multiply dimensions in mm and convert cubic mm to mL."
        },
        {
          "label": "Filling void (mL)",
          "text": "Subtract both side walls from width/depth and bottom thickness from height."
        },
        {
          "label": "Chocolate shell volume (mL)",
          "text": "Subtract inner void from outer cavity volume."
        }
      ],
      "example_questions": [
        "Use the Chocolate shell thickness volume calculator.",
        "Help me calculate chocolate shell thickness volume."
      ],
      "retrieval_phrases": [
        "Chocolate shell thickness volume",
        "chocolate shell thickness volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 20,
            "c": 10,
            "d": 2
          },
          "outputs": [
            {
              "label": "Outer cavity volume (mL)",
              "value": 6
            },
            {
              "label": "Filling void (mL)",
              "value": 3.328
            },
            {
              "label": "Chocolate shell volume (mL)",
              "value": 2.672
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1530",
      "name": "Chocolate couverture mix percentage",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Mass-weighted cocoa-label percentage assuming no mass loss and comparable label definitions. This does not determine tempering compatibility.",
      "url": "/calculators/chocolate-couverture-mix-percentage/",
      "version": "046904c47ebaf95a7850c96c6a00d0009e764596cb0b84b2c1026c7d627a47f6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Couverture ingredient masses (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Label cocoa percentages",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cocoa mass by ingredient (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Blend mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Blend cocoa percentage (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Mass-weighted cocoa-label percentage assuming no mass loss and comparable label definitions. This does not determine tempering compatibility."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cocoa mass by ingredient (g)",
          "text": "Apply each label cocoa percentage to its ingredient mass."
        },
        {
          "label": "Blend mass (g)",
          "text": "Add ingredient masses."
        },
        {
          "label": "Blend cocoa percentage (%)",
          "text": "Divide total cocoa mass by blend mass and express as percent."
        }
      ],
      "example_questions": [
        "Use the Chocolate couverture mix percentage calculator.",
        "Help me calculate chocolate couverture mix percentage."
      ],
      "retrieval_phrases": [
        "Chocolate couverture mix percentage",
        "chocolate couverture mix percentage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "200,300",
            "b": "50,70"
          },
          "outputs": [
            {
              "label": "Cocoa mass by ingredient (g)",
              "value": "100, 210"
            },
            {
              "label": "Blend mass (g)",
              "value": 500
            },
            {
              "label": "Blend cocoa percentage (%)",
              "value": 62
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1531",
      "name": "Confectionery syrup concentration balance",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Conservation-of-mass scenario in which only water leaves and all entered soluble solids remain. Does not infer cooking temperature or product stability.",
      "url": "/calculators/confectionery-syrup-concentration-balance/",
      "version": "92e01ea3456a05a0d6c223c1fcdd792e1745f500dfa6b1c6dd519e3fd00a8a5f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient masses (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Soluble solids by ingredient (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Water evaporated (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Conserved soluble solids (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Final mixture mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Modeled final solids (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Conservation-of-mass scenario in which only water leaves and all entered soluble solids remain. Does not infer cooking temperature or product stability."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Conserved soluble solids (g)",
          "text": "Add soluble-solid mass contributed by each ingredient."
        },
        {
          "label": "Final mixture mass (g)",
          "text": "Subtract evaporated water from initial mass."
        },
        {
          "label": "Modeled final solids (%)",
          "text": "Divide conserved solids by final mass."
        }
      ],
      "example_questions": [
        "Use the Confectionery syrup concentration balance calculator.",
        "Help me calculate confectionery syrup concentration balance."
      ],
      "retrieval_phrases": [
        "Confectionery syrup concentration balance",
        "confectionery syrup concentration balance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "500,500",
            "b": "80,20",
            "c": 200
          },
          "outputs": [
            {
              "label": "Conserved soluble solids (g)",
              "value": 500
            },
            {
              "label": "Final mixture mass (g)",
              "value": 800
            },
            {
              "label": "Modeled final solids (%)",
              "value": 62.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1532",
      "name": "Confectionery evaporation target",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Only water is removed; soluble solids are conserved and target concentration is at least initial concentration. Pure arithmetic, not a cooking or storage specification.",
      "url": "/calculators/confectionery-evaporation-target/",
      "version": "be3e145107d76d29043b3db6fa60173136fd5c2f21725e944583e28b653c06ad",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial mixture mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Initial soluble solids (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Target soluble solids (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Conserved solids (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Target final mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Water to remove (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Only water is removed; soluble solids are conserved and target concentration is at least initial concentration. Pure arithmetic, not a cooking or storage specification."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Conserved solids (g)",
          "text": "Multiply initial mass by initial solids fraction."
        },
        {
          "label": "Target final mass (g)",
          "text": "Divide conserved solids by target solids fraction."
        },
        {
          "label": "Water to remove (g)",
          "text": "Subtract target final mass from initial mass."
        }
      ],
      "example_questions": [
        "Use the Confectionery evaporation target calculator.",
        "Help me calculate confectionery evaporation target."
      ],
      "retrieval_phrases": [
        "Confectionery evaporation target",
        "confectionery evaporation target"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 40,
            "c": 80
          },
          "outputs": [
            {
              "label": "Conserved solids (g)",
              "value": 400
            },
            {
              "label": "Target final mass (g)",
              "value": 500
            },
            {
              "label": "Water to remove (g)",
              "value": 500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1533",
      "name": "Caramel batch yield audit",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Observed batch mass balance after cooking; all listed ingredients enter the weighed batch, with no additions after initial weighing.",
      "url": "/calculators/caramel-batch-yield-audit/",
      "version": "a3429c66b856de94adba821119ce8788215c40f4c2d9fd41ce7687451e5ca8f1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient masses (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured finished caramel mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target piece mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed mass loss (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Whole pieces",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remainder after portioning (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Observed batch mass balance after cooking; all listed ingredients enter the weighed batch, with no additions after initial weighing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed mass loss (%)",
          "text": "Divide input-to-finished mass loss by total ingredient mass."
        },
        {
          "label": "Whole pieces",
          "text": "Divide finished mass by piece mass and round down."
        },
        {
          "label": "Remainder after portioning (g)",
          "text": "Subtract whole-piece mass from finished batch."
        }
      ],
      "example_questions": [
        "Use the Caramel batch yield audit calculator.",
        "Help me calculate caramel batch yield audit."
      ],
      "retrieval_phrases": [
        "Caramel batch yield audit",
        "caramel batch yield audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "500,300,200",
            "b": 800,
            "c": 15
          },
          "outputs": [
            {
              "label": "Observed mass loss (%)",
              "value": 20
            },
            {
              "label": "Whole pieces",
              "value": 53
            },
            {
              "label": "Remainder after portioning (g)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1534",
      "name": "Fudge slab cutting layout",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Fixed-orientation rectangular cutting grid; cuts have negligible kerf. Coordinates are measured from original slab edges and list complete piece boundaries after trim.",
      "url": "/calculators/fudge-slab-cutting-layout/",
      "version": "c1806174e2a4fc18680be08d6c75cff631e1dde2b9b599779bd2b9a33ae3f74c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Slab width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Piece width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Edge trim each side (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Piece count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Width cut coordinates (cm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Depth cut coordinates (cm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed-orientation rectangular cutting grid; cuts have negligible kerf. Coordinates are measured from original slab edges and list complete piece boundaries after trim."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Piece count",
          "text": "Fit whole pieces along each trimmed dimension and multiply."
        },
        {
          "label": "Width cut coordinates (cm)",
          "text": "List width boundaries beginning at edge trim."
        },
        {
          "label": "Depth cut coordinates (cm)",
          "text": "List depth boundaries beginning at edge trim."
        }
      ],
      "example_questions": [
        "Use the Fudge slab cutting layout calculator.",
        "Help me calculate fudge slab cutting layout."
      ],
      "retrieval_phrases": [
        "Fudge slab cutting layout",
        "fudge slab cutting layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "24,18",
            "b": "4,3",
            "c": 0
          },
          "outputs": [
            {
              "label": "Piece count",
              "value": 36
            },
            {
              "label": "Width cut coordinates (cm)",
              "value": "0, 4, 8, 12, 16, 20, 24"
            },
            {
              "label": "Depth cut coordinates (cm)",
              "value": "0, 3, 6, 9, 12, 15, 18"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1535",
      "name": "Nougat inclusion allocation",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Percentages refer to final batch mass. Base remainder is everything other than listed inclusions, with no cooking loss or ingredient transformation model.",
      "url": "/calculators/nougat-inclusion-allocation/",
      "version": "2cdc7a28ddfb3f8e96ff072ea662d1fee3aebe2fc85307b2943a47959202bc1c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Finished nougat batch mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Nut inclusion (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fruit inclusion (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other inclusion (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Nut, fruit and other inclusions (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Base remainder (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Percentages refer to final batch mass. Base remainder is everything other than listed inclusions, with no cooking loss or ingredient transformation model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Nut, fruit and other inclusions (g)",
          "text": "Apply each inclusion percentage to target batch mass."
        },
        {
          "label": "Base remainder (g)",
          "text": "Subtract combined inclusion mass from finished batch mass."
        }
      ],
      "example_questions": [
        "Use the Nougat inclusion allocation calculator.",
        "Help me calculate nougat inclusion allocation."
      ],
      "retrieval_phrases": [
        "Nougat inclusion allocation",
        "nougat inclusion allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2000,
            "b": 30,
            "c": 20,
            "d": 5
          },
          "outputs": [
            {
              "label": "Nut, fruit and other inclusions (g)",
              "value": "600, 400, 100"
            },
            {
              "label": "Base remainder (g)",
              "value": 899.9999999999999
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1537",
      "name": "Confectionery coating pickup audit",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "All mass gain is attributed to coating. Waste includes coating consumed but not retained on these items; unused recoverable coating is excluded.",
      "url": "/calculators/confectionery-coating-pickup-audit/",
      "version": "7c2bb4cbaf0ae6093a3d2928cacfc3dc12a13c531f7448bc97023540449ebdf6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Item masses before coating (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Item masses after coating (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured coating waste (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Coating pickup by item (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Coating consumed including waste (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Coating utilization (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All mass gain is attributed to coating. Waste includes coating consumed but not retained on these items; unused recoverable coating is excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Coating pickup by item (g)",
          "text": "Subtract each uncoated item mass from coated mass."
        },
        {
          "label": "Coating consumed including waste (g)",
          "text": "Add retained coating and measured waste."
        },
        {
          "label": "Coating utilization (%)",
          "text": "Divide coating retained on items by total coating consumed."
        }
      ],
      "example_questions": [
        "Use the Confectionery coating pickup audit calculator.",
        "Help me calculate confectionery coating pickup audit."
      ],
      "retrieval_phrases": [
        "Confectionery coating pickup audit",
        "confectionery coating pickup audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30",
            "b": "12,24,36",
            "c": 3
          },
          "outputs": [
            {
              "label": "Coating pickup by item (g)",
              "value": "2, 4, 6"
            },
            {
              "label": "Coating consumed including waste (g)",
              "value": 15
            },
            {
              "label": "Coating utilization (%)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1538",
      "name": "Candy bag assortment allocation",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Fixed exact assortment recipe, no flavor substitutions. Produces as many complete bags as inventory and target allow; leftover stock is retained by flavor.",
      "url": "/calculators/candy-bag-assortment-allocation/",
      "version": "c9bfcbfda792a06c5741486f84a0670ce9bb81f166ccbea279c8fe676a7240a4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Flavor inventory counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Required pieces of each flavor per bag",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Target bags",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum complete bags from stock",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Bags to assemble",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Leftover pieces by flavor",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed exact assortment recipe, no flavor substitutions. Produces as many complete bags as inventory and target allow; leftover stock is retained by flavor."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum complete bags from stock",
          "text": "Find the limiting flavor inventory divided by its required count."
        },
        {
          "label": "Bags to assemble",
          "text": "Limit stock-supported output to the requested bag count."
        },
        {
          "label": "Leftover pieces by flavor",
          "text": "Subtract pieces consumed in complete assembled bags."
        }
      ],
      "example_questions": [
        "Use the Candy bag assortment allocation calculator.",
        "Help me calculate candy bag assortment allocation."
      ],
      "retrieval_phrases": [
        "Candy bag assortment allocation",
        "candy bag assortment allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,80,60",
            "b": "2,2,1",
            "c": 30
          },
          "outputs": [
            {
              "label": "Maximum complete bags from stock",
              "value": 40
            },
            {
              "label": "Bags to assemble",
              "value": 30
            },
            {
              "label": "Leftover pieces by flavor",
              "value": "40, 20, 30"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1539",
      "name": "Confectionery mold rotation throughput",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Steady-state capacity lower bound from full mold cycles and cooling occupancy. Full cycle already includes cooling; no startup or detailed queue schedule.",
      "url": "/calculators/confectionery-mold-rotation-throughput/",
      "version": "9aebaae07730e893afc1bf1315e46bbcc399e3b2d60507b38faa9a7d50ab2611",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Available molds",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Pieces per mold",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Full mold cycle duration (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Cooling slots for molds",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Cooling duration per mold (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mold-limited capacity (pieces/h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cooling-limited capacity (pieces/h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Steady-state capacity (pieces/h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Limiting resource",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady-state capacity lower bound from full mold cycles and cooling occupancy. Full cycle already includes cooling; no startup or detailed queue schedule."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mold-limited capacity (pieces/h)",
          "text": "Multiply molds and cavities by hourly complete-cycle frequency."
        },
        {
          "label": "Cooling-limited capacity (pieces/h)",
          "text": "Multiply cooling slots and cavities by hourly cooling cycles."
        },
        {
          "label": "Steady-state capacity (pieces/h)",
          "text": "Take the smaller capacity of molds and cooling slots."
        },
        {
          "label": "Limiting resource",
          "text": "Compare mold turnover capacity with cooling-slot turnover capacity."
        }
      ],
      "example_questions": [
        "Use the Confectionery mold rotation throughput calculator.",
        "Help me calculate confectionery mold rotation throughput."
      ],
      "retrieval_phrases": [
        "Confectionery mold rotation throughput",
        "confectionery mold rotation throughput"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 12,
            "c": 60,
            "d": 6,
            "e": 30
          },
          "outputs": [
            {
              "label": "Mold-limited capacity (pieces/h)",
              "value": 120
            },
            {
              "label": "Cooling-limited capacity (pieces/h)",
              "value": 144
            },
            {
              "label": "Steady-state capacity (pieces/h)",
              "value": 120
            },
            {
              "label": "Limiting resource",
              "value": "Molds"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1541",
      "name": "Confectionery rework blend limit",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Rework maximum is user supplied for this product and process. Final blend includes fresh batch plus added rework; no suitability or safety determination.",
      "url": "/calculators/confectionery-rework-blend-limit/",
      "version": "1a5ff952b71cb97032ac15f1d877e9b9aec9242e8ac7daedea1a09c1f6290229",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fresh batch mass (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Available rework mass (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplied maximum rework fraction of final blend (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum rework allowed by fraction (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rework to allocate (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Rework remaining (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Final blend mass (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rework maximum is user supplied for this product and process. Final blend includes fresh batch plus added rework; no suitability or safety determination."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum rework allowed by fraction (kg)",
          "text": "Solve rework divided by fresh-plus-rework less than or equal to the supplied fraction."
        },
        {
          "label": "Rework to allocate (kg)",
          "text": "Use the smaller of available rework and fraction-based maximum."
        },
        {
          "label": "Rework remaining (kg)",
          "text": "Subtract permitted allocation from stock."
        },
        {
          "label": "Final blend mass (kg)",
          "text": "Add allocated rework to fresh batch."
        }
      ],
      "example_questions": [
        "Use the Confectionery rework blend limit calculator.",
        "Help me calculate confectionery rework blend limit."
      ],
      "retrieval_phrases": [
        "Confectionery rework blend limit",
        "confectionery rework blend limit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 30,
            "c": 20
          },
          "outputs": [
            {
              "label": "Maximum rework allowed by fraction (kg)",
              "value": 20
            },
            {
              "label": "Rework to allocate (kg)",
              "value": 20
            },
            {
              "label": "Rework remaining (kg)",
              "value": 10
            },
            {
              "label": "Final blend mass (kg)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1542",
      "name": "Confectionery decorative transfer yield",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Fixed-orientation rectangular motif grid, spacing between motifs but no mandatory outside border. No rotated or irregular nesting.",
      "url": "/calculators/confectionery-decorative-transfer-yield/",
      "version": "aee1882c473c74950d7654c4f56d1a40be23c759b5ef39c141c1edef3375c43b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Transfer sheet width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Motif width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Spacing between motifs (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Motifs needed",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Motifs per sheet",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sheets required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused motif positions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed-orientation rectangular motif grid, spacing between motifs but no mandatory outside border. No rotated or irregular nesting."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Motifs per sheet",
          "text": "Fit motifs with spacing along both axes and multiply."
        },
        {
          "label": "Sheets required",
          "text": "Round motif demand divided by grid capacity up."
        },
        {
          "label": "Unused motif positions",
          "text": "Subtract motif demand from total available positions on needed sheets."
        }
      ],
      "example_questions": [
        "Use the Confectionery decorative transfer yield calculator.",
        "Help me calculate confectionery decorative transfer yield."
      ],
      "retrieval_phrases": [
        "Confectionery decorative transfer yield",
        "confectionery decorative transfer yield"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,20",
            "b": "5,4",
            "c": 1,
            "d": 50
          },
          "outputs": [
            {
              "label": "Motifs per sheet",
              "value": 20
            },
            {
              "label": "Sheets required",
              "value": 3
            },
            {
              "label": "Unused motif positions",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1544",
      "name": "Confectionery ingredient lot reconciliation",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Independent lot mass ledger; positive unaccounted material indicates unexplained consumption, negative indicates recorded outputs exceed issues.",
      "url": "/calculators/confectionery-ingredient-lot-reconciliation/",
      "version": "e26dd9138247052ed38caae5c271f45fdd5300686fa3d070f4e8ebb4ee75120a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient issued by lot (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Recorded production use by lot (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Returns to stock by lot (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Measured losses by lot (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unaccounted material by lot (kg)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total unexplained material (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Independent lot mass ledger; positive unaccounted material indicates unexplained consumption, negative indicates recorded outputs exceed issues."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unaccounted material by lot (kg)",
          "text": "Subtract production use, returns and measured losses from issued mass for each lot."
        },
        {
          "label": "Total unexplained material (kg)",
          "text": "Subtract all accounted uses from all issues."
        }
      ],
      "example_questions": [
        "Use the Confectionery ingredient lot reconciliation calculator.",
        "Help me calculate confectionery ingredient lot reconciliation."
      ],
      "retrieval_phrases": [
        "Confectionery ingredient lot reconciliation",
        "confectionery ingredient lot reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "50,30",
            "b": "40,20",
            "c": "5,7",
            "d": "2,1"
          },
          "outputs": [
            {
              "label": "Unaccounted material by lot (kg)",
              "value": "3, 2"
            },
            {
              "label": "Total unexplained material (kg)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1546",
      "name": "Confectionery festival stock scenario",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Expected demand, not a probability distribution. One conversion and basket-size assumption applies to each footfall scenario; product mixes are weighted shares.",
      "url": "/calculators/confectionery-festival-stock-scenario/",
      "version": "38349c7ff4b637b992ce9b6818d1c429e7d1bf7c608c31bb8459ffcf1b8b7f2b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Footfall scenarios (people)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Assumed purchase conversion (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Units per purchase",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Product mix weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected units by footfall scenario",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Product demand in final listed scenario",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Conversion-adjusted customers by scenario",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Expected demand, not a probability distribution. One conversion and basket-size assumption applies to each footfall scenario; product mixes are weighted shares."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected units by footfall scenario",
          "text": "Multiply footfall by conversion fraction and units per purchase."
        },
        {
          "label": "Product demand in final listed scenario",
          "text": "Allocate the final scenario demand across supplied product weights."
        },
        {
          "label": "Conversion-adjusted customers by scenario",
          "text": "Apply assumed purchase conversion to each footfall scenario."
        }
      ],
      "example_questions": [
        "Use the Confectionery festival stock scenario calculator.",
        "Help me calculate confectionery festival stock scenario."
      ],
      "retrieval_phrases": [
        "Confectionery festival stock scenario",
        "confectionery festival stock scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "500,1000,1500",
            "b": 10,
            "c": 2,
            "d": "3,2"
          },
          "outputs": [
            {
              "label": "Expected units by footfall scenario",
              "value": "100, 200, 300"
            },
            {
              "label": "Product demand in final listed scenario",
              "value": "180, 120"
            },
            {
              "label": "Conversion-adjusted customers by scenario",
              "value": "50, 100, 150"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1547",
      "name": "Confectionery tasting sampler cost",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Each visitor receives the supplied samples of every product. Ingredient cost is based on edible sample mass and excludes preparation labour unless included in event costs.",
      "url": "/calculators/confectionery-tasting-sampler-cost/",
      "version": "2bdfa49f413097a8a5ec4261943fad75a63eb90edfeeef2cfe6f1a78b164c612",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Visitors",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Samples per visitor by product",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Sample weight by product (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Ingredient cost by product (currency/kg)",
          "type": "array",
          "required": true,
          "unit": "currency/kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Other event costs",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sample counts by product",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sample mass by product (kg)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total sampler event cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each visitor receives the supplied samples of every product. Ingredient cost is based on edible sample mass and excludes preparation labour unless included in event costs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sample counts by product",
          "text": "Multiply visitors by samples per person."
        },
        {
          "label": "Sample mass by product (kg)",
          "text": "Multiply sample count by gram weight and convert to kilograms."
        },
        {
          "label": "Total sampler event cost",
          "text": "Price each product mass and add other event costs."
        }
      ],
      "example_questions": [
        "Use the Confectionery tasting sampler cost calculator.",
        "Help me calculate confectionery tasting sampler cost."
      ],
      "retrieval_phrases": [
        "Confectionery tasting sampler cost",
        "confectionery tasting sampler cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "1,2",
            "c": "5,3",
            "d": "20,10",
            "e": 25
          },
          "outputs": [
            {
              "label": "Sample counts by product",
              "value": "100, 200"
            },
            {
              "label": "Sample mass by product (kg)",
              "value": "0.5, 0.6"
            },
            {
              "label": "Total sampler event cost",
              "value": 41
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1548",
      "name": "Confectionery production humidity log",
      "category": "Chocolate and confectionery production",
      "status": "available",
      "purpose": "Piecewise constant observations with user-supplied supplier band; not a process or storage recommendation. Each reading represents the following supplied interval.",
      "url": "/calculators/confectionery-production-humidity-log/",
      "version": "0c2d8d463d632b6b46a06b1474d90aea8112184dcd60cfc903b16a6ec6edd465",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Humidity readings (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Interval durations represented (h)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Supplier working-band lower bound (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplier working-band upper bound (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Time below band (h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Time above band (h)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Duration-weighted average humidity (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Piecewise constant observations with user-supplied supplier band; not a process or storage recommendation. Each reading represents the following supplied interval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Time below band (h)",
          "text": "Add intervals whose reading is below the lower bound."
        },
        {
          "label": "Time above band (h)",
          "text": "Add intervals whose reading exceeds upper bound."
        },
        {
          "label": "Duration-weighted average humidity (%)",
          "text": "Weight each reading by represented time and divide by total time."
        }
      ],
      "example_questions": [
        "Use the Confectionery production humidity log calculator.",
        "Help me calculate confectionery production humidity log."
      ],
      "retrieval_phrases": [
        "Confectionery production humidity log",
        "confectionery production humidity log"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,50,70",
            "b": "1,2,1",
            "c": 45,
            "d": 60
          },
          "outputs": [
            {
              "label": "Time below band (h)",
              "value": 1
            },
            {
              "label": "Time above band (h)",
              "value": 1
            },
            {
              "label": "Duration-weighted average humidity (%)",
              "value": 52.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1579",
      "name": "Restaurant kitchen station workload",
      "category": "Restaurant operating workflows",
      "status": "available",
      "purpose": "Two kitchen stations, each with pooled staff whose work can be divided evenly. All dish orders pass through both stations using supplied measured times; no task dependencies or queue timing.",
      "url": "/calculators/restaurant-kitchen-station-workload/",
      "version": "f70a10fefcbe8580aa2df81acf9212d371461553215235bbdfcd9e9169110c20",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Dish order counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Station 1 minutes per dish",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Station 2 minutes per dish",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Station 1 staff",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Station 2 staff",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "g",
          "label": "Service window (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Station demand (staff-minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Station utilization (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Bottleneck station",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Two kitchen stations, each with pooled staff whose work can be divided evenly. All dish orders pass through both stations using supplied measured times; no task dependencies or queue timing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Station demand (staff-minutes)",
          "text": "Multiply dish counts by each station’s per-dish work and add."
        },
        {
          "label": "Station utilization (%)",
          "text": "Divide station work by staff count times service window."
        },
        {
          "label": "Bottleneck station",
          "text": "Compare workload per staff member across the two stations."
        }
      ],
      "example_questions": [
        "Use the Restaurant kitchen station workload calculator.",
        "Help me calculate restaurant kitchen station workload."
      ],
      "retrieval_phrases": [
        "Restaurant kitchen station workload",
        "restaurant kitchen station workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,10",
            "b": "2,4",
            "c": "3,1",
            "d": 2,
            "e": 1,
            "g": 60
          },
          "outputs": [
            {
              "label": "Station demand (staff-minutes)",
              "value": "80, 70"
            },
            {
              "label": "Station utilization (%)",
              "value": "66.666667, 116.666667"
            },
            {
              "label": "Bottleneck station",
              "value": "Station 2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1581",
      "name": "Restaurant menu contribution map",
      "category": "Restaurant operating workflows",
      "status": "available",
      "purpose": "Compares one competing menu group. High popularity means sales share strictly above 70% of equal-share expectation; high contribution means unit contribution strictly above sales-weighted average. Equal thresholds are classified low.",
      "url": "/calculators/restaurant-menu-contribution-map/",
      "version": "fe3519cf5178f172715c271f93c0204026d25df12debddcf0e3b0b219010a7b6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Item units sold",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Selling prices",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Variable costs per item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unit contribution by item",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sales-weighted average unit contribution",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Popularity/contribution quadrant by item",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares one competing menu group. High popularity means sales share strictly above 70% of equal-share expectation; high contribution means unit contribution strictly above sales-weighted average. Equal thresholds are classified low."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unit contribution by item",
          "text": "Subtract variable cost from selling price for each item."
        },
        {
          "label": "Sales-weighted average unit contribution",
          "text": "Divide total contribution by total items sold."
        },
        {
          "label": "Popularity/contribution quadrant by item",
          "text": "Compare sales share and unit contribution with the stated group benchmarks."
        }
      ],
      "example_questions": [
        "Use the Restaurant menu contribution map calculator.",
        "Help me calculate restaurant menu contribution map."
      ],
      "retrieval_phrases": [
        "Restaurant menu contribution map",
        "restaurant menu contribution map"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50,10",
            "b": "10,12,15",
            "c": "6,5,5"
          },
          "outputs": [
            {
              "label": "Unit contribution by item",
              "value": "4, 7, 10"
            },
            {
              "label": "Sales-weighted average unit contribution",
              "value": 5.3125
            },
            {
              "label": "Popularity/contribution quadrant by item",
              "value": "High popularity / low contribution, High popularity / high contribution, Low popularity / high contribution"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1583",
      "name": "Restaurant ticket time percentiles",
      "category": "Restaurant operating workflows",
      "status": "available",
      "purpose": "Matched timestamps use one continuous origin, allowing shifts past midnight. Reports overall R7 interpolated median and 90th percentile, plus mean ticket time by supplied service-period identifier.",
      "url": "/calculators/restaurant-ticket-time-percentiles/",
      "version": "d28e3b73026f5a46ad1c8854fdafc9c54499eac61b13cdc1f4796810985d353a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Order times (minutes from common start)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Completion times (minutes from common start)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Service-period numeric identifiers",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Median ticket time (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "90th-percentile ticket time (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Mean by period in ascending code order (min)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Matched timestamps use one continuous origin, allowing shifts past midnight. Reports overall R7 interpolated median and 90th percentile, plus mean ticket time by supplied service-period identifier."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Median ticket time (min)",
          "text": "Sort durations and linearly interpolate at zero-based position 0.5 times n minus one."
        },
        {
          "label": "90th-percentile ticket time (min)",
          "text": "Use R7 linear interpolation at zero-based position 0.9 times n minus one."
        },
        {
          "label": "Mean by period in ascending code order (min)",
          "text": "Group observed durations by service-period identifier and average each group."
        }
      ],
      "example_questions": [
        "Use the Restaurant ticket time percentiles calculator.",
        "Help me calculate restaurant ticket time percentiles."
      ],
      "retrieval_phrases": [
        "Restaurant ticket time percentiles",
        "restaurant ticket time percentiles"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,5,10,15",
            "b": "10,25,40,55",
            "c": "1,1,2,2"
          },
          "outputs": [
            {
              "label": "Median ticket time (min)",
              "value": 25
            },
            {
              "label": "90th-percentile ticket time (min)",
              "value": 37
            },
            {
              "label": "Mean by period in ascending code order (min)",
              "value": "15, 35"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1585",
      "name": "Restaurant plate return waste audit",
      "category": "Restaurant operating workflows",
      "status": "available",
      "purpose": "Mass audit of comparable served and returned food; estimated wasted food cost is proportional to mass and excludes plate, packaging and inedible components.",
      "url": "/calculators/restaurant-plate-return-waste-audit/",
      "version": "9aaf5c4e3e5ddfd491b9c08ecf9bbe5c55eceea90c81f787f445c94d4d035d61",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Served food mass by menu item (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Returned uneaten mass by item (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Food cost by item (currency/kg)",
          "type": "array",
          "required": true,
          "unit": "currency/kg",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Returned waste by item (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Waste ingredient cost by item",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total returned waste cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Mass audit of comparable served and returned food; estimated wasted food cost is proportional to mass and excludes plate, packaging and inedible components."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Returned waste by item (%)",
          "text": "Divide returned uneaten mass by served mass for each item."
        },
        {
          "label": "Waste ingredient cost by item",
          "text": "Multiply each returned mass by its food cost per kilogram."
        },
        {
          "label": "Total returned waste cost",
          "text": "Add estimated returned food cost across menu items."
        }
      ],
      "example_questions": [
        "Use the Restaurant plate return waste audit calculator.",
        "Help me calculate restaurant plate return waste audit."
      ],
      "retrieval_phrases": [
        "Restaurant plate return waste audit",
        "restaurant plate return waste audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,8",
            "b": "2,1",
            "c": "5,10"
          },
          "outputs": [
            {
              "label": "Returned waste by item (%)",
              "value": "20, 12.5"
            },
            {
              "label": "Waste ingredient cost by item",
              "value": "10, 10"
            },
            {
              "label": "Total returned waste cost",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1586",
      "name": "Restaurant fryer oil cost ledger",
      "category": "Restaurant operating workflows",
      "status": "available",
      "purpose": "Accounting-period volume ledger; oil not disposed or remaining is labeled absorbed/unaccounted, not necessarily all food absorption. Purchases are charged when added.",
      "url": "/calculators/restaurant-fryer-oil-cost-ledger/",
      "version": "8803676533738c5e0285082737490d20571498321eab61fddbaa54b04bdaadc8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial oil fill (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Oil top-ups during period (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured disposed oil (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Oil remaining in fryer at end (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Oil price (currency/L)",
          "type": "number",
          "required": true,
          "unit": "currency/L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Food output (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "h",
          "label": "Disposal fee (currency/L)",
          "type": "number",
          "required": true,
          "unit": "currency/L",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Oil supplied in period (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Absorbed or unaccounted oil (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Oil and disposal cost per kg output",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Accounting-period volume ledger; oil not disposed or remaining is labeled absorbed/unaccounted, not necessarily all food absorption. Purchases are charged when added."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Oil supplied in period (L)",
          "text": "Add initial fill and all top-ups."
        },
        {
          "label": "Absorbed or unaccounted oil (L)",
          "text": "Subtract disposed and retained end volume from supplied oil."
        },
        {
          "label": "Oil and disposal cost per kg output",
          "text": "Add supplied-oil purchase and disposal charges, then divide by food output."
        }
      ],
      "example_questions": [
        "Use the Restaurant fryer oil cost ledger calculator.",
        "Help me calculate restaurant fryer oil cost ledger."
      ],
      "retrieval_phrases": [
        "Restaurant fryer oil cost ledger",
        "restaurant fryer oil cost ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": "2,3",
            "c": 18,
            "d": 5,
            "e": 2,
            "g": 100,
            "h": 0.1
          },
          "outputs": [
            {
              "label": "Oil supplied in period (L)",
              "value": 25
            },
            {
              "label": "Absorbed or unaccounted oil (L)",
              "value": 2
            },
            {
              "label": "Oil and disposal cost per kg output",
              "value": 0.518
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1594",
      "name": "Restaurant delivery commission mix",
      "category": "Restaurant operating workflows",
      "status": "available",
      "purpose": "Commission applies to food revenue only; packaging, food cost and fixed channel fees are subtracted. Taxes, tips and unlisted labour are excluded.",
      "url": "/calculators/restaurant-delivery-commission-mix/",
      "version": "37e4366322a9ab9f6ca793c32c67304c68d2eabd9170a364e1fe23a6a8d9bd00",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Orders by sales channel",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Average food revenue per order by channel",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Commission by channel (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Packaging cost per order by channel",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Food cost per order by channel",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "g",
          "label": "Fixed channel fees",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net contribution by channel",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total net contribution",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Gross revenue by channel",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Commission applies to food revenue only; packaging, food cost and fixed channel fees are subtracted. Taxes, tips and unlisted labour are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net contribution by channel",
          "text": "For each channel subtract commission and per-order variable costs, then fixed fees."
        },
        {
          "label": "Total net contribution",
          "text": "Sum channel contributions."
        },
        {
          "label": "Gross revenue by channel",
          "text": "Multiply channel order count by average order revenue."
        }
      ],
      "example_questions": [
        "Use the Restaurant delivery commission mix calculator.",
        "Help me calculate restaurant delivery commission mix."
      ],
      "retrieval_phrases": [
        "Restaurant delivery commission mix",
        "restaurant delivery commission mix"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "20,25",
            "c": "0,20",
            "d": "1,2",
            "e": "8,10",
            "g": "0,50"
          },
          "outputs": [
            {
              "label": "Net contribution by channel",
              "value": "1100, 350"
            },
            {
              "label": "Total net contribution",
              "value": 1450
            },
            {
              "label": "Gross revenue by channel",
              "value": "2000, 1250"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1599",
      "name": "Restaurant shift handover task budget",
      "category": "Restaurant operating workflows",
      "status": "available",
      "purpose": "Workload capacity model assumes tasks can be divided among available staff without dependencies; it gives a minimum overlap by staff-minutes, not a detailed indivisible-task schedule.",
      "url": "/calculators/restaurant-shift-handover-task-budget/",
      "version": "31c9217f21de2f088f4ede7256f080b60da7318052f8af4eb037966cf1c069fb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured handover task work (staff-minutes)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Staff available during handover",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Scheduled overlap (min)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total handover workload (staff-minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minimum overlap from workload (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Uncovered work (staff-minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Extra overlap needed (min)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Workload capacity model assumes tasks can be divided among available staff without dependencies; it gives a minimum overlap by staff-minutes, not a detailed indivisible-task schedule."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total handover workload (staff-minutes)",
          "text": "Sum measured work across handover tasks."
        },
        {
          "label": "Minimum overlap from workload (min)",
          "text": "Divide total work by available staff."
        },
        {
          "label": "Uncovered work (staff-minutes)",
          "text": "Subtract available staff-minutes from required work."
        },
        {
          "label": "Extra overlap needed (min)",
          "text": "Subtract scheduled overlap from workload-based minimum."
        }
      ],
      "example_questions": [
        "Use the Restaurant shift handover task budget calculator.",
        "Help me calculate restaurant shift handover task budget."
      ],
      "retrieval_phrases": [
        "Restaurant shift handover task budget",
        "restaurant shift handover task budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,15,5",
            "b": 2,
            "c": 10
          },
          "outputs": [
            {
              "label": "Total handover workload (staff-minutes)",
              "value": 30
            },
            {
              "label": "Minimum overlap from workload (min)",
              "value": 15
            },
            {
              "label": "Uncovered work (staff-minutes)",
              "value": 10
            },
            {
              "label": "Extra overlap needed (min)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1602",
      "name": "Cafe milk steaming waste audit",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Each row represents the same batch. Unreconciled milk can include retained milk or measurement loss.",
      "url": "/calculators/cafe-milk-steaming-waste-audit/",
      "version": "0acb2350c12f937df498575ff85ffee366c8d3b109f01f41033d7cc6c331af49",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Milk poured by batch (mL)",
          "type": "array",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Milk served by batch (mL)",
          "type": "array",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Milk discarded by batch (mL)",
          "type": "array",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Usable yield (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Recorded waste (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unreconciled milk (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each row represents the same batch. Unreconciled milk can include retained milk or measurement loss."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Usable yield (%)",
          "text": "Divide served milk by poured milk."
        },
        {
          "label": "Recorded waste (mL)",
          "text": "Add measured discard."
        },
        {
          "label": "Unreconciled milk (mL)",
          "text": "Subtract served and discarded milk from poured milk."
        }
      ],
      "example_questions": [
        "Use the Cafe milk steaming waste audit calculator.",
        "Help me calculate cafe milk steaming waste audit."
      ],
      "retrieval_phrases": [
        "Cafe milk steaming waste audit",
        "cafe milk steaming waste audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "500,600",
            "b": "400,450",
            "c": "80,100"
          },
          "outputs": [
            {
              "label": "Usable yield (%)",
              "value": 77.27272727272727
            },
            {
              "label": "Recorded waste (mL)",
              "value": 180
            },
            {
              "label": "Unreconciled milk (mL)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1605",
      "name": "Cafe takeaway packaging forecast",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "One cup and one sleeve per drink. Each multi-drink order gets one carrier of its exact size; single drinks use none.",
      "url": "/calculators/cafe-takeaway-packaging-forecast/",
      "version": "cc7975bc0329a06f8d8ecc1d204f5e7915765b75a6ceafc38466ea656ea86aa2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Single-drink takeaway orders",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Two-drink takeaway orders",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Four-drink takeaway orders",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Packaging spare allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cups and sleeves each (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Two-cup carriers (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Four-cup carriers (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One cup and one sleeve per drink. Each multi-drink order gets one carrier of its exact size; single drinks use none."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cups and sleeves each (units)",
          "text": "Count drinks and round up the spare allowance."
        },
        {
          "label": "Two-cup carriers (units)",
          "text": "Allocate one carrier to every two-drink order plus spares."
        },
        {
          "label": "Four-cup carriers (units)",
          "text": "Allocate one carrier to every four-drink order plus spares."
        }
      ],
      "example_questions": [
        "Use the Cafe takeaway packaging forecast calculator.",
        "Help me calculate cafe takeaway packaging forecast."
      ],
      "retrieval_phrases": [
        "Cafe takeaway packaging forecast",
        "cafe takeaway packaging forecast"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 40,
            "c": 10,
            "d": 10
          },
          "outputs": [
            {
              "label": "Cups and sleeves each (units)",
              "value": 242
            },
            {
              "label": "Two-cup carriers (units)",
              "value": 44
            },
            {
              "label": "Four-cup carriers (units)",
              "value": 11
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1606",
      "name": "Cafe grinder retention purge ledger",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Additional purge excludes measured retention, avoiding double counting. All retained coffee is treated as discarded.",
      "url": "/calculators/cafe-grinder-retention-purge-ledger/",
      "version": "fa98ec7c6a4946316e238e0eccd0d575050e0e8653ca996e76c93df7ec26ba5a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured grinder retention (g/changeover)",
          "type": "number",
          "required": true,
          "unit": "g/changeover",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Blend changeovers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Additional purge (g/changeover)",
          "type": "number",
          "required": true,
          "unit": "g/changeover",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Coffee purchase price (currency/kg)",
          "type": "number",
          "required": true,
          "unit": "currency/kg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Retained coffee loss (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total purge and retention loss (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Coffee loss cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Additional purge excludes measured retention, avoiding double counting. All retained coffee is treated as discarded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Retained coffee loss (g)",
          "text": "Multiply retained mass by changeovers."
        },
        {
          "label": "Total purge and retention loss (g)",
          "text": "Add additional purge and retained mass per changeover."
        },
        {
          "label": "Coffee loss cost (currency)",
          "text": "Convert grams to kilograms and multiply by purchase price."
        }
      ],
      "example_questions": [
        "Use the Cafe grinder retention purge ledger calculator.",
        "Help me calculate cafe grinder retention purge ledger."
      ],
      "retrieval_phrases": [
        "Cafe grinder retention purge ledger",
        "cafe grinder retention purge ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 10,
            "c": 6,
            "d": 20
          },
          "outputs": [
            {
              "label": "Retained coffee loss (g)",
              "value": 40
            },
            {
              "label": "Total purge and retention loss (g)",
              "value": 100
            },
            {
              "label": "Coffee loss cost (currency)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1608",
      "name": "Cafe espresso shot cost audit",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Coffee-only cost audit; equal allocation per drink is shown alongside actual single/double dose use.",
      "url": "/calculators/cafe-espresso-shot-cost-audit/",
      "version": "27d670c72ae06275c428e57f55911027225bd34ce08b5f992c75270f3e82ef15",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Served single-shot drinks",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Served double-shot drinks",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Dose per shot (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Coffee discarded in purges (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Bean price (currency/kg)",
          "type": "number",
          "required": true,
          "unit": "currency/kg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total coffee used (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Coffee cost per served drink (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Purge share of coffee (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Coffee-only cost audit; equal allocation per drink is shown alongside actual single/double dose use."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total coffee used (g)",
          "text": "Add shot doses and separately measured purge."
        },
        {
          "label": "Coffee cost per served drink (currency)",
          "text": "Allocate total coffee cost equally across served drinks."
        },
        {
          "label": "Purge share of coffee (%)",
          "text": "Divide purge mass by total coffee use."
        }
      ],
      "example_questions": [
        "Use the Cafe espresso shot cost audit calculator.",
        "Help me calculate cafe espresso shot cost audit."
      ],
      "retrieval_phrases": [
        "Cafe espresso shot cost audit",
        "cafe espresso shot cost audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 20,
            "c": 10,
            "d": 200,
            "e": 25
          },
          "outputs": [
            {
              "label": "Total coffee used (g)",
              "value": 1400
            },
            {
              "label": "Coffee cost per served drink (currency)",
              "value": 0.35
            },
            {
              "label": "Purge share of coffee (%)",
              "value": 14.285714285714286
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1609",
      "name": "Cafe cold brew concentrate dilution",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Assumes additive volumes, like-for-like strength measurements and zero-strength diluent. Excludes ice and shelf-life decisions.",
      "url": "/calculators/cafe-cold-brew-concentrate-dilution/",
      "version": "8126aa161c7f686af0b28ed28a5401d142ee75ffdb150837e6e1688f97961e37",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Concentrate strength (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target beverage strength (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Serving liquid volume (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Number of servings",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Concentrate per serving (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Diluent per serving (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Batch concentrate (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Batch diluent (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes additive volumes, like-for-like strength measurements and zero-strength diluent. Excludes ice and shelf-life decisions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Concentrate per serving (mL)",
          "text": "Preserve dissolved-solids mass in additive liquid volumes."
        },
        {
          "label": "Diluent per serving (mL)",
          "text": "Subtract concentrate from serving volume."
        },
        {
          "label": "Batch concentrate (L)",
          "text": "Scale concentrate by servings and convert to litres."
        },
        {
          "label": "Batch diluent (L)",
          "text": "Scale diluent by servings and convert to litres."
        }
      ],
      "example_questions": [
        "Use the Cafe cold brew concentrate dilution calculator.",
        "Help me calculate cafe cold brew concentrate dilution."
      ],
      "retrieval_phrases": [
        "Cafe cold brew concentrate dilution",
        "cafe cold brew concentrate dilution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 8,
            "b": 2,
            "c": 300,
            "d": 10
          },
          "outputs": [
            {
              "label": "Concentrate per serving (mL)",
              "value": 75
            },
            {
              "label": "Diluent per serving (mL)",
              "value": 225
            },
            {
              "label": "Batch concentrate (L)",
              "value": 0.75
            },
            {
              "label": "Batch diluent (L)",
              "value": 2.25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1612",
      "name": "Cafe pastry pairing attachment",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Expected quantities may be fractional; assumes at most one pastry per attached drink and no replenishment beyond reserve.",
      "url": "/calculators/cafe-pastry-pairing-attachment/",
      "version": "3dee02c913cd2235bafb6eee1100494278ebc8228e98721e6ccab09a23754cc1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Forecast drink orders",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected pastry attachment (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pastries initially displayed",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reserve pastry stock",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected pastry demand",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected pastry sales",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Display replenishment required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Expected unsold pastries",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Expected quantities may be fractional; assumes at most one pastry per attached drink and no replenishment beyond reserve."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected pastry demand",
          "text": "Multiply drinks by assumed pastry attachment."
        },
        {
          "label": "Expected pastry sales",
          "text": "Cap demand at total available pastry stock."
        },
        {
          "label": "Display replenishment required",
          "text": "Use reserve stock only after display stock is exhausted."
        },
        {
          "label": "Expected unsold pastries",
          "text": "Subtract scenario demand from total stock, floored at zero."
        }
      ],
      "example_questions": [
        "Use the Cafe pastry pairing attachment calculator.",
        "Help me calculate cafe pastry pairing attachment."
      ],
      "retrieval_phrases": [
        "Cafe pastry pairing attachment",
        "cafe pastry pairing attachment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 30,
            "c": 50,
            "d": 20
          },
          "outputs": [
            {
              "label": "Expected pastry demand",
              "value": 60
            },
            {
              "label": "Expected pastry sales",
              "value": 60
            },
            {
              "label": "Display replenishment required",
              "value": 10
            },
            {
              "label": "Expected unsold pastries",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1613",
      "name": "Cafe loyalty stamp redemption cost",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Steady-state expectation; one stamp per paid visit, no stamps on rewards and no stamp expiry.",
      "url": "/calculators/cafe-loyalty-stamp-redemption-cost/",
      "version": "5577209de4421fee958e564cc56279417404b3e3537629f9318e063b20c6ed93",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Paid visits per customer per month",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Stamps needed for one reward",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Reward fulfillment cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Expected redemption (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Rewards earned per customer-month",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected reward cost per customer-month",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected reward cost per paid visit",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady-state expectation; one stamp per paid visit, no stamps on rewards and no stamp expiry."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Rewards earned per customer-month",
          "text": "Divide paid visits by stamps required."
        },
        {
          "label": "Expected reward cost per customer-month",
          "text": "Apply redemption probability and reward cost."
        },
        {
          "label": "Expected reward cost per paid visit",
          "text": "Allocate expected redemption cost across earning visits."
        }
      ],
      "example_questions": [
        "Use the Cafe loyalty stamp redemption cost calculator.",
        "Help me calculate cafe loyalty stamp redemption cost."
      ],
      "retrieval_phrases": [
        "Cafe loyalty stamp redemption cost",
        "cafe loyalty stamp redemption cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 5,
            "c": 2,
            "d": 80
          },
          "outputs": [
            {
              "label": "Rewards earned per customer-month",
              "value": 2
            },
            {
              "label": "Expected reward cost per customer-month",
              "value": 3.2
            },
            {
              "label": "Expected reward cost per paid visit",
              "value": 0.32
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1614",
      "name": "Cafe mobile order pickup slots",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Identical orders with divisible staff effort; simultaneous equipment limits and queues between slots are excluded.",
      "url": "/calculators/cafe-mobile-order-pickup-slots/",
      "version": "bd26ac45ef0452b114210e7cfc3147655cd5ad91b87d73412a39527ec0c6a8cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Orders per pickup slot",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Active preparation (minutes/order)",
          "type": "number",
          "required": true,
          "unit": "minutes/order",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Staff preparing orders",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Pickup slot length (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Whole-order slot capacity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Workload utilization (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Orders beyond slot capacity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Identical orders with divisible staff effort; simultaneous equipment limits and queues between slots are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Whole-order slot capacity",
          "text": "Divide staff-minutes by work per order and round down."
        },
        {
          "label": "Workload utilization (%)",
          "text": "Compare required staff-minutes with available staff-minutes."
        },
        {
          "label": "Orders beyond slot capacity",
          "text": "Subtract whole-order capacity from assigned orders."
        }
      ],
      "example_questions": [
        "Use the Cafe mobile order pickup slots calculator.",
        "Help me calculate cafe mobile order pickup slots."
      ],
      "retrieval_phrases": [
        "Cafe mobile order pickup slots",
        "cafe mobile order pickup slots"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 3,
            "c": 2,
            "d": 15
          },
          "outputs": [
            {
              "label": "Whole-order slot capacity",
              "value": 10
            },
            {
              "label": "Workload utilization (%)",
              "value": 120
            },
            {
              "label": "Orders beyond slot capacity",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1615",
      "name": "Cafe reusable cup deposit ledger",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Uniform deposit, all returned cups refunded and washed; excludes forfeitures, broken cups and prior deposit-rate changes.",
      "url": "/calculators/cafe-reusable-cup-deposit-ledger/",
      "version": "624238b1a7c5694a8811b4cd345b46da9d7ad3f3c06b8ee2e026a007c13b0944",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cups issued in period",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cups returned in period",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Opening cups outstanding",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Deposit per cup (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Wash capacity (cups/hour)",
          "type": "number",
          "required": true,
          "unit": "cups/hour",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Closing outstanding cups",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Closing refundable deposits (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Hours to wash returned cups",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform deposit, all returned cups refunded and washed; excludes forfeitures, broken cups and prior deposit-rate changes."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Closing outstanding cups",
          "text": "Roll forward opening cups with issue and return counts."
        },
        {
          "label": "Closing refundable deposits (currency)",
          "text": "Apply the same deposit to all outstanding cups."
        },
        {
          "label": "Hours to wash returned cups",
          "text": "Divide returned cups by measured wash throughput."
        }
      ],
      "example_questions": [
        "Use the Cafe reusable cup deposit ledger calculator.",
        "Help me calculate cafe reusable cup deposit ledger."
      ],
      "retrieval_phrases": [
        "Cafe reusable cup deposit ledger",
        "cafe reusable cup deposit ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 80,
            "c": 20,
            "d": 3,
            "e": 40
          },
          "outputs": [
            {
              "label": "Closing outstanding cups",
              "value": 40
            },
            {
              "label": "Closing refundable deposits (currency)",
              "value": 120
            },
            {
              "label": "Hours to wash returned cups",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1616",
      "name": "Cafe seating revenue-hour comparison",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Each row describes one occupied table visit. Empty table time is excluded.",
      "url": "/calculators/cafe-seating-revenue-hour-comparison/",
      "version": "a96415de93d2211c8c712bdc63eeb8d04ca1cad3fe9cc82bd93f7be3ce1dc621",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Receipts by table (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Occupied seats by table",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Occupied duration by table (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total occupied seat-hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Receipts per occupied seat-hour (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Table rates (currency/seat-hour)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each row describes one occupied table visit. Empty table time is excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total occupied seat-hours",
          "text": "Multiply each table seat count by occupied duration."
        },
        {
          "label": "Receipts per occupied seat-hour (currency)",
          "text": "Divide receipts by total occupied seat-hours."
        },
        {
          "label": "Table rates (currency/seat-hour)",
          "text": "Compute each table receipt per occupied seat-hour."
        }
      ],
      "example_questions": [
        "Use the Cafe seating revenue-hour comparison calculator.",
        "Help me calculate cafe seating revenue-hour comparison."
      ],
      "retrieval_phrases": [
        "Cafe seating revenue-hour comparison",
        "cafe seating revenue hour comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "60,40",
            "b": "3,2",
            "c": "60,120"
          },
          "outputs": [
            {
              "label": "Total occupied seat-hours",
              "value": 7
            },
            {
              "label": "Receipts per occupied seat-hour (currency)",
              "value": 14.285714285714286
            },
            {
              "label": "Table rates (currency/seat-hour)",
              "value": "20, 10"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1617",
      "name": "Cafe outlet seat demand",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Aggregate compatibility audit assuming seats can be reassigned; does not claim actual free outlets without seating-location data.",
      "url": "/calculators/cafe-outlet-seat-demand/",
      "version": "150f0755bf33a2cebfaadcec50078b7c84b72464bef30ea3c5e993cc1009bc73",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total cafe seats",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Outlet-equipped seats",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Current seated customers",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Customers requiring an outlet",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Outlet seat shortage",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total vacant seats",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Outlet provision (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Aggregate compatibility audit assuming seats can be reassigned; does not claim actual free outlets without seating-location data."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Outlet seat shortage",
          "text": "Compare outlet demand with outlet-equipped seats."
        },
        {
          "label": "Total vacant seats",
          "text": "Subtract seated customers from all seats."
        },
        {
          "label": "Outlet provision (%)",
          "text": "Express outlet-equipped seats as a share of all seats."
        }
      ],
      "example_questions": [
        "Use the Cafe outlet seat demand calculator.",
        "Help me calculate cafe outlet seat demand."
      ],
      "retrieval_phrases": [
        "Cafe outlet seat demand",
        "cafe outlet seat demand"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 12,
            "c": 30,
            "d": 18
          },
          "outputs": [
            {
              "label": "Outlet seat shortage",
              "value": 6
            },
            {
              "label": "Total vacant seats",
              "value": 10
            },
            {
              "label": "Outlet provision (%)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1618",
      "name": "Cafe brew water filter budget",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Volume-only procurement model. Supplier calendar limits and measured water-quality conditions can require earlier replacement.",
      "url": "/calculators/cafe-brew-water-filter-budget/",
      "version": "f4aa41f6935614dd657280a765a38027b02610fac0816038054729ae53ebfc51",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Metered brew-water use (L/day)",
          "type": "number",
          "required": true,
          "unit": "L/day",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Supplier rated cartridge capacity (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Cartridge purchase cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Planned operating days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume-based interval (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cartridges needed from empty inventory",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Treatment consumable cost (currency/L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Volume-only procurement model. Supplier calendar limits and measured water-quality conditions can require earlier replacement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume-based interval (days)",
          "text": "Divide supplied rated capacity by daily water use."
        },
        {
          "label": "Cartridges needed from empty inventory",
          "text": "Round up total volume divided by cartridge capacity."
        },
        {
          "label": "Treatment consumable cost (currency/L)",
          "text": "Spread cartridge price over its rated volume."
        }
      ],
      "example_questions": [
        "Use the Cafe brew water filter budget calculator.",
        "Help me calculate cafe brew water filter budget."
      ],
      "retrieval_phrases": [
        "Cafe brew water filter budget",
        "cafe brew water filter budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 10000,
            "c": 100,
            "d": 120
          },
          "outputs": [
            {
              "label": "Volume-based interval (days)",
              "value": 50
            },
            {
              "label": "Cartridges needed from empty inventory",
              "value": 3
            },
            {
              "label": "Treatment consumable cost (currency/L)",
              "value": 0.01
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1619",
      "name": "Cafe delivery platform settlement",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "All inputs share one settlement period. Commission is contractually assessed after refunds; tax and fee adjustments must be included in supplied fees.",
      "url": "/calculators/cafe-delivery-platform-settlement/",
      "version": "4ba13aa4dffa123c03454bf9142d9fec3115a2c4c9fb3b2c39e78dae8d95f20f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gross platform orders (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Refunded sales (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Commission on net sales (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other supplied platform fees (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Actual payout received (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net sales (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected payout (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Actual minus expected payout (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All inputs share one settlement period. Commission is contractually assessed after refunds; tax and fee adjustments must be included in supplied fees."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net sales (currency)",
          "text": "Deduct refunded sales from gross orders."
        },
        {
          "label": "Expected payout (currency)",
          "text": "Deduct commission on post-refund sales and other fees."
        },
        {
          "label": "Actual minus expected payout (currency)",
          "text": "Compare bank receipt with calculated settlement."
        }
      ],
      "example_questions": [
        "Use the Cafe delivery platform settlement calculator.",
        "Help me calculate cafe delivery platform settlement."
      ],
      "retrieval_phrases": [
        "Cafe delivery platform settlement",
        "cafe delivery platform settlement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 100,
            "c": 20,
            "d": 30,
            "e": 680
          },
          "outputs": [
            {
              "label": "Net sales (currency)",
              "value": 900
            },
            {
              "label": "Expected payout (currency)",
              "value": 690
            },
            {
              "label": "Actual minus expected payout (currency)",
              "value": -10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1622",
      "name": "Cafe iced drink displacement",
      "category": "Coffee shop production and service",
      "status": "available",
      "purpose": "Uses measured displacement, not ice mass or loose bulk volume. Recipe parts are volumetric; later melting is excluded.",
      "url": "/calculators/cafe-iced-drink-displacement/",
      "version": "c369580065a0b3f4b23e169ac898e0327d2592663eaa5eedaff4e923aeb04d24",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Usable cup volume (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured ice displacement (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Concentrate parts in liquid recipe",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Diluent parts in liquid recipe",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Available liquid volume (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Concentrate volume (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Diluent volume (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses measured displacement, not ice mass or loose bulk volume. Recipe parts are volumetric; later melting is excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Available liquid volume (mL)",
          "text": "Subtract measured displacement from usable volume."
        },
        {
          "label": "Concentrate volume (mL)",
          "text": "Allocate liquid using concentrate share of recipe parts."
        },
        {
          "label": "Diluent volume (mL)",
          "text": "Allocate remaining liquid using diluent share."
        }
      ],
      "example_questions": [
        "Use the Cafe iced drink displacement calculator.",
        "Help me calculate cafe iced drink displacement."
      ],
      "retrieval_phrases": [
        "Cafe iced drink displacement",
        "cafe iced drink displacement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 200,
            "c": 1,
            "d": 4
          },
          "outputs": [
            {
              "label": "Available liquid volume (mL)",
              "value": 300
            },
            {
              "label": "Concentrate volume (mL)",
              "value": 60
            },
            {
              "label": "Diluent volume (mL)",
              "value": 240
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1626",
      "name": "Food pack declared-weight giveaway",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Descriptive giveaway audit only. Does not determine whether a pack meets any labeling or acceptance regulation.",
      "url": "/calculators/food-pack-declared-weight-giveaway/",
      "version": "71e5812ae246a7e36d2f326a6b2731773be4517198f1b03198bd69f429ebc231",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured pack weights (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Declared target weight (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Ingredient cost (currency/kg)",
          "type": "number",
          "required": true,
          "unit": "currency/kg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Positive overfill by pack (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total giveaway (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Giveaway ingredient cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Descriptive giveaway audit only. Does not determine whether a pack meets any labeling or acceptance regulation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Positive overfill by pack (g)",
          "text": "Count only weight above the declared target."
        },
        {
          "label": "Total giveaway (g)",
          "text": "Add positive overfill without offsetting underfills."
        },
        {
          "label": "Giveaway ingredient cost (currency)",
          "text": "Convert giveaway grams to kilograms and apply cost."
        }
      ],
      "example_questions": [
        "Use the Food pack declared-weight giveaway calculator.",
        "Help me calculate food pack declared-weight giveaway."
      ],
      "retrieval_phrases": [
        "Food pack declared-weight giveaway",
        "food pack declared weight giveaway"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "510,500,520",
            "b": 500,
            "c": 4
          },
          "outputs": [
            {
              "label": "Positive overfill by pack (g)",
              "value": "10, 0, 20"
            },
            {
              "label": "Total giveaway (g)",
              "value": 30
            },
            {
              "label": "Giveaway ingredient cost (currency)",
              "value": 0.12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1628",
      "name": "Food packing line film consumption",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Uniform rejection assumption; lanes advance together. Roll length is usable length after setup waste.",
      "url": "/calculators/food-packing-line-film-consumption/",
      "version": "0f116e121b640e0359279bf2a7a2a18034822345312c9d8cfc8675f637c12d9f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Planned saleable packs",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Assumed reject rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pack pitch along film (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Packs across each film advance",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Usable roll length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gross packs required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Film advances",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Film required (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Rolls to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform rejection assumption; lanes advance together. Roll length is usable length after setup waste."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gross packs required",
          "text": "Inflate saleable target for the assumed yield."
        },
        {
          "label": "Film advances",
          "text": "Round gross packs to full lane groups."
        },
        {
          "label": "Film required (m)",
          "text": "Multiply advances by pitch and convert millimetres."
        },
        {
          "label": "Rolls to purchase",
          "text": "Round film requirement to whole rolls."
        }
      ],
      "example_questions": [
        "Use the Food packing line film consumption calculator.",
        "Help me calculate food packing line film consumption."
      ],
      "retrieval_phrases": [
        "Food packing line film consumption",
        "food packing line film consumption"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 900,
            "b": 10,
            "c": 200,
            "d": 2,
            "e": 100
          },
          "outputs": [
            {
              "label": "Gross packs required",
              "value": 1000
            },
            {
              "label": "Film advances",
              "value": 500
            },
            {
              "label": "Film required (m)",
              "value": 100
            },
            {
              "label": "Rolls to purchase",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1629",
      "name": "Food tray sealing throughput",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Long-run average throughput, allowing fractional expected trays. Excludes food process validation.",
      "url": "/calculators/food-tray-sealing-throughput/",
      "version": "573c07131ab3aeab5b38844feb00ea468a8ff70c9ae3c65aeb63bf86607e6af3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Tray cavities per cycle",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cycle time (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Downtime per scheduled hour (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reject rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cycles per scheduled hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Gross trays per scheduled hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected saleable trays per hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Long-run average throughput, allowing fractional expected trays. Excludes food process validation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cycles per scheduled hour",
          "text": "Divide operating seconds by measured cycle duration."
        },
        {
          "label": "Gross trays per scheduled hour",
          "text": "Multiply cycles by tray cavities."
        },
        {
          "label": "Expected saleable trays per hour",
          "text": "Apply saleable yield to gross trays."
        }
      ],
      "example_questions": [
        "Use the Food tray sealing throughput calculator.",
        "Help me calculate food tray sealing throughput."
      ],
      "retrieval_phrases": [
        "Food tray sealing throughput",
        "food tray sealing throughput"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 20,
            "c": 10,
            "d": 4
          },
          "outputs": [
            {
              "label": "Cycles per scheduled hour",
              "value": 150
            },
            {
              "label": "Gross trays per scheduled hour",
              "value": 600
            },
            {
              "label": "Expected saleable trays per hour",
              "value": 576
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1630",
      "name": "Food label reconciliation",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Signed differences flag missing labels or over-recorded dispositions. Rows are batches, not label designs.",
      "url": "/calculators/food-label-reconciliation/",
      "version": "a738e9ea281144084a5fef7c76b4ed0f8518f9045c9f77bd87fa6c1e964dc965",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Labels issued by batch",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Labels used by batch",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Labels spoiled by batch",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Labels returned by batch",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unaccounted labels by batch",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total unaccounted labels",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Signed differences flag missing labels or over-recorded dispositions. Rows are batches, not label designs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unaccounted labels by batch",
          "text": "Subtract used, spoiled and returned labels from issues."
        },
        {
          "label": "Total unaccounted labels",
          "text": "Sum the label reconciliation differences."
        }
      ],
      "example_questions": [
        "Use the Food label reconciliation calculator.",
        "Help me calculate food label reconciliation."
      ],
      "retrieval_phrases": [
        "Food label reconciliation",
        "food label reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "80,170",
            "c": "5,10",
            "d": "10,20"
          },
          "outputs": [
            {
              "label": "Unaccounted labels by batch",
              "value": "5, 0"
            },
            {
              "label": "Total unaccounted labels",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1631",
      "name": "Food batch traceability mass balance",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "One closed batch boundary; incoming rework belongs in ingredient inputs. Does not infer lot identity from totals.",
      "url": "/calculators/food-batch-traceability-mass-balance/",
      "version": "11eb8660e6e66b4c8dffd2a73f8d71d7f13848730bd3b02db7dc5fee98a9efd9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient lot masses entering batch (kg)",
          "type": "array",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Finished output mass (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rework transferred out (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Recorded processing loss (kg)",
          "type": "number",
          "required": true,
          "unit": "kg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Input mass (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unreconciled mass (kg)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Finished yield (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One closed batch boundary; incoming rework belongs in ingredient inputs. Does not infer lot identity from totals."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Input mass (kg)",
          "text": "Add ingredient lots entering the batch."
        },
        {
          "label": "Unreconciled mass (kg)",
          "text": "Subtract finished output, outgoing rework and known losses."
        },
        {
          "label": "Finished yield (%)",
          "text": "Divide finished product by ingredient input mass."
        }
      ],
      "example_questions": [
        "Use the Food batch traceability mass balance calculator.",
        "Help me calculate food batch traceability mass balance."
      ],
      "retrieval_phrases": [
        "Food batch traceability mass balance",
        "food batch traceability mass balance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "80,20",
            "b": 85,
            "c": 5,
            "d": 8
          },
          "outputs": [
            {
              "label": "Input mass (kg)",
              "value": 100
            },
            {
              "label": "Unreconciled mass (kg)",
              "value": 2
            },
            {
              "label": "Finished yield (%)",
              "value": 85
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1632",
      "name": "Food case-count rounding",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Single SKU with whole cases and a minimum case order; an entered positive minimum still applies when requirement is zero.",
      "url": "/calculators/food-case-count-rounding/",
      "version": "a77f9f05f8f956caf38c88065308a5ea6dd0a1df76b3ca69393aeca06fede226",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required saleable units",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Units per case",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Minimum order (cases)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cases to order",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Units purchased",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Surplus units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single SKU with whole cases and a minimum case order; an entered positive minimum still applies when requirement is zero."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cases to order",
          "text": "Round required units to cases and apply the minimum order."
        },
        {
          "label": "Units purchased",
          "text": "Multiply ordered cases by case size."
        },
        {
          "label": "Surplus units",
          "text": "Deduct required units from purchased units."
        }
      ],
      "example_questions": [
        "Use the Food case-count rounding calculator.",
        "Help me calculate food case-count rounding."
      ],
      "retrieval_phrases": [
        "Food case-count rounding",
        "food case count rounding"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 250,
            "b": 24,
            "c": 12
          },
          "outputs": [
            {
              "label": "Cases to order",
              "value": 12
            },
            {
              "label": "Units purchased",
              "value": 288
            },
            {
              "label": "Surplus units",
              "value": 38
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1638",
      "name": "Food vacuum bag fit",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Ideal rectangular lay-flat geometric estimate, no stretch or gussets; verify physical fit. Orientation is fixed and corner/seam behavior is excluded.",
      "url": "/calculators/food-vacuum-bag-fit/",
      "version": "f08e4e4619f989fe0f771597255b0254470d5857579cc25b4d2eded35c88fc71",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rectangular item length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Item width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Item thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Seal allowance at each end (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available flat bag width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Available bag length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required lay-flat width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required bag length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Fit in stated orientation",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Unused flat bag area (mm²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal rectangular lay-flat geometric estimate, no stretch or gussets; verify physical fit. Orientation is fixed and corner/seam behavior is excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required lay-flat width (mm)",
          "text": "Use half the item cross-sectional perimeter."
        },
        {
          "label": "Required bag length (mm)",
          "text": "Allow thickness plus two end seals along bag length."
        },
        {
          "label": "Fit in stated orientation",
          "text": "Compare both bag dimensions with required dimensions."
        },
        {
          "label": "Unused flat bag area (mm²)",
          "text": "Compare supplied flat area with minimum bounding flat area."
        }
      ],
      "example_questions": [
        "Use the Food vacuum bag fit calculator.",
        "Help me calculate food vacuum bag fit."
      ],
      "retrieval_phrases": [
        "Food vacuum bag fit",
        "food vacuum bag fit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 100,
            "c": 30,
            "d": 20,
            "e": 150,
            "f": 300
          },
          "outputs": [
            {
              "label": "Required lay-flat width (mm)",
              "value": 130
            },
            {
              "label": "Required bag length (mm)",
              "value": 270
            },
            {
              "label": "Fit in stated orientation",
              "value": "Fits geometric allowance"
            },
            {
              "label": "Unused flat bag area (mm²)",
              "value": 9900
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1640",
      "name": "Food net-drained-weight audit",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Measured physical weight summary only; does not certify declared-weight compliance.",
      "url": "/calculators/food-net-drained-weight-audit/",
      "version": "d1fe8a32b92f0359a8aac383e8ba525fd5e71dbb7588ffcfb8add8320ec5642a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gross sample weights (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Container tare weights (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured drained food weights (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net weights (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Average drained weight (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Drained fraction of total net weight (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Measured physical weight summary only; does not certify declared-weight compliance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net weights (g)",
          "text": "Subtract each container tare from gross sample weight."
        },
        {
          "label": "Average drained weight (g)",
          "text": "Average drained food measurements."
        },
        {
          "label": "Drained fraction of total net weight (%)",
          "text": "Divide total drained food by total net contents."
        }
      ],
      "example_questions": [
        "Use the Food net-drained-weight audit calculator.",
        "Help me calculate food net-drained-weight audit."
      ],
      "retrieval_phrases": [
        "Food net-drained-weight audit",
        "food net drained weight audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "550,600",
            "b": "50,50",
            "c": "300,330"
          },
          "outputs": [
            {
              "label": "Net weights (g)",
              "value": "500, 550"
            },
            {
              "label": "Average drained weight (g)",
              "value": 315
            },
            {
              "label": "Drained fraction of total net weight (%)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1645",
      "name": "Food sample retention inventory",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Constant daily production, user-prescribed retention and immediate disposal at expiry; includes no aisle or equipment space allowance.",
      "url": "/calculators/food-sample-retention-inventory/",
      "version": "482d27ad9bf68294319434e634a13da21c84f8613bb9aa89773ef0ca1c6354f7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Batches produced per day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Samples retained per batch",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Retention window (days)",
          "type": "integer",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Packed volume per sample (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Steady-state retained sample count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Storage volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Samples entering and leaving daily",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant daily production, user-prescribed retention and immediate disposal at expiry; includes no aisle or equipment space allowance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Steady-state retained sample count",
          "text": "Multiply daily batches, samples per batch and retention days."
        },
        {
          "label": "Storage volume (L)",
          "text": "Multiply retained samples by packed sample volume."
        },
        {
          "label": "Samples entering and leaving daily",
          "text": "At steady state, daily inflow equals daily expiry."
        }
      ],
      "example_questions": [
        "Use the Food sample retention inventory calculator.",
        "Help me calculate food sample retention inventory."
      ],
      "retrieval_phrases": [
        "Food sample retention inventory",
        "food sample retention inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 2,
            "c": 30,
            "d": 0.25
          },
          "outputs": [
            {
              "label": "Steady-state retained sample count",
              "value": 240
            },
            {
              "label": "Storage volume (L)",
              "value": 60
            },
            {
              "label": "Samples entering and leaving daily",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1647",
      "name": "Food traceability code capacity",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Fixed-width suffix, all symbol combinations allowed, leading zero allowed and unique date prefix for each stated day; prefixes are supplied counts, not calendar parsing.",
      "url": "/calculators/food-traceability-code-capacity/",
      "version": "5bf6c81b431b9a192e5c52f6cb2e66ddc6bb900733b6522f6373d27943063846",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Alphabet symbols per batch-code character",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Characters in daily batch suffix",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Expected batches per day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Distinct date-prefix values",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Codes available per date",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total unique codes in date range",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused daily suffixes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Daily capacity utilization (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed-width suffix, all symbol combinations allowed, leading zero allowed and unique date prefix for each stated day; prefixes are supplied counts, not calendar parsing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Codes available per date",
          "text": "Raise alphabet size to fixed suffix length."
        },
        {
          "label": "Total unique codes in date range",
          "text": "Multiply daily suffix capacity by distinct date prefixes."
        },
        {
          "label": "Unused daily suffixes",
          "text": "Subtract daily batches from suffix capacity."
        },
        {
          "label": "Daily capacity utilization (%)",
          "text": "Compare daily batch count with suffix space."
        }
      ],
      "example_questions": [
        "Use the Food traceability code capacity calculator.",
        "Help me calculate food traceability code capacity."
      ],
      "retrieval_phrases": [
        "Food traceability code capacity",
        "food traceability code capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 3,
            "c": 100,
            "d": 365
          },
          "outputs": [
            {
              "label": "Codes available per date",
              "value": 1000
            },
            {
              "label": "Total unique codes in date range",
              "value": 365000
            },
            {
              "label": "Unused daily suffixes",
              "value": 900
            },
            {
              "label": "Daily capacity utilization (%)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1648",
      "name": "Food weigh-scale check log",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Check-log arithmetic under a user-entered tolerance; not calibration or regulatory approval.",
      "url": "/calculators/food-weigh-scale-check-log/",
      "version": "8e7287e315c080c0e9373757829c80a2d0ea206e6986aa1a927fffb77ea200fc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Reference masses (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observed scale readings (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Allowed absolute error (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Signed errors (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Checks outside entered tolerance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Maximum absolute error (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Check-log arithmetic under a user-entered tolerance; not calibration or regulatory approval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Signed errors (g)",
          "text": "Subtract each reference mass from the observed reading."
        },
        {
          "label": "Checks outside entered tolerance",
          "text": "Count absolute errors greater than the supplied tolerance."
        },
        {
          "label": "Maximum absolute error (g)",
          "text": "Find the largest absolute difference."
        }
      ],
      "example_questions": [
        "Use the Food weigh-scale check log calculator.",
        "Help me calculate food weigh-scale check log."
      ],
      "retrieval_phrases": [
        "Food weigh-scale check log",
        "food weigh scale check log"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,500",
            "b": "101,497",
            "c": 2
          },
          "outputs": [
            {
              "label": "Signed errors (g)",
              "value": "1, -3"
            },
            {
              "label": "Checks outside entered tolerance",
              "value": 1
            },
            {
              "label": "Maximum absolute error (g)",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1649",
      "name": "Food order substitution reconciliation",
      "category": "Food packing and distribution",
      "status": "available",
      "purpose": "Equivalence is based only on like-for-like measured content, as approved by the user. Does not establish recipe, allergen or quality interchangeability.",
      "url": "/calculators/food-order-substitution-reconciliation/",
      "version": "b5e7e61d9e6d2b42b37a25b4e253fab417e5e1856d80ff1183405f18da208dab",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original ordered packs",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Original pack content (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Substitute packs delivered",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Substitute pack content (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Original price per pack (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Substitute price per pack (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Delivered original-pack equivalents",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Content shortfall (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Invoice value change (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Equivalence is based only on like-for-like measured content, as approved by the user. Does not establish recipe, allergen or quality interchangeability."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Delivered original-pack equivalents",
          "text": "Convert substitute total content to original-pack size."
        },
        {
          "label": "Content shortfall (g)",
          "text": "Compare original and substitute total content."
        },
        {
          "label": "Invoice value change (currency)",
          "text": "Subtract original order value from substitute value."
        }
      ],
      "example_questions": [
        "Use the Food order substitution reconciliation calculator.",
        "Help me calculate food order substitution reconciliation."
      ],
      "retrieval_phrases": [
        "Food order substitution reconciliation",
        "food order substitution reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 500,
            "c": 12,
            "d": 400,
            "e": 3,
            "f": 2.5
          },
          "outputs": [
            {
              "label": "Delivered original-pack equivalents",
              "value": 9.6
            },
            {
              "label": "Content shortfall (g)",
              "value": 200
            },
            {
              "label": "Invoice value change (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1652",
      "name": "Grocery shelf-life sell-through",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "Constant daily demand, no receipts, earliest expiry first. Selling days are supplied approved windows; no shelf-life determination.",
      "url": "/calculators/grocery-shelf-life-sell-through/",
      "version": "f74e1e29e358d009faef65386042bcd1159f76533963ab5d8551e97e488e96aa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Units remaining by expiry cohort",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Whole selling days remaining by cohort",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Expected daily demand (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Projected units sold",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Units exposed to expiry",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant daily demand, no receipts, earliest expiry first. Selling days are supplied approved windows; no shelf-life determination."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Projected units sold",
          "text": "Allocate cumulative demand to earliest-expiry cohorts first."
        },
        {
          "label": "Units exposed to expiry",
          "text": "Subtract projected FEFO sales from current stock."
        }
      ],
      "example_questions": [
        "Use the Grocery shelf-life sell-through calculator.",
        "Help me calculate grocery shelf-life sell-through."
      ],
      "retrieval_phrases": [
        "Grocery shelf-life sell-through",
        "grocery shelf life sell through"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,60",
            "b": "2,4",
            "c": 20
          },
          "outputs": [
            {
              "label": "Projected units sold",
              "value": 80
            },
            {
              "label": "Units exposed to expiry",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1656",
      "name": "Grocery scale tare reconciliation",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "Positive discrepancy means displayed net weight and charge are too high for the sampled container mean. No legal compliance finding.",
      "url": "/calculators/grocery-scale-tare-reconciliation/",
      "version": "b7118309747394a52f80d210d601f57aef111b4919f921369ff76ddfcedd5165",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured container tare samples (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Configured tare (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Product sale price (currency/kg)",
          "type": "number",
          "required": true,
          "unit": "currency/kg",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Average measured tare (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Average net-weight overstatement (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Average charge effect (currency/container)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Positive discrepancy means displayed net weight and charge are too high for the sampled container mean. No legal compliance finding."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Average measured tare (g)",
          "text": "Average the container tare observations."
        },
        {
          "label": "Average net-weight overstatement (g)",
          "text": "Actual tare minus deducted tare gives signed overstatement."
        },
        {
          "label": "Average charge effect (currency/container)",
          "text": "Value the signed weight discrepancy at the supplied unit price."
        }
      ],
      "example_questions": [
        "Use the Grocery scale tare reconciliation calculator.",
        "Help me calculate grocery scale tare reconciliation."
      ],
      "retrieval_phrases": [
        "Grocery scale tare reconciliation",
        "grocery scale tare reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "18,20,22",
            "b": 18,
            "c": 10
          },
          "outputs": [
            {
              "label": "Average measured tare (g)",
              "value": 20
            },
            {
              "label": "Average net-weight overstatement (g)",
              "value": 2
            },
            {
              "label": "Average charge effect (currency/container)",
              "value": 0.02
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1659",
      "name": "Grocery trolley fleet demand",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "Steady flow inventory identity; gives mean demand, not a probability of availability during peaks.",
      "url": "/calculators/grocery-trolley-fleet-demand/",
      "version": "f66ee7d0dbd4c3a97d675289489623fcd3154a8bf10eb2e5281d19308b49baf0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Customer arrival rate (customers/hour)",
          "type": "number",
          "required": true,
          "unit": "customers/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Customers using a trolley (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average trolley trip duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Return/reposition lag (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available trolley fleet",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Average trolley demand",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Whole trolley provision for mean demand",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Mean-demand fleet gap",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady flow inventory identity; gives mean demand, not a probability of availability during peaks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Average trolley demand",
          "text": "Multiply trolley arrivals per hour by complete circulation time."
        },
        {
          "label": "Whole trolley provision for mean demand",
          "text": "Round average concurrent demand upward."
        },
        {
          "label": "Mean-demand fleet gap",
          "text": "Compare rounded demand with fleet availability."
        }
      ],
      "example_questions": [
        "Use the Grocery trolley fleet demand calculator.",
        "Help me calculate grocery trolley fleet demand."
      ],
      "retrieval_phrases": [
        "Grocery trolley fleet demand",
        "grocery trolley fleet demand"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 50,
            "c": 40,
            "d": 10,
            "e": 45
          },
          "outputs": [
            {
              "label": "Average trolley demand",
              "value": 50
            },
            {
              "label": "Whole trolley provision for mean demand",
              "value": 50
            },
            {
              "label": "Mean-demand fleet gap",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1661",
      "name": "Grocery promotional uplift inventory",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "Scenario arithmetic only; constant baseline and uplift, timely receipts, no spoilage or demand estimation.",
      "url": "/calculators/grocery-promotional-uplift-inventory/",
      "version": "e8dad45aec738724b2f8f46decd8e32595bde9b9d5f361e13e81430b9f64fe13",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Baseline daily demand (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Assumed promotion uplift (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Promotion days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Usable stock before promotion",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Confirmed receipts during promotion",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Promotion demand (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Additional order (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Incremental demand above baseline",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Scenario arithmetic only; constant baseline and uplift, timely receipts, no spoilage or demand estimation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Promotion demand (units)",
          "text": "Scale baseline demand by uplift and duration."
        },
        {
          "label": "Additional order (units)",
          "text": "Deduct usable stock and confirmed receipts, then round up."
        },
        {
          "label": "Incremental demand above baseline",
          "text": "Compute demand attributable to the supplied uplift."
        }
      ],
      "example_questions": [
        "Use the Grocery promotional uplift inventory calculator.",
        "Help me calculate grocery promotional uplift inventory."
      ],
      "retrieval_phrases": [
        "Grocery promotional uplift inventory",
        "grocery promotional uplift inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 50,
            "c": 4,
            "d": 200,
            "e": 100
          },
          "outputs": [
            {
              "label": "Promotion demand (units)",
              "value": 600
            },
            {
              "label": "Additional order (units)",
              "value": 300
            },
            {
              "label": "Incremental demand above baseline",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1667",
      "name": "Grocery click-and-collect slot capacity",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "Homogeneous orders and interchangeable labour; excludes separate equipment bottlenecks and arrival timing within slot.",
      "url": "/calculators/grocery-click-and-collect-slot-capacity/",
      "version": "55ea389c2389807b6ea9eb9a3512e57d0bd9e22a93784b49aa61043d6803bae6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Average lines per collection order",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Pick time per line (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Packing time per order (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Pickers assigned to slot",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Slot duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Orders already assigned",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Labour per order (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Whole-order slot capacity",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional orders available",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Overbooked orders",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Homogeneous orders and interchangeable labour; excludes separate equipment bottlenecks and arrival timing within slot."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Labour per order (minutes)",
          "text": "Add line picking time and fixed packing time."
        },
        {
          "label": "Whole-order slot capacity",
          "text": "Divide total picker-minutes by order labour."
        },
        {
          "label": "Additional orders available",
          "text": "Subtract booked orders from capacity."
        },
        {
          "label": "Overbooked orders",
          "text": "Report orders beyond modeled slot capacity."
        }
      ],
      "example_questions": [
        "Use the Grocery click-and-collect slot capacity calculator.",
        "Help me calculate grocery click-and-collect slot capacity."
      ],
      "retrieval_phrases": [
        "Grocery click-and-collect slot capacity",
        "grocery click and collect slot capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 0.5,
            "c": 5,
            "d": 3,
            "e": 60,
            "f": 10
          },
          "outputs": [
            {
              "label": "Labour per order (minutes)",
              "value": 15
            },
            {
              "label": "Whole-order slot capacity",
              "value": 12
            },
            {
              "label": "Additional orders available",
              "value": 2
            },
            {
              "label": "Overbooked orders",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1668",
      "name": "Grocery substitution acceptance rate",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "One outcome per proposal. Refund price is a category average; acceptance is descriptive, not a prediction.",
      "url": "/calculators/grocery-substitution-acceptance-rate/",
      "version": "7b5c4349674488f3480dcad88d545b97d287dd0e7df88bc9ac89b42316a0b70a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Accepted substitutions by category",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Rejected substitutions by category",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Refund value per rejected item by category (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Acceptance rates by category (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Overall acceptance (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Refunds from rejected items (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One outcome per proposal. Refund price is a category average; acceptance is descriptive, not a prediction."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Acceptance rates by category (%)",
          "text": "Divide accepted substitutions by all proposals in each category."
        },
        {
          "label": "Overall acceptance (%)",
          "text": "Weight categories by proposed substitution counts."
        },
        {
          "label": "Refunds from rejected items (currency)",
          "text": "Multiply rejections by the respective refund values."
        }
      ],
      "example_questions": [
        "Use the Grocery substitution acceptance rate calculator.",
        "Help me calculate grocery substitution acceptance rate."
      ],
      "retrieval_phrases": [
        "Grocery substitution acceptance rate",
        "grocery substitution acceptance rate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,10",
            "b": "10,10",
            "c": "2,5"
          },
          "outputs": [
            {
              "label": "Acceptance rates by category (%)",
              "value": "75, 50"
            },
            {
              "label": "Overall acceptance (%)",
              "value": 66.66666666666667
            },
            {
              "label": "Refunds from rejected items (currency)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1669",
      "name": "Grocery shrink by cause ledger",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "All losses are valued on the same cost basis and assigned to one cause only; excludes offsetting recoveries.",
      "url": "/calculators/grocery-shrink-by-cause-ledger/",
      "version": "69ae0ddf00a4d5876a80b8a37caed4590cbe1bf9c23bef6d008195d7fa18b592",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Waste losses by department (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Theft adjustments by department (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Damage losses by department (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Receiving shortage losses by department (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Losses by department (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total shrink (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Waste share of shrink (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All losses are valued on the same cost basis and assigned to one cause only; excludes offsetting recoveries."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Losses by department (currency)",
          "text": "Sum mutually exclusive loss causes for each department."
        },
        {
          "label": "Total shrink (currency)",
          "text": "Add all department loss entries."
        },
        {
          "label": "Waste share of shrink (%)",
          "text": "Divide recorded waste by total loss."
        }
      ],
      "example_questions": [
        "Use the Grocery shrink by cause ledger calculator.",
        "Help me calculate grocery shrink by cause ledger."
      ],
      "retrieval_phrases": [
        "Grocery shrink by cause ledger",
        "grocery shrink by cause ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "20,30",
            "c": "10,20",
            "d": "5,15"
          },
          "outputs": [
            {
              "label": "Losses by department (currency)",
              "value": "135, 115"
            },
            {
              "label": "Total shrink (currency)",
              "value": 250
            },
            {
              "label": "Waste share of shrink (%)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1670",
      "name": "Grocery deli slicing yield",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "All remainder is excluded from portion sales, and all initial purchase cost is allocated to complete portions.",
      "url": "/calculators/grocery-deli-slicing-yield/",
      "version": "04c6e1e0ee67837d5390e519c252df13b74a9ca29d5039edc5eeb60268292b85",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Starting deli product mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Trim and unusable loss (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target portion mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Purchase cost of starting product (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sellable whole portions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unsliced remainder (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Purchase cost per whole portion (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All remainder is excluded from portion sales, and all initial purchase cost is allocated to complete portions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sellable whole portions",
          "text": "Divide trimmed yield by portion mass and round down."
        },
        {
          "label": "Unsliced remainder (g)",
          "text": "Deduct full portions from trimmed product."
        },
        {
          "label": "Purchase cost per whole portion (currency)",
          "text": "Allocate all purchase cost to complete saleable portions."
        }
      ],
      "example_questions": [
        "Use the Grocery deli slicing yield calculator.",
        "Help me calculate grocery deli slicing yield."
      ],
      "retrieval_phrases": [
        "Grocery deli slicing yield",
        "grocery deli slicing yield"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5000,
            "b": 500,
            "c": 150,
            "d": 45
          },
          "outputs": [
            {
              "label": "Sellable whole portions",
              "value": 30
            },
            {
              "label": "Unsliced remainder (g)",
              "value": 0
            },
            {
              "label": "Purchase cost per whole portion (currency)",
              "value": 1.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1671",
      "name": "Grocery refill station container pricing",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "No container charges or taxes are added. Output preserves unrounded arithmetic for a supplied pricing basis.",
      "url": "/calculators/grocery-refill-station-container-pricing/",
      "version": "1fe90c633c4e675f5f5da940bcfe259144bc483a44dc51339ae707b9760e03db",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gross refill weights by container (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Container tares (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Refill prices (currency/kg)",
          "type": "array",
          "required": true,
          "unit": "currency/kg",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net product weights (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Line charges (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total charge before currency rounding",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "No container charges or taxes are added. Output preserves unrounded arithmetic for a supplied pricing basis."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net product weights (g)",
          "text": "Subtract each container tare from gross weight."
        },
        {
          "label": "Line charges (currency)",
          "text": "Apply price per kilogram to each net mass."
        },
        {
          "label": "Total charge before currency rounding",
          "text": "Sum the exact unrounded line charges."
        }
      ],
      "example_questions": [
        "Use the Grocery refill station container pricing calculator.",
        "Help me calculate grocery refill station container pricing."
      ],
      "retrieval_phrases": [
        "Grocery refill station container pricing",
        "grocery refill station container pricing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "600,800",
            "b": "100,200",
            "c": "4,5"
          },
          "outputs": [
            {
              "label": "Net product weights (g)",
              "value": "500, 600"
            },
            {
              "label": "Line charges (currency)",
              "value": "2, 3"
            },
            {
              "label": "Total charge before currency rounding",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1673",
      "name": "Grocery price label update workload",
      "category": "Grocery and fresh retail operations",
      "status": "available",
      "purpose": "One replacement label per changed product, no misprints, each batch incurs setup and placement is sequential.",
      "url": "/calculators/grocery-price-label-update-workload/",
      "version": "66366a792c7eaff389f5a7b89d942d35dbc9e8a938bd2299ff8917769b5d8dee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Changed product labels",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labels per print sheet",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Print setup (minutes/batch)",
          "type": "number",
          "required": true,
          "unit": "minutes/batch",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Sheets in one print batch",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Placement time (seconds/label)",
          "type": "number",
          "required": true,
          "unit": "seconds/label",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Print sheets",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Print batches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total labour (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One replacement label per changed product, no misprints, each batch incurs setup and placement is sequential."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Print sheets",
          "text": "Round label count to whole sheets."
        },
        {
          "label": "Print batches",
          "text": "Round sheets to supported print batches."
        },
        {
          "label": "Total labour (minutes)",
          "text": "Add batch setup and label placement time."
        }
      ],
      "example_questions": [
        "Use the Grocery price label update workload calculator.",
        "Help me calculate grocery price label update workload."
      ],
      "retrieval_phrases": [
        "Grocery price label update workload",
        "grocery price label update workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 240,
            "b": 24,
            "c": 5,
            "d": 5,
            "e": 30
          },
          "outputs": [
            {
              "label": "Print sheets",
              "value": 10
            },
            {
              "label": "Print batches",
              "value": 2
            },
            {
              "label": "Total labour (minutes)",
              "value": 130
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1677",
      "name": "Hotel average daily rate segmentation",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Receipts include room revenue only and sold nights use a consistent treatment of complimentary rooms. Segments must be mutually exclusive.",
      "url": "/calculators/hotel-average-daily-rate-segmentation/",
      "version": "d80d3c554d1cf2811c889903dbb081012d8896a910a8723f524131105f18d118",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Room receipts by segment (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Sold room-nights by segment",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "ADR by segment (currency/sold room-night)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Blended ADR (currency/sold room-night)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Sold room-nights",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Receipts include room revenue only and sold nights use a consistent treatment of complimentary rooms. Segments must be mutually exclusive."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "ADR by segment (currency/sold room-night)",
          "text": "Divide each segment room receipts by its sold nights."
        },
        {
          "label": "Blended ADR (currency/sold room-night)",
          "text": "Divide combined room revenue by combined sold nights."
        },
        {
          "label": "Sold room-nights",
          "text": "Add segment sold nights."
        }
      ],
      "example_questions": [
        "Use the Hotel average daily rate segmentation calculator.",
        "Help me calculate hotel average daily rate segmentation."
      ],
      "retrieval_phrases": [
        "Hotel average daily rate segmentation",
        "hotel average daily rate segmentation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1200,1800",
            "b": "10,20"
          },
          "outputs": [
            {
              "label": "ADR by segment (currency/sold room-night)",
              "value": "120, 90"
            },
            {
              "label": "Blended ADR (currency/sold room-night)",
              "value": 100
            },
            {
              "label": "Sold room-nights",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1678",
      "name": "Hotel revenue per available room",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Use room revenue only and the same available-room convention in both periods. Unlike ADR, denominator includes unsold available nights.",
      "url": "/calculators/hotel-revenue-per-available-room/",
      "version": "2deaf042db7b831dac3a4f7ea57addaf6fcd0765ed00e4f1ff62a3cf967ac27d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current room revenue (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current available room-nights",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Previous room revenue (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Previous available room-nights",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Current RevPAR (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Previous RevPAR (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "RevPAR change (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use room revenue only and the same available-room convention in both periods. Unlike ADR, denominator includes unsold available nights."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Current RevPAR (currency)",
          "text": "Divide current room revenue by available room-nights."
        },
        {
          "label": "Previous RevPAR (currency)",
          "text": "Divide previous revenue by previous availability."
        },
        {
          "label": "RevPAR change (currency)",
          "text": "Subtract previous revenue per available room-night."
        }
      ],
      "example_questions": [
        "Use the Hotel revenue per available room calculator.",
        "Help me calculate hotel revenue per available room."
      ],
      "retrieval_phrases": [
        "Hotel revenue per available room",
        "hotel revenue per available room"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6000,
            "b": 100,
            "c": 5000,
            "d": 100
          },
          "outputs": [
            {
              "label": "Current RevPAR (currency)",
              "value": 60
            },
            {
              "label": "Previous RevPAR (currency)",
              "value": 50
            },
            {
              "label": "RevPAR change (currency)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1679",
      "name": "Hotel gross operating profit per room",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Profit inputs may be negative and must use the same operating-profit definition. This is an operational metric, not financial-statement guidance.",
      "url": "/calculators/hotel-gross-operating-profit-per-room/",
      "version": "b0a32a9a2c79a8023a5b9d8a397fba9af627fb1455b9a721846826e31a3890b7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current operating profit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Current available room-nights",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Comparison operating profit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Comparison available room-nights",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Current profit per available room-night",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Comparison profit per available room-night",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Per-room-night variance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Profit inputs may be negative and must use the same operating-profit definition. This is an operational metric, not financial-statement guidance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Current profit per available room-night",
          "text": "Divide operating profit by available room-nights."
        },
        {
          "label": "Comparison profit per available room-night",
          "text": "Apply the same denominator convention to comparison period."
        },
        {
          "label": "Per-room-night variance (currency)",
          "text": "Compare normalized operating profit."
        }
      ],
      "example_questions": [
        "Use the Hotel gross operating profit per room calculator.",
        "Help me calculate hotel gross operating profit per room."
      ],
      "retrieval_phrases": [
        "Hotel gross operating profit per room",
        "hotel gross operating profit per room"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3000,
            "b": 100,
            "c": 2000,
            "d": 80
          },
          "outputs": [
            {
              "label": "Current profit per available room-night",
              "value": 30
            },
            {
              "label": "Comparison profit per available room-night",
              "value": 25
            },
            {
              "label": "Per-room-night variance (currency)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1683",
      "name": "Hotel linen loss reconciliation",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Inventory boundary includes clean, soiled and in-laundry stock; issued and returned movements inside that boundary cancel. Negative differences indicate overcounts.",
      "url": "/calculators/hotel-linen-loss-reconciliation/",
      "version": "aa095dab0aadd57d1a54120d4b88863adbdeb9b5cf83731dac2393df7d7fe086",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Opening linen inventory by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "New linen received by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Recorded discarded linen by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Closing usable count by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unexplained loss by linen type",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total unexplained loss",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Inventory boundary includes clean, soiled and in-laundry stock; issued and returned movements inside that boundary cancel. Negative differences indicate overcounts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unexplained loss by linen type",
          "text": "Roll forward opening plus receipts less documented discards and closing stock."
        },
        {
          "label": "Total unexplained loss",
          "text": "Aggregate signed discrepancies across linen types."
        }
      ],
      "example_questions": [
        "Use the Hotel linen loss reconciliation calculator.",
        "Help me calculate hotel linen loss reconciliation."
      ],
      "retrieval_phrases": [
        "Hotel linen loss reconciliation",
        "hotel linen loss reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "20,10",
            "c": "5,10",
            "d": "110,180"
          },
          "outputs": [
            {
              "label": "Unexplained loss by linen type",
              "value": "5, 20"
            },
            {
              "label": "Total unexplained loss",
              "value": 25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1685",
      "name": "Hotel amenity pack forecasting",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Steady occupancy; average stay estimates arrivals over the forecast period. Nightly packs are additional to arrival packs.",
      "url": "/calculators/hotel-amenity-pack-forecasting/",
      "version": "e253cc691d92a0831c43605c8b77bfdd6d57dafda1c152eb27a4b0ea8fbd0674",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Occupied rooms per night",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Forecast nights",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Average stay length (nights)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Arrival amenity packs per room",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional packs per occupied room-night",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Usable amenity stock",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected arrival packs",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total forecast packs",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Whole packs to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady occupancy; average stay estimates arrivals over the forecast period. Nightly packs are additional to arrival packs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected arrival packs",
          "text": "Estimate stays from occupied room-nights divided by average stay."
        },
        {
          "label": "Total forecast packs",
          "text": "Add arrival packs and nightly replenishment."
        },
        {
          "label": "Whole packs to purchase",
          "text": "Deduct available stock and round up."
        }
      ],
      "example_questions": [
        "Use the Hotel amenity pack forecasting calculator.",
        "Help me calculate hotel amenity pack forecasting."
      ],
      "retrieval_phrases": [
        "Hotel amenity pack forecasting",
        "hotel amenity pack forecasting"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 7,
            "c": 2,
            "d": 1,
            "e": 0.5,
            "f": 100
          },
          "outputs": [
            {
              "label": "Expected arrival packs",
              "value": 140
            },
            {
              "label": "Total forecast packs",
              "value": 280
            },
            {
              "label": "Whole packs to purchase",
              "value": 180
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1689",
      "name": "Hotel cancellation policy arithmetic",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Illustrates one supplied two-band policy; no legal entitlement or enforceability is inferred. Charge is based on booking total, not deposit.",
      "url": "/calculators/hotel-cancellation-policy-arithmetic/",
      "version": "eaeb5e1acaf20f54ca56e045cd93a80d950b161c15e837a05adbfc34ad079af4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Booking total (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Deposit already paid (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Notice before arrival (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Full-refund cutoff (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Late-cancellation charge (% of booking)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cancellation charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Refund of deposit (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional amount due (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Illustrates one supplied two-band policy; no legal entitlement or enforceability is inferred. Charge is based on booking total, not deposit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cancellation charge (currency)",
          "text": "Apply the supplied full-refund cutoff inclusively."
        },
        {
          "label": "Refund of deposit (currency)",
          "text": "Refund deposit above the cancellation charge."
        },
        {
          "label": "Additional amount due (currency)",
          "text": "Charge the portion not covered by the deposit."
        }
      ],
      "example_questions": [
        "Use the Hotel cancellation policy arithmetic calculator.",
        "Help me calculate hotel cancellation policy arithmetic."
      ],
      "retrieval_phrases": [
        "Hotel cancellation policy arithmetic",
        "hotel cancellation policy arithmetic"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 200,
            "c": 48,
            "d": 24,
            "e": 50
          },
          "outputs": [
            {
              "label": "Cancellation charge (currency)",
              "value": 0
            },
            {
              "label": "Refund of deposit (currency)",
              "value": 200
            },
            {
              "label": "Additional amount due (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1691",
      "name": "Hotel direct-booking acquisition comparison",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Repeat bookings have the same value and stay cost with no further acquisition cost; excludes overhead, discounting and demand prediction.",
      "url": "/calculators/hotel-direct-booking-acquisition-comparison/",
      "version": "7915e569204a58a3a5382ce3209062bac0314897802af203032e5e0a0b9250cd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Booking value (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Variable stay cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Direct acquisition cost per booking (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "OTA commission (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Expected repeat bookings per acquired direct customer",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "First direct booking contribution (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "OTA booking contribution (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Direct customer lifetime scenario contribution",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Repeat bookings have the same value and stay cost with no further acquisition cost; excludes overhead, discounting and demand prediction."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "First direct booking contribution (currency)",
          "text": "Deduct stay and direct acquisition costs."
        },
        {
          "label": "OTA booking contribution (currency)",
          "text": "Deduct OTA commission and stay costs."
        },
        {
          "label": "Direct customer lifetime scenario contribution",
          "text": "Apply one acquisition cost across initial and assumed repeat bookings."
        }
      ],
      "example_questions": [
        "Use the Hotel direct-booking acquisition comparison calculator.",
        "Help me calculate hotel direct-booking acquisition comparison."
      ],
      "retrieval_phrases": [
        "Hotel direct-booking acquisition comparison",
        "hotel direct booking acquisition comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 80,
            "c": 15,
            "d": 20,
            "e": 1
          },
          "outputs": [
            {
              "label": "First direct booking contribution (currency)",
              "value": 105
            },
            {
              "label": "OTA booking contribution (currency)",
              "value": 80
            },
            {
              "label": "Direct customer lifetime scenario contribution",
              "value": 225
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1692",
      "name": "Hotel breakfast attendance forecast",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Every package holder attends once per day; uptake is an entered scenario and expected cover counts may be fractional.",
      "url": "/calculators/hotel-breakfast-attendance-forecast/",
      "version": "561709e08f2e7dd1480c7f0ae906d991e8029e36ce73304dc9da5a0597c796fb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Occupied rooms by day",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Average guests per occupied room",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Breakfast package uptake (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Walk-in breakfast covers by day",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Breakfast covers by day",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total forecast covers",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Every package holder attends once per day; uptake is an entered scenario and expected cover counts may be fractional."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Breakfast covers by day",
          "text": "Add package guest covers and independent walk-ins."
        },
        {
          "label": "Total forecast covers",
          "text": "Sum expected daily breakfast attendance."
        }
      ],
      "example_questions": [
        "Use the Hotel breakfast attendance forecast calculator.",
        "Help me calculate hotel breakfast attendance forecast."
      ],
      "retrieval_phrases": [
        "Hotel breakfast attendance forecast",
        "hotel breakfast attendance forecast"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,50",
            "b": 2,
            "c": 60,
            "d": "10,20"
          },
          "outputs": [
            {
              "label": "Breakfast covers by day",
              "value": "58, 80"
            },
            {
              "label": "Total forecast covers",
              "value": 138
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1695",
      "name": "Hotel seasonal rate scenario",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "The supplied occupancy responses are assumptions. No demand elasticity is estimated; fixed costs are excluded.",
      "url": "/calculators/hotel-seasonal-rate-scenario/",
      "version": "4d028bb3ff5ad81ab4ecc1b917efa8f9df66fba5318fd587c5958a26f063b491",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Available room-nights",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Candidate nightly rates (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Assumed occupancy at each rate (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Variable cost per occupied room-night (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Room revenues by scenario (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Contributions by scenario (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Best contribution scenario (1-based)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The supplied occupancy responses are assumptions. No demand elasticity is estimated; fixed costs are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Room revenues by scenario (currency)",
          "text": "Multiply rate by assumed sold room-nights."
        },
        {
          "label": "Contributions by scenario (currency)",
          "text": "Deduct variable costs for assumed occupied nights."
        },
        {
          "label": "Best contribution scenario (1-based)",
          "text": "Choose the first candidate with greatest contribution."
        }
      ],
      "example_questions": [
        "Use the Hotel seasonal rate scenario calculator.",
        "Help me calculate hotel seasonal rate scenario."
      ],
      "retrieval_phrases": [
        "Hotel seasonal rate scenario",
        "hotel seasonal rate scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "100,120",
            "c": "80,70",
            "d": 30
          },
          "outputs": [
            {
              "label": "Room revenues by scenario (currency)",
              "value": "8000, 8400"
            },
            {
              "label": "Contributions by scenario (currency)",
              "value": "5600, 6300"
            },
            {
              "label": "Best contribution scenario (1-based)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1696",
      "name": "Hotel long-stay discount floor",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Contribution target is before fixed hotel overhead. All cleaning visits, including checkout if needed, must be counted explicitly.",
      "url": "/calculators/hotel-long-stay-discount-floor/",
      "version": "36d3a6b953b6b5e16dade2018a08bddf08e6f4521cfd1662a57fce8da11ce3bc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Long-stay nights",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Utilities per occupied night (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cleaning visits during stay",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Cost per cleaning visit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Booking commission (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Desired stay contribution (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Stay variable cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required nightly rate (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Required gross stay revenue (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Contribution target is before fixed hotel overhead. All cleaning visits, including checkout if needed, must be counted explicitly."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Stay variable cost (currency)",
          "text": "Combine nightly utilities and planned cleaning visits."
        },
        {
          "label": "Required nightly rate (currency)",
          "text": "Gross up costs and desired contribution for commission, then divide by nights."
        },
        {
          "label": "Required gross stay revenue (currency)",
          "text": "Calculate revenue that leaves the requested contribution after commission."
        }
      ],
      "example_questions": [
        "Use the Hotel long-stay discount floor calculator.",
        "Help me calculate hotel long-stay discount floor."
      ],
      "retrieval_phrases": [
        "Hotel long-stay discount floor",
        "hotel long stay discount floor"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 14,
            "b": 5,
            "c": 2,
            "d": 20,
            "e": 10,
            "f": 250
          },
          "outputs": [
            {
              "label": "Stay variable cost (currency)",
              "value": 110
            },
            {
              "label": "Required nightly rate (currency)",
              "value": 28.571428571428573
            },
            {
              "label": "Required gross stay revenue (currency)",
              "value": 400
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1697",
      "name": "Hotel room energy intensity",
      "category": "Hotel and accommodation operations",
      "status": "available",
      "purpose": "Meter allocation is supplied; metrics do not separate base loads from guest-driven consumption.",
      "url": "/calculators/hotel-room-energy-intensity/",
      "version": "d7ef7f0e0e54947a27909b321154710597660e6fa3a115e6e4561a13810419eb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Energy allocated to rooms (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Occupied room-nights",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Available room-nights",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Energy unit price (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": "currency/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Energy per occupied room-night (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Energy per available room-night (kWh)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Energy cost per occupied room-night",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Meter allocation is supplied; metrics do not separate base loads from guest-driven consumption."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Energy per occupied room-night (kWh)",
          "text": "Divide allocated energy by occupied room-nights."
        },
        {
          "label": "Energy per available room-night (kWh)",
          "text": "Include both sold and unsold room availability."
        },
        {
          "label": "Energy cost per occupied room-night",
          "text": "Price allocated energy and divide by occupied nights."
        }
      ],
      "example_questions": [
        "Use the Hotel room energy intensity calculator.",
        "Help me calculate hotel room energy intensity."
      ],
      "retrieval_phrases": [
        "Hotel room energy intensity",
        "hotel room energy intensity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6000,
            "b": 200,
            "c": 300,
            "d": 0.2
          },
          "outputs": [
            {
              "label": "Energy per occupied room-night (kWh)",
              "value": 30
            },
            {
              "label": "Energy per available room-night (kWh)",
              "value": 20
            },
            {
              "label": "Energy cost per occupied room-night",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1702",
      "name": "Gallery room crowd distribution",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "Steady-state mean occupancy; guests may visit multiple rooms so shares need not sum to 100%. Desired counts are operational inputs, not safety limits.",
      "url": "/calculators/gallery-room-crowd-distribution/",
      "version": "cd9071842304c4fcd5bc3487b872c37b5b951a669babf230bca1b90709c696aa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Visitors entering per hour",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Share visiting each gallery (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Mean gallery dwell times (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Desired occupancy by gallery",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected gallery occupancies",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Excess over entered desired occupancy",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady-state mean occupancy; guests may visit multiple rooms so shares need not sum to 100%. Desired counts are operational inputs, not safety limits."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected gallery occupancies",
          "text": "Multiply room arrival rate by mean dwell time in hours."
        },
        {
          "label": "Excess over entered desired occupancy",
          "text": "Compare average occupancy with the desired room count."
        }
      ],
      "example_questions": [
        "Use the Gallery room crowd distribution calculator.",
        "Help me calculate gallery room crowd distribution."
      ],
      "retrieval_phrases": [
        "Gallery room crowd distribution",
        "gallery room crowd distribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": "50,25",
            "c": "20,40",
            "d": "25,15"
          },
          "outputs": [
            {
              "label": "Expected gallery occupancies",
              "value": "20, 20"
            },
            {
              "label": "Excess over entered desired occupancy",
              "value": "0, 5"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1705",
      "name": "Attraction annual-pass break-even",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "All planned visits are eligible and prices stay constant; comparison excludes unrelated discounts and benefits.",
      "url": "/calculators/attraction-annual-pass-break-even/",
      "version": "1fa739e65cb6c8310c51be30936dd34fd909ed2978e3f03893d67804c4115580",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Annual pass price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Single-entry price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Per-visit pass-holder fee (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Planned eligible visits",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Visits to recover pass cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Pass option total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Pay-as-you-go total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Saving with pass (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All planned visits are eligible and prices stay constant; comparison excludes unrelated discounts and benefits."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Visits to recover pass cost",
          "text": "Divide pass cost by per-visit saving and round up."
        },
        {
          "label": "Pass option total (currency)",
          "text": "Add annual pass price and fees on planned visits."
        },
        {
          "label": "Pay-as-you-go total (currency)",
          "text": "Price each planned visit separately."
        },
        {
          "label": "Saving with pass (currency)",
          "text": "Subtract pass option from single-entry option."
        }
      ],
      "example_questions": [
        "Use the Attraction annual-pass break-even calculator.",
        "Help me calculate attraction annual-pass break-even."
      ],
      "retrieval_phrases": [
        "Attraction annual-pass break-even",
        "attraction annual pass break even"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 25,
            "c": 5,
            "d": 8
          },
          "outputs": [
            {
              "label": "Visits to recover pass cost",
              "value": 6
            },
            {
              "label": "Pass option total (currency)",
              "value": 160
            },
            {
              "label": "Pay-as-you-go total (currency)",
              "value": 200
            },
            {
              "label": "Saving with pass (currency)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1707",
      "name": "Tour bus seat and luggage fit",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "One departure assigned to one vehicle; aggregate volume only, not physical luggage packing or vehicle weight certification.",
      "url": "/calculators/tour-bus-seat-and-luggage-fit/",
      "version": "443d9db2f2c83d16d30fc9bb5997b709b21d4fae2e7f53c8a91ffb168f5e609f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Passenger party sizes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Luggage volume by party (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Bus passenger seats",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Bus usable luggage volume (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Passenger seats required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining seats",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining luggage volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Single bus capacity result",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One departure assigned to one vehicle; aggregate volume only, not physical luggage packing or vehicle weight certification."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Passenger seats required",
          "text": "Sum members of all parties on this bus."
        },
        {
          "label": "Remaining seats",
          "text": "Compare total passengers with passenger seats."
        },
        {
          "label": "Remaining luggage volume (L)",
          "text": "Compare luggage volumes with usable storage."
        },
        {
          "label": "Single bus capacity result",
          "text": "Require both seat and aggregate luggage capacities."
        }
      ],
      "example_questions": [
        "Use the Tour bus seat and luggage fit calculator.",
        "Help me calculate tour bus seat and luggage fit."
      ],
      "retrieval_phrases": [
        "Tour bus seat and luggage fit",
        "tour bus seat and luggage fit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,4,2",
            "b": "120,150,80",
            "c": 10,
            "d": 400
          },
          "outputs": [
            {
              "label": "Passenger seats required",
              "value": 9
            },
            {
              "label": "Remaining seats",
              "value": 1
            },
            {
              "label": "Remaining luggage volume (L)",
              "value": 50
            },
            {
              "label": "Single bus capacity result",
              "value": "Fits both supplied capacities"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1708",
      "name": "Visitor audio-guide device demand",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "Steady-flow average with sequential rental and charge/clean time. It excludes peak protection and battery endurance validation.",
      "url": "/calculators/visitor-audio-guide-device-demand/",
      "version": "80d08890576322bfde9f66d4c1bc48c99d82d13134dea573a26d806728cfbb9e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Visitor arrivals per hour",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visitors renting an audio guide (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average rental duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Charge and clean turnaround (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Serviceable audio-guide devices",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mean devices in full circulation",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Whole-device fleet for mean demand",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional devices for mean demand",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady-flow average with sequential rental and charge/clean time. It excludes peak protection and battery endurance validation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mean devices in full circulation",
          "text": "Multiply device arrival rate by rental plus turnaround duration."
        },
        {
          "label": "Whole-device fleet for mean demand",
          "text": "Round mean circulation inventory upward."
        },
        {
          "label": "Additional devices for mean demand",
          "text": "Subtract the serviceable fleet."
        }
      ],
      "example_questions": [
        "Use the Visitor audio-guide device demand calculator.",
        "Help me calculate visitor audio-guide device demand."
      ],
      "retrieval_phrases": [
        "Visitor audio-guide device demand",
        "visitor audio guide device demand"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 25,
            "c": 60,
            "d": 20,
            "e": 35
          },
          "outputs": [
            {
              "label": "Mean devices in full circulation",
              "value": 40
            },
            {
              "label": "Whole-device fleet for mean demand",
              "value": 40
            },
            {
              "label": "Additional devices for mean demand",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1711",
      "name": "Ride dispatch throughput worksheet",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "Aggregate throughput worksheet only; does not prescribe ride dispatch operations or safety limits.",
      "url": "/calculators/ride-dispatch-throughput-worksheet/",
      "version": "7c7623ffcff48c46660c6ed7eacea5044a9f572dec60c36d5d148da7b648b5f7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Seats per dispatch",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Dispatch interval (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Downtime per scheduled hour (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Observed seat occupancy (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Dispatches per scheduled hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Available seat throughput per hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected riders per scheduled hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Aggregate throughput worksheet only; does not prescribe ride dispatch operations or safety limits."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Dispatches per scheduled hour",
          "text": "Divide operating seconds by dispatch interval."
        },
        {
          "label": "Available seat throughput per hour",
          "text": "Multiply dispatches by seats."
        },
        {
          "label": "Expected riders per scheduled hour",
          "text": "Apply observed seat occupancy to capacity."
        }
      ],
      "example_questions": [
        "Use the Ride dispatch throughput worksheet calculator.",
        "Help me calculate ride dispatch throughput worksheet."
      ],
      "retrieval_phrases": [
        "Ride dispatch throughput worksheet",
        "ride dispatch throughput worksheet"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 120,
            "c": 10,
            "d": 80
          },
          "outputs": [
            {
              "label": "Dispatches per scheduled hour",
              "value": 25
            },
            {
              "label": "Available seat throughput per hour",
              "value": 500
            },
            {
              "label": "Expected riders per scheduled hour",
              "value": 400
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1714",
      "name": "Tour cancellation weather scenarios",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "Probabilities and refund terms are supplied, not weather forecasts or legal advice.",
      "url": "/calculators/tour-cancellation-weather-scenarios/",
      "version": "f46eb232bac028d86a08290fd84c3a7c0f461baab2c74e9c9d9792bd9d0c05c8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Weather scenario probabilities (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Gross booked revenue by scenario (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Refunds by scenario (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Operating and cancellation costs by scenario (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net contribution by scenario (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Probability-weighted contribution (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected refunds (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Probabilities and refund terms are supplied, not weather forecasts or legal advice."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net contribution by scenario (currency)",
          "text": "Deduct refunds and scenario-specific costs."
        },
        {
          "label": "Probability-weighted contribution (currency)",
          "text": "Weight scenario contributions by user probabilities."
        },
        {
          "label": "Expected refunds (currency)",
          "text": "Weight refunds by each scenario probability."
        }
      ],
      "example_questions": [
        "Use the Tour cancellation weather scenarios calculator.",
        "Help me calculate tour cancellation weather scenarios."
      ],
      "retrieval_phrases": [
        "Tour cancellation weather scenarios",
        "tour cancellation weather scenarios"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "75,25",
            "b": "1000,1000",
            "c": "0,1000",
            "d": "600,100"
          },
          "outputs": [
            {
              "label": "Net contribution by scenario (currency)",
              "value": "400, -100"
            },
            {
              "label": "Probability-weighted contribution (currency)",
              "value": 275
            },
            {
              "label": "Expected refunds (currency)",
              "value": 250
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1715",
      "name": "Tour minimum group viability",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "One departure with constant per-person cost and no tiered transport costs; excludes tax and overhead not entered.",
      "url": "/calculators/tour-minimum-group-viability/",
      "version": "7240e8c789f5e2daf3f80fb22b234881d7fad5c920c6ccc3f395bbbe3747dbc6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fixed guide cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Fixed transport cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Price per participant (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Variable cost per participant (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available participant capacity",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Break-even participants",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Contribution at capacity (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Capacity can reach break-even",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One departure with constant per-person cost and no tiered transport costs; excludes tax and overhead not entered."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Break-even participants",
          "text": "Divide fixed departure costs by participant contribution and round up."
        },
        {
          "label": "Contribution at capacity (currency)",
          "text": "Deduct fixed costs from full-capacity contribution."
        },
        {
          "label": "Capacity can reach break-even",
          "text": "Compare participant capacity with break-even count."
        }
      ],
      "example_questions": [
        "Use the Tour minimum group viability calculator.",
        "Help me calculate tour minimum group viability."
      ],
      "retrieval_phrases": [
        "Tour minimum group viability",
        "tour minimum group viability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 100,
            "c": 50,
            "d": 20,
            "e": 12
          },
          "outputs": [
            {
              "label": "Break-even participants",
              "value": 10
            },
            {
              "label": "Contribution at capacity (currency)",
              "value": 60
            },
            {
              "label": "Capacity can reach break-even",
              "value": "Yes"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1717",
      "name": "Tour itinerary walking workload",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "Paces are supplied per leg; no terrain, accessibility or fitness recommendation. Buffer is added at itinerary end.",
      "url": "/calculators/tour-itinerary-walking-workload/",
      "version": "9ec4e703cb5798b9d5b387bf4a3dcb411c826ea533cf7456c8b87e018d19fd03",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Walking leg distances (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Entered walking paces (minutes/km)",
          "type": "array",
          "required": true,
          "unit": "minutes/km",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Stop durations after each leg (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Additional itinerary buffer (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Walking time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total itinerary duration (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cumulative leg-and-stop end times (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Paces are supplied per leg; no terrain, accessibility or fitness recommendation. Buffer is added at itinerary end."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Walking time (minutes)",
          "text": "Multiply each leg distance by its entered pace."
        },
        {
          "label": "Total itinerary duration (minutes)",
          "text": "Add walking, stops and the chosen buffer."
        },
        {
          "label": "Cumulative leg-and-stop end times (minutes)",
          "text": "Accumulate travel and stops from the itinerary start."
        }
      ],
      "example_questions": [
        "Use the Tour itinerary walking workload calculator.",
        "Help me calculate tour itinerary walking workload."
      ],
      "retrieval_phrases": [
        "Tour itinerary walking workload",
        "tour itinerary walking workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,1",
            "b": "15,20",
            "c": "10,15",
            "d": 10
          },
          "outputs": [
            {
              "label": "Walking time (minutes)",
              "value": 50
            },
            {
              "label": "Total itinerary duration (minutes)",
              "value": 85
            },
            {
              "label": "Cumulative leg-and-stop end times (minutes)",
              "value": "40, 75"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1718",
      "name": "Attraction donation conversion ledger",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "Visitor and donor counts use a consistent unique-person basis over the same period; excludes processing fees.",
      "url": "/calculators/attraction-donation-conversion-ledger/",
      "version": "9d28d109db256575a8e0e33857a2ae80056e1ce9ae46c09e741f66e81c793083",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Visitors in reporting period",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Distinct donors",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Total donation receipts (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Donation uptake (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Donation value per visitor (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Average donation per donor (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Visitor and donor counts use a consistent unique-person basis over the same period; excludes processing fees."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Donation uptake (%)",
          "text": "Divide unique donors by visitors."
        },
        {
          "label": "Donation value per visitor (currency)",
          "text": "Divide donation receipts by all visitors."
        },
        {
          "label": "Average donation per donor (currency)",
          "text": "Divide receipts by distinct donors; zero when there are none."
        }
      ],
      "example_questions": [
        "Use the Attraction donation conversion ledger calculator.",
        "Help me calculate attraction donation conversion ledger."
      ],
      "retrieval_phrases": [
        "Attraction donation conversion ledger",
        "attraction donation conversion ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 100,
            "c": 500
          },
          "outputs": [
            {
              "label": "Donation uptake (%)",
              "value": 10
            },
            {
              "label": "Donation value per visitor (currency)",
              "value": 0.5
            },
            {
              "label": "Average donation per donor (currency)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1719",
      "name": "Attraction gift-shop capture",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "Transaction capture can exceed 100% when visitors purchase repeatedly; it is not a unique-buyer conversion rate.",
      "url": "/calculators/attraction-gift-shop-capture/",
      "version": "6ad2c10bcae9f62b6feddef97e8c699888e571b623c807cbc07a8cd0f55260b6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Attraction visitors",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Gift-shop transactions",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Gift-shop receipts (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Gift-shop goods cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Transactions per visitor (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Average basket (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Sales per visitor (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Goods contribution per visitor (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Transaction capture can exceed 100% when visitors purchase repeatedly; it is not a unique-buyer conversion rate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Transactions per visitor (%)",
          "text": "Divide shop transactions by attraction visits."
        },
        {
          "label": "Average basket (currency)",
          "text": "Divide sales receipts by transactions."
        },
        {
          "label": "Sales per visitor (currency)",
          "text": "Normalize gift-shop sales by attraction attendance."
        },
        {
          "label": "Goods contribution per visitor (currency)",
          "text": "Deduct goods cost before dividing by visitors."
        }
      ],
      "example_questions": [
        "Use the Attraction gift-shop capture calculator.",
        "Help me calculate attraction gift-shop capture."
      ],
      "retrieval_phrases": [
        "Attraction gift-shop capture",
        "attraction gift shop capture"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 200,
            "c": 3000,
            "d": 1200
          },
          "outputs": [
            {
              "label": "Transactions per visitor (%)",
              "value": 20
            },
            {
              "label": "Average basket (currency)",
              "value": 15
            },
            {
              "label": "Sales per visitor (currency)",
              "value": 3
            },
            {
              "label": "Goods contribution per visitor (currency)",
              "value": 1.8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1720",
      "name": "Museum membership renewal cohorts",
      "category": "Visitor attractions and tour operations",
      "status": "available",
      "purpose": "Cohorts must have completed the same renewal observation window; pending renewals should be excluded.",
      "url": "/calculators/museum-membership-renewal-cohorts/",
      "version": "d781c186648c0d6406e02513ec919813b5ac18a5efda93b4bb731f3f6afc38f8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Members due for renewal by cohort",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Members renewed by cohort",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Renewal rates by cohort (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Lapsed members by cohort",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Overall renewal rate (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Cohorts must have completed the same renewal observation window; pending renewals should be excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Renewal rates by cohort (%)",
          "text": "Divide renewed members by members due in each cohort."
        },
        {
          "label": "Lapsed members by cohort",
          "text": "Subtract renewals from each eligible cohort."
        },
        {
          "label": "Overall renewal rate (%)",
          "text": "Weight cohort rates by members due."
        }
      ],
      "example_questions": [
        "Use the Museum membership renewal cohorts calculator.",
        "Help me calculate museum membership renewal cohorts."
      ],
      "retrieval_phrases": [
        "Museum membership renewal cohorts",
        "museum membership renewal cohorts"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,80",
            "b": "70,60"
          },
          "outputs": [
            {
              "label": "Renewal rates by cohort (%)",
              "value": "70, 75"
            },
            {
              "label": "Lapsed members by cohort",
              "value": "30, 20"
            },
            {
              "label": "Overall renewal rate (%)",
              "value": 72.22222222222223
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1728",
      "name": "Salon colour inventory blend",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Mass-ratio inventory arithmetic only. Use compatible products and manufacturer-prescribed ratios; the tool does not recommend a formulation.",
      "url": "/calculators/salon-colour-inventory-blend/",
      "version": "089371510101c151d26150c52a7568ff00938ffc8138fa91a74e936dfaa700d2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required mixture batch mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Manufacturer product A ratio parts",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Manufacturer product B ratio parts",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Available product A (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available product B (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Product A required (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Product B required (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Product A shortage (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Product B shortage (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Mass-ratio inventory arithmetic only. Use compatible products and manufacturer-prescribed ratios; the tool does not recommend a formulation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Product A required (g)",
          "text": "Allocate batch mass by the supplied part ratio."
        },
        {
          "label": "Product B required (g)",
          "text": "Allocate the remaining mass using product B ratio."
        },
        {
          "label": "Product A shortage (g)",
          "text": "Compare the required amount with available stock."
        },
        {
          "label": "Product B shortage (g)",
          "text": "Compare product B requirement with available stock."
        }
      ],
      "example_questions": [
        "Use the Salon colour inventory blend calculator.",
        "Help me calculate salon colour inventory blend."
      ],
      "retrieval_phrases": [
        "Salon colour inventory blend",
        "salon colour inventory blend"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 1,
            "c": 2,
            "d": 50,
            "e": 70
          },
          "outputs": [
            {
              "label": "Product A required (g)",
              "value": 40
            },
            {
              "label": "Product B required (g)",
              "value": 80
            },
            {
              "label": "Product A shortage (g)",
              "value": 0
            },
            {
              "label": "Product B shortage (g)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1729",
      "name": "Salon colour bowl waste audit",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Measured usage audit only. Mixture cost is a supplied weighted cost, not a formulation recommendation.",
      "url": "/calculators/salon-colour-bowl-waste-audit/",
      "version": "7c1301e0deffa152ce9f204ff0910854535ffad93fac24b406ff7a9455d6cf44",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Prepared bowl masses by service (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Applied masses by service (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Discarded masses by service (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Mixture cost (currency/g)",
          "type": "number",
          "required": true,
          "unit": "currency/g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Recorded discard cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Discard share of prepared mixture (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unreconciled mixture by service (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Measured usage audit only. Mixture cost is a supplied weighted cost, not a formulation recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Recorded discard cost (currency)",
          "text": "Multiply discarded mass by mixture cost."
        },
        {
          "label": "Discard share of prepared mixture (%)",
          "text": "Divide measured discard by prepared mass."
        },
        {
          "label": "Unreconciled mixture by service (g)",
          "text": "Subtract application and discard from prepared bowls."
        }
      ],
      "example_questions": [
        "Use the Salon colour bowl waste audit calculator.",
        "Help me calculate salon colour bowl waste audit."
      ],
      "retrieval_phrases": [
        "Salon colour bowl waste audit",
        "salon colour bowl waste audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,120",
            "b": "80,90",
            "c": "15,25",
            "d": 0.1
          },
          "outputs": [
            {
              "label": "Recorded discard cost (currency)",
              "value": 4
            },
            {
              "label": "Discard share of prepared mixture (%)",
              "value": 18.181818181818183
            },
            {
              "label": "Unreconciled mixture by service (g)",
              "value": "5, 5"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1730",
      "name": "Salon service contribution per chair-hour",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Contribution excludes labour, fixed rent and taxes. Occupied-chair time includes unattended processing when the chair remains occupied.",
      "url": "/calculators/salon-service-contribution-per-chair-hour/",
      "version": "ecd352b97b50e771f7630b8e229435cba265c91e70e29c081a119ea18cdd2371",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Service prices (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Supplies cost per service (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Occupied chair minutes per service",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Service contributions (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Contribution per occupied chair-hour",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Highest contribution-rate service (1-based)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Contribution excludes labour, fixed rent and taxes. Occupied-chair time includes unattended processing when the chair remains occupied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Service contributions (currency)",
          "text": "Subtract service-specific supplies from receipts."
        },
        {
          "label": "Contribution per occupied chair-hour",
          "text": "Normalize each service contribution to occupied chair time."
        },
        {
          "label": "Highest contribution-rate service (1-based)",
          "text": "Choose the first service with the greatest chair-time contribution."
        }
      ],
      "example_questions": [
        "Use the Salon service contribution per chair-hour calculator.",
        "Help me calculate salon service contribution per chair-hour."
      ],
      "retrieval_phrases": [
        "Salon service contribution per chair-hour",
        "salon service contribution per chair hour"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "60,90",
            "b": "10,15",
            "c": "30,60"
          },
          "outputs": [
            {
              "label": "Service contributions (currency)",
              "value": "50, 75"
            },
            {
              "label": "Contribution per occupied chair-hour",
              "value": "100, 75"
            },
            {
              "label": "Highest contribution-rate service (1-based)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1731",
      "name": "Salon stylist commission tiers",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Two marginal tiers supplied by the user, not an all-sales retroactive rate. Payroll and legal treatment are excluded.",
      "url": "/calculators/salon-stylist-commission-tiers/",
      "version": "853b9e119ff0f770625f1f43b31defc0d4f6aa344e9c9193ff7e20a9f403c87c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible stylist receipts (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Refunds against eligible receipts (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "First commission band cap (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Rate in first band (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Rate above first band (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net commissionable receipts",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "First-band commission (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Upper-band commission (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Total commission (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Two marginal tiers supplied by the user, not an all-sales retroactive rate. Payroll and legal treatment are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net commissionable receipts",
          "text": "Deduct refunds from eligible receipts."
        },
        {
          "label": "First-band commission (currency)",
          "text": "Apply the first rate only up to the supplied band cap."
        },
        {
          "label": "Upper-band commission (currency)",
          "text": "Apply the second rate only to receipts above the cap."
        },
        {
          "label": "Total commission (currency)",
          "text": "Add marginal band commissions."
        }
      ],
      "example_questions": [
        "Use the Salon stylist commission tiers calculator.",
        "Help me calculate salon stylist commission tiers."
      ],
      "retrieval_phrases": [
        "Salon stylist commission tiers",
        "salon stylist commission tiers"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3000,
            "b": 200,
            "c": 2000,
            "d": 30,
            "e": 40
          },
          "outputs": [
            {
              "label": "Net commissionable receipts",
              "value": 2800
            },
            {
              "label": "First-band commission (currency)",
              "value": 600
            },
            {
              "label": "Upper-band commission (currency)",
              "value": 320
            },
            {
              "label": "Total commission (currency)",
              "value": 920
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1733",
      "name": "Salon no-show capacity loss",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Refilled slots recover the original service contribution in full. Lost contribution can be negative if fees exceed modeled losses.",
      "url": "/calculators/salon-no-show-capacity-loss/",
      "version": "213ec93eb297ef28d8f04ff8d277373ad296ec6d2204ce619e3ece5d9973ba15",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Missed service bookings",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cancelled slots refilled",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average booked service price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Avoided consumables per unserved booking (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Collected no-show fees in total (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unrecovered appointments",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Contribution lost before fees",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Net contribution lost after fees",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Refilled slots recover the original service contribution in full. Lost contribution can be negative if fees exceed modeled losses."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unrecovered appointments",
          "text": "Deduct refilled slots from missed bookings."
        },
        {
          "label": "Contribution lost before fees",
          "text": "Value unfilled slots at service contribution."
        },
        {
          "label": "Net contribution lost after fees",
          "text": "Offset lost contribution with collected fees."
        }
      ],
      "example_questions": [
        "Use the Salon no-show capacity loss calculator.",
        "Help me calculate salon no-show capacity loss."
      ],
      "retrieval_phrases": [
        "Salon no-show capacity loss",
        "salon no show capacity loss"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 5,
            "c": 60,
            "d": 10,
            "e": 100
          },
          "outputs": [
            {
              "label": "Unrecovered appointments",
              "value": 15
            },
            {
              "label": "Contribution lost before fees",
              "value": 750
            },
            {
              "label": "Net contribution lost after fees",
              "value": 650
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1736",
      "name": "Salon towel wash inventory",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Steady-rate use with opening reserve held separately; no hygiene cycle recommendation or peak-demand guarantee.",
      "url": "/calculators/salon-towel-wash-inventory/",
      "version": "0d8e51c48ac5cd07f460395feeb130eb8c55fcfebc85ab693de3db274775ab39",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Services per operating hour",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Towels per service",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Laundry round-trip time (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Towels required ready at opening",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Towels currently serviceable",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Towels entering wash per hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Circulating towels during laundry",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total par stock",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Additional towels required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady-rate use with opening reserve held separately; no hygiene cycle recommendation or peak-demand guarantee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Towels entering wash per hour",
          "text": "Multiply service rate by towels consumed per service."
        },
        {
          "label": "Circulating towels during laundry",
          "text": "Multiply towel demand by wash turnaround and round up."
        },
        {
          "label": "Total par stock",
          "text": "Add opening reserve to laundry circulation."
        },
        {
          "label": "Additional towels required",
          "text": "Compare modeled par stock with serviceable inventory."
        }
      ],
      "example_questions": [
        "Use the Salon towel wash inventory calculator.",
        "Help me calculate salon towel wash inventory."
      ],
      "retrieval_phrases": [
        "Salon towel wash inventory",
        "salon towel wash inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 8,
            "b": 3,
            "c": 4,
            "d": 30,
            "e": 100
          },
          "outputs": [
            {
              "label": "Towels entering wash per hour",
              "value": 24
            },
            {
              "label": "Circulating towels during laundry",
              "value": 96
            },
            {
              "label": "Total par stock",
              "value": 126
            },
            {
              "label": "Additional towels required",
              "value": 26
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1737",
      "name": "Salon retail product reorder",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "One review today with no outstanding receipts; use the same product-unit basis for retail and service consumption.",
      "url": "/calculators/salon-retail-product-reorder/",
      "version": "4bac909364fdb1eb44afe73dee91fbecace387eea8f1d269d4a920eb6e7cd4ce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Daily retail product sales by SKU",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Daily service use by SKU",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Replenishment lead times by SKU (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Usable stock by SKU",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Desired cover after delivery (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Demand through lead time and cover",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Units to order by SKU",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One review today with no outstanding receipts; use the same product-unit basis for retail and service consumption."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Demand through lead time and cover",
          "text": "Combine retail and service use over lead time plus cover."
        },
        {
          "label": "Units to order by SKU",
          "text": "Deduct usable stock and round positive requirements up."
        }
      ],
      "example_questions": [
        "Use the Salon retail product reorder calculator.",
        "Help me calculate salon retail product reorder."
      ],
      "retrieval_phrases": [
        "Salon retail product reorder",
        "salon retail product reorder"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": "1,1",
            "c": "5,4",
            "d": "10,20",
            "e": 2
          },
          "outputs": [
            {
              "label": "Demand through lead time and cover",
              "value": "21, 24"
            },
            {
              "label": "Units to order by SKU",
              "value": "11, 4"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1738",
      "name": "Salon rental chair agreement arithmetic",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Illustrative supplied agreement terms; includes both fixed rent and revenue share only when both apply. No employment-status determination.",
      "url": "/calculators/salon-rental-chair-agreement-arithmetic/",
      "version": "2f724d1f27e699225e9f25746cc5469b50188db209363061e55e878d68185a8f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Practitioner gross receipts (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Fixed chair rent (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Revenue share owed to salon (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Metered extras consumed (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Included extras (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Price per excess unit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Revenue share charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Extra usage charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Net practitioner receipts (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Illustrative supplied agreement terms; includes both fixed rent and revenue share only when both apply. No employment-status determination."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Revenue share charge (currency)",
          "text": "Apply the entered revenue share to gross receipts."
        },
        {
          "label": "Extra usage charge (currency)",
          "text": "Bill usage only above the included allowance."
        },
        {
          "label": "Net practitioner receipts (currency)",
          "text": "Subtract fixed rent, revenue share and excess usage."
        }
      ],
      "example_questions": [
        "Use the Salon rental chair agreement arithmetic calculator.",
        "Help me calculate salon rental chair agreement arithmetic."
      ],
      "retrieval_phrases": [
        "Salon rental chair agreement arithmetic",
        "salon rental chair agreement arithmetic"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3000,
            "b": 500,
            "c": 10,
            "d": 20,
            "e": 10,
            "f": 5
          },
          "outputs": [
            {
              "label": "Revenue share charge (currency)",
              "value": 300
            },
            {
              "label": "Extra usage charge (currency)",
              "value": 50
            },
            {
              "label": "Net practitioner receipts (currency)",
              "value": 2150
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1740",
      "name": "Salon service bundle profitability",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Same component services and costs in both purchase options. Processing time without active staff is excluded from labour hours.",
      "url": "/calculators/salon-service-bundle-profitability/",
      "version": "c887adbda7e0c13dfd3f9f266834bcce1ecde4b7a712bf53fd8db2a25a9d6657",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bundle selling price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consumable cost by service (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Active staff minutes by service",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Loaded staff hourly cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Bundle discount versus separate list prices (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total active staff time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Bundle contribution after labour (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Contribution per active staff-hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Separate-price contribution (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Same component services and costs in both purchase options. Processing time without active staff is excluded from labour hours."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total active staff time (minutes)",
          "text": "Add active labour for all bundle components."
        },
        {
          "label": "Bundle contribution after labour (currency)",
          "text": "Deduct consumables and supplied labour cost."
        },
        {
          "label": "Contribution per active staff-hour",
          "text": "Normalize contribution by active labour time."
        },
        {
          "label": "Separate-price contribution (currency)",
          "text": "Restore the given discount to compare identical services sold separately."
        }
      ],
      "example_questions": [
        "Use the Salon service bundle profitability calculator.",
        "Help me calculate salon service bundle profitability."
      ],
      "retrieval_phrases": [
        "Salon service bundle profitability",
        "salon service bundle profitability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "10,15",
            "c": "30,45",
            "d": 20,
            "e": 20
          },
          "outputs": [
            {
              "label": "Total active staff time (minutes)",
              "value": 75
            },
            {
              "label": "Bundle contribution after labour (currency)",
              "value": 50
            },
            {
              "label": "Contribution per active staff-hour",
              "value": 40
            },
            {
              "label": "Separate-price contribution (currency)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1743",
      "name": "Salon consultation form completeness",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Counts required fields only, not correctness or client suitability. Partial-form distribution cannot be inferred from aggregate field counts.",
      "url": "/calculators/salon-consultation-form-completeness/",
      "version": "1e92ad43e79e69750b6e11cd97f5154c0866c31534d63724140888afe821c701",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Forms submitted by service",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Required fields per form by service",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Completed required fields by service",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Missing required fields by service",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Overall field completion (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts required fields only, not correctness or client suitability. Partial-form distribution cannot be inferred from aggregate field counts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Missing required fields by service",
          "text": "Compare completed fields with required fields across all forms."
        },
        {
          "label": "Overall field completion (%)",
          "text": "Divide completed required fields by total required field opportunities."
        }
      ],
      "example_questions": [
        "Use the Salon consultation form completeness calculator.",
        "Help me calculate salon consultation form completeness."
      ],
      "retrieval_phrases": [
        "Salon consultation form completeness",
        "salon consultation form completeness"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,30",
            "b": "5,8",
            "c": "180,210"
          },
          "outputs": [
            {
              "label": "Missing required fields by service",
              "value": "20, 30"
            },
            {
              "label": "Overall field completion (%)",
              "value": 88.63636363636364
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1745",
      "name": "Salon haircut appointment variance",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Historical descriptive buffer only; the observed maximum does not guarantee future appointment duration.",
      "url": "/calculators/salon-haircut-appointment-variance/",
      "version": "b5a14fe611faf561c90dbd24dbb6bbf90f29b280a3b64a712bda941c982738ce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Booked appointment minutes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Actual appointment minutes",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Signed overruns by appointment (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mean positive overrun (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Buffer covering observed worst overrun (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Historical descriptive buffer only; the observed maximum does not guarantee future appointment duration."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Signed overruns by appointment (minutes)",
          "text": "Subtract booked minutes from actual duration."
        },
        {
          "label": "Mean positive overrun (minutes)",
          "text": "Average positive overruns over all appointments, counting early finishes as zero."
        },
        {
          "label": "Buffer covering observed worst overrun (minutes)",
          "text": "Report the largest observed positive overrun."
        }
      ],
      "example_questions": [
        "Use the Salon haircut appointment variance calculator.",
        "Help me calculate salon haircut appointment variance."
      ],
      "retrieval_phrases": [
        "Salon haircut appointment variance",
        "salon haircut appointment variance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,30,45",
            "b": "35,25,60"
          },
          "outputs": [
            {
              "label": "Signed overruns by appointment (minutes)",
              "value": "5, -5, 15"
            },
            {
              "label": "Mean positive overrun (minutes)",
              "value": 6.666666666666667
            },
            {
              "label": "Buffer covering observed worst overrun (minutes)",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1747",
      "name": "Salon product tester cost",
      "category": "Salon and appointment businesses",
      "status": "available",
      "purpose": "Assumes each bottle is used separately with no pooling of residual product; costs exclude staff and applicators.",
      "url": "/calculators/salon-product-tester-cost/",
      "version": "ba7d9e8f9dfa1b9ef321baf50ede7fa59bc44ac65574c8c14388784b2afb827c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Tester bottles issued",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Usable product per bottle (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured dose per trial (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Bottle purchase price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Measured handling loss per bottle (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Complete trials per bottle",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total complete trials",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Product cost per complete trial (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes each bottle is used separately with no pooling of residual product; costs exclude staff and applicators."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Complete trials per bottle",
          "text": "Deduct loss and divide by trial dose, rounding down."
        },
        {
          "label": "Total complete trials",
          "text": "Multiply complete trials by issued testers."
        },
        {
          "label": "Product cost per complete trial (currency)",
          "text": "Allocate full bottle cost to complete trials."
        }
      ],
      "example_questions": [
        "Use the Salon product tester cost calculator.",
        "Help me calculate salon product tester cost."
      ],
      "retrieval_phrases": [
        "Salon product tester cost",
        "salon product tester cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 100,
            "c": 2,
            "d": 20,
            "e": 10
          },
          "outputs": [
            {
              "label": "Complete trials per bottle",
              "value": 45
            },
            {
              "label": "Total complete trials",
              "value": 180
            },
            {
              "label": "Product cost per complete trial (currency)",
              "value": 0.4444444444444444
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1751",
      "name": "Freelance retainer capacity allocation",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Rollover amounts must already reflect each contract cap and expiry rule. Reserved hours are counted even if clients may not use them.",
      "url": "/calculators/freelance-retainer-capacity-allocation/",
      "version": "209e9224e31575cd9fd1306a3c8dd4813c77533369ae7fb7bbfb643a69eea05f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Retainer included hours by client",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Approved rollover hours by client",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Available delivery hours this period",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Hours already used by client",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total period entitlement (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining client entitlements (hours)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining delivery capacity (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Overcommitted period capacity (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rollover amounts must already reflect each contract cap and expiry rule. Reserved hours are counted even if clients may not use them."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total period entitlement (hours)",
          "text": "Add included and approved rollover hours."
        },
        {
          "label": "Remaining client entitlements (hours)",
          "text": "Subtract used hours from each client entitlement."
        },
        {
          "label": "Remaining delivery capacity (hours)",
          "text": "Deduct work already delivered from period availability."
        },
        {
          "label": "Overcommitted period capacity (hours)",
          "text": "Compare total reserved entitlement with delivery hours."
        }
      ],
      "example_questions": [
        "Use the Freelance retainer capacity allocation calculator.",
        "Help me calculate freelance retainer capacity allocation."
      ],
      "retrieval_phrases": [
        "Freelance retainer capacity allocation",
        "freelance retainer capacity allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,30",
            "b": "5,10",
            "c": 60,
            "d": "10,15"
          },
          "outputs": [
            {
              "label": "Total period entitlement (hours)",
              "value": 65
            },
            {
              "label": "Remaining client entitlements (hours)",
              "value": "15, 25"
            },
            {
              "label": "Remaining delivery capacity (hours)",
              "value": 35
            },
            {
              "label": "Overcommitted period capacity (hours)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1753",
      "name": "Tutor recurring lesson invoices",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "The entered chargeability counts embody the supplied cancellation policy. Dates can be grouped into mutually exclusive rate bands.",
      "url": "/calculators/tutor-recurring-lesson-invoices/",
      "version": "a80d6cfb52429acaaef99456eece13a97709ce8e27a161facee2d68cc744d9f6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Scheduled lesson counts by rate band",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Canceled lesson counts by rate band",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Chargeable cancellation counts by band",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Lesson prices by band (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Payments already received (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Billable lessons by band",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Invoice total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Outstanding balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The entered chargeability counts embody the supplied cancellation policy. Dates can be grouped into mutually exclusive rate bands."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Billable lessons by band",
          "text": "Subtract cancellations then restore those chargeable under the supplied policy."
        },
        {
          "label": "Invoice total (currency)",
          "text": "Multiply billable lessons by each rate."
        },
        {
          "label": "Outstanding balance (currency)",
          "text": "Subtract receipts from the invoice total."
        }
      ],
      "example_questions": [
        "Use the Tutor recurring lesson invoices calculator.",
        "Help me calculate tutor recurring lesson invoices."
      ],
      "retrieval_phrases": [
        "Tutor recurring lesson invoices",
        "tutor recurring lesson invoices"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,3",
            "b": "1,1",
            "c": "1,0",
            "d": "30,40",
            "e": 50
          },
          "outputs": [
            {
              "label": "Billable lessons by band",
              "value": "4, 2"
            },
            {
              "label": "Invoice total (currency)",
              "value": 200
            },
            {
              "label": "Outstanding balance (currency)",
              "value": 150
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1756",
      "name": "Mobile beautician kit replenishment",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "One consumable shared across multiple service types, with a user-selected travel reserve. Repeat with distinct products on separate worksheets.",
      "url": "/calculators/mobile-beautician-kit-replenishment/",
      "version": "f3a1277bb5b531cf9f529298f1737da7f8e7e242ece6e4716d81faedc052c401",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Booked service counts by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Consumable units per service type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Already packed consumable units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplier pack size (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Additional travel-day reserve units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Booked-service consumption (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unpacked shortage including reserve (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Packs to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One consumable shared across multiple service types, with a user-selected travel reserve. Repeat with distinct products on separate worksheets."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Booked-service consumption (units)",
          "text": "Multiply service counts by the supplied per-service recipe."
        },
        {
          "label": "Unpacked shortage including reserve (units)",
          "text": "Add travel reserve and deduct packed stock."
        },
        {
          "label": "Packs to purchase",
          "text": "Round the shortage to whole supplier packs."
        }
      ],
      "example_questions": [
        "Use the Mobile beautician kit replenishment calculator.",
        "Help me calculate mobile beautician kit replenishment."
      ],
      "retrieval_phrases": [
        "Mobile beautician kit replenishment",
        "mobile beautician kit replenishment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,2",
            "b": "3,5",
            "c": 15,
            "d": 10,
            "e": 3
          },
          "outputs": [
            {
              "label": "Booked-service consumption (units)",
              "value": 22
            },
            {
              "label": "Unpacked shortage including reserve (units)",
              "value": 10
            },
            {
              "label": "Packs to purchase",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1758",
      "name": "Professional organizer project estimate",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Rooms are worked sequentially with helpers sharing each room; productivity is per worker and scales linearly. No dependency or indivisibility model.",
      "url": "/calculators/professional-organizer-project-estimate/",
      "version": "194345685d541d950fe77ed0681ca7bcca542bd6aff6e1362f017958ad582dc1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Items to organize by room",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured items processed per worker-hour by room",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Helpers including lead organizer",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Daily productive hours per worker",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Labour hours by room",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total worker-hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Elapsed productive hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Whole workdays required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rooms are worked sequentially with helpers sharing each room; productivity is per worker and scales linearly. No dependency or indivisibility model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Labour hours by room",
          "text": "Divide room inventory by measured labour productivity."
        },
        {
          "label": "Total worker-hours",
          "text": "Add estimated room work."
        },
        {
          "label": "Elapsed productive hours",
          "text": "Divide divisible work by the number of helpers."
        },
        {
          "label": "Whole workdays required",
          "text": "Round elapsed work to available productive days."
        }
      ],
      "example_questions": [
        "Use the Professional organizer project estimate calculator.",
        "Help me calculate professional organizer project estimate."
      ],
      "retrieval_phrases": [
        "Professional organizer project estimate",
        "professional organizer project estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,60",
            "b": "20,30",
            "c": 2,
            "d": 5
          },
          "outputs": [
            {
              "label": "Labour hours by room",
              "value": "5, 2"
            },
            {
              "label": "Total worker-hours",
              "value": 7
            },
            {
              "label": "Elapsed productive hours",
              "value": 3.5
            },
            {
              "label": "Whole workdays required",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1759",
      "name": "Virtual assistant client workload",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Task durations and recurrence are entered estimates; assumes flexible work within the week and no deadlines inside that period.",
      "url": "/calculators/virtual-assistant-client-workload/",
      "version": "d34c5d02bb689617a1f9cf11591033f00951d9907ffbfad5696192fca72c936b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Weekly task repetitions by client",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Minutes per task by client",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Other weekly administration (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Available working hours per week",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Client workload hours",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total weekly demand (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused weekly capacity (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Weekly overload (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Task durations and recurrence are entered estimates; assumes flexible work within the week and no deadlines inside that period."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Client workload hours",
          "text": "Multiply recurrence by task minutes."
        },
        {
          "label": "Total weekly demand (hours)",
          "text": "Add client tasks and administration."
        },
        {
          "label": "Unused weekly capacity (hours)",
          "text": "Subtract demand from availability, floored at zero."
        },
        {
          "label": "Weekly overload (hours)",
          "text": "Report demand beyond available time."
        }
      ],
      "example_questions": [
        "Use the Virtual assistant client workload calculator.",
        "Help me calculate virtual assistant client workload."
      ],
      "retrieval_phrases": [
        "Virtual assistant client workload",
        "virtual assistant client workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,5",
            "b": "30,60",
            "c": 2,
            "d": 15
          },
          "outputs": [
            {
              "label": "Client workload hours",
              "value": "5, 5"
            },
            {
              "label": "Total weekly demand (hours)",
              "value": 12
            },
            {
              "label": "Unused weekly capacity (hours)",
              "value": 3
            },
            {
              "label": "Weekly overload (hours)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1760",
      "name": "Photographer editing delivery queue",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Working-day offsets exclude holidays by construction. Jobs stay in entered order; measured speed includes all required editing steps.",
      "url": "/calculators/photographer-editing-delivery-queue/",
      "version": "336e5d0e08de0e75f99f612e888dac7a5e2ae05152daca037045c5e9e085e56a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Images to edit by queued job",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured editing speed (images/hour)",
          "type": "number",
          "required": true,
          "unit": "images/hour",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Editing hours available per workday",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Deadlines in working days from now",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Job editing hours",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cumulative completion workdays",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Deadline overruns (workdays)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Working-day offsets exclude holidays by construction. Jobs stay in entered order; measured speed includes all required editing steps."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Job editing hours",
          "text": "Divide remaining images by measured editing speed."
        },
        {
          "label": "Cumulative completion workdays",
          "text": "Schedule jobs in input order on one editing stream."
        },
        {
          "label": "Deadline overruns (workdays)",
          "text": "Compare cumulative completion with each entered deadline."
        }
      ],
      "example_questions": [
        "Use the Photographer editing delivery queue calculator.",
        "Help me calculate photographer editing delivery queue."
      ],
      "retrieval_phrases": [
        "Photographer editing delivery queue",
        "photographer editing delivery queue"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": 50,
            "c": 4,
            "d": "1,2"
          },
          "outputs": [
            {
              "label": "Job editing hours",
              "value": "2, 4"
            },
            {
              "label": "Cumulative completion workdays",
              "value": "0.5, 1.5"
            },
            {
              "label": "Deadline overruns (workdays)",
              "value": "0, 0"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1761",
      "name": "Wedding supplier installment tracker",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Milestone day offsets and contract percentages are supplied. Payments are allocated explicitly, with no implied legal late-fee rule.",
      "url": "/calculators/wedding-supplier-installment-tracker/",
      "version": "646d967f8b14babaac63e7c6ce32f3ea103e1381e3908e45747f6bf2694b0920",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Supplier contract total (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Milestone installment percentages",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Payments against each milestone (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Days from today until each milestone",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Milestone amounts due (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unpaid amounts by milestone (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total unpaid balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Currently due unpaid amount (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Milestone day offsets and contract percentages are supplied. Payments are allocated explicitly, with no implied legal late-fee rule."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Milestone amounts due (currency)",
          "text": "Allocate contract value by supplied installment percentages."
        },
        {
          "label": "Unpaid amounts by milestone (currency)",
          "text": "Deduct payments assigned to each milestone."
        },
        {
          "label": "Total unpaid balance (currency)",
          "text": "Subtract all payments from contract total."
        },
        {
          "label": "Currently due unpaid amount (currency)",
          "text": "Include unpaid milestones on or before today."
        }
      ],
      "example_questions": [
        "Use the Wedding supplier installment tracker calculator.",
        "Help me calculate wedding supplier installment tracker."
      ],
      "retrieval_phrases": [
        "Wedding supplier installment tracker",
        "wedding supplier installment tracker"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2000,
            "b": "25,50,25",
            "c": "500,600,0",
            "d": "0,30,60"
          },
          "outputs": [
            {
              "label": "Milestone amounts due (currency)",
              "value": "500, 1000, 500"
            },
            {
              "label": "Unpaid amounts by milestone (currency)",
              "value": "0, 400, 500"
            },
            {
              "label": "Total unpaid balance (currency)",
              "value": 900
            },
            {
              "label": "Currently due unpaid amount (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1763",
      "name": "Repair shop diagnostic fee allocation",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Assumes the listed repair is approved. Credit is capped at repair charges and no refund of unused credit is modeled.",
      "url": "/calculators/repair-shop-diagnostic-fee-allocation/",
      "version": "ac90b74d8e0c071dafd837e49d87e6052aad8a66e0e76f40ddb9e0415d758e10",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Diagnostic fee (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Approved repair labour (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Approved repair parts (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Diagnostic fee credit toward repair (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Diagnostic fee already paid (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Diagnostic credit (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total customer charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Outstanding customer balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the listed repair is approved. Credit is capped at repair charges and no refund of unused credit is modeled."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Diagnostic credit (currency)",
          "text": "Apply supplied credit percentage capped at approved repair value."
        },
        {
          "label": "Total customer charge (currency)",
          "text": "Add diagnostics and repair, then deduct the credit."
        },
        {
          "label": "Outstanding customer balance (currency)",
          "text": "Deduct diagnostic payment already received."
        }
      ],
      "example_questions": [
        "Use the Repair shop diagnostic fee allocation calculator.",
        "Help me calculate repair shop diagnostic fee allocation."
      ],
      "retrieval_phrases": [
        "Repair shop diagnostic fee allocation",
        "repair shop diagnostic fee allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 120,
            "c": 80,
            "d": 100,
            "e": 60
          },
          "outputs": [
            {
              "label": "Diagnostic credit (currency)",
              "value": 60
            },
            {
              "label": "Total customer charge (currency)",
              "value": 200
            },
            {
              "label": "Outstanding customer balance (currency)",
              "value": 140
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1764",
      "name": "Language class seat economics",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "One class term with fixed teacher and venue cost across entered scenarios; physical class capacity is not determined.",
      "url": "/calculators/language-class-seat-economics/",
      "version": "20198ad94d3e6e5899813bdfcad2b1a7bfe14d375e3b24e183e9b941ffa71f2a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Enrollment scenarios (students)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Tuition per student (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Teacher cost per class term (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Venue cost per class term (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Materials per student (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Term contribution by enrollment (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Break-even enrollment",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total teacher-and-venue cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One class term with fixed teacher and venue cost across entered scenarios; physical class capacity is not determined."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Term contribution by enrollment (currency)",
          "text": "Deduct teacher, venue and per-student material costs from tuition."
        },
        {
          "label": "Break-even enrollment",
          "text": "Divide fixed term costs by contribution per student."
        },
        {
          "label": "Total teacher-and-venue cost (currency)",
          "text": "Add fixed term costs."
        }
      ],
      "example_questions": [
        "Use the Language class seat economics calculator.",
        "Help me calculate language class seat economics."
      ],
      "retrieval_phrases": [
        "Language class seat economics",
        "language class seat economics"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,10,15",
            "b": 100,
            "c": 500,
            "d": 200,
            "e": 20
          },
          "outputs": [
            {
              "label": "Term contribution by enrollment (currency)",
              "value": "-300, 100, 500"
            },
            {
              "label": "Break-even enrollment",
              "value": 9
            },
            {
              "label": "Total teacher-and-venue cost (currency)",
              "value": 700
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1766",
      "name": "Home tutor travel-zone pricing",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Return is before tax and fixed business overhead. Travel figures must be round trips and prices exclude discounts.",
      "url": "/calculators/home-tutor-travel-zone-pricing/",
      "version": "832a9c9758ac6beb5de117f311a8361f757914da624d4a3f2cf407cbd9717466",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Round-trip travel minutes by zone",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Round-trip travel expense by zone (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Lesson duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Desired return per total working hour (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Other direct lesson expenses (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Minimum lesson price by zone (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total working minutes by zone",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Return is before tax and fixed business overhead. Travel figures must be round trips and prices exclude discounts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Minimum lesson price by zone (currency)",
          "text": "Fund the target hourly return on lesson plus travel time and reimburse direct expenses."
        },
        {
          "label": "Total working minutes by zone",
          "text": "Add lesson time to round-trip travel."
        }
      ],
      "example_questions": [
        "Use the Home tutor travel-zone pricing calculator.",
        "Help me calculate home tutor travel-zone pricing."
      ],
      "retrieval_phrases": [
        "Home tutor travel-zone pricing",
        "home tutor travel zone pricing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,60",
            "b": "5,10",
            "c": 60,
            "d": 30,
            "e": 5
          },
          "outputs": [
            {
              "label": "Minimum lesson price by zone (currency)",
              "value": "55, 75"
            },
            {
              "label": "Total working minutes by zone",
              "value": "90, 120"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1767",
      "name": "Service cancellation revenue recovery",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Cancellation fee is collected only when a slot remains unfilled; refilled bookings have the same contribution as the original service.",
      "url": "/calculators/service-cancellation-revenue-recovery/",
      "version": "71631555b063d01cff37f43fdfd81365961eff372216654769a581e325d8a037",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Canceled service slots",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Probability of refilling each slot (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Replacement service price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Variable cost of delivered service (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cancellation fee per unfilled slot (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected replacement bookings",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected recovered contribution (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unrecovered contribution versus full service (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Cancellation fee is collected only when a slot remains unfilled; refilled bookings have the same contribution as the original service."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected replacement bookings",
          "text": "Multiply cancellations by assumed refill probability."
        },
        {
          "label": "Expected recovered contribution (currency)",
          "text": "Weight replacement contribution and fees on unfilled slots."
        },
        {
          "label": "Unrecovered contribution versus full service (currency)",
          "text": "Compare recovery with contribution if all original services occurred."
        }
      ],
      "example_questions": [
        "Use the Service cancellation revenue recovery calculator.",
        "Help me calculate service cancellation revenue recovery."
      ],
      "retrieval_phrases": [
        "Service cancellation revenue recovery",
        "service cancellation revenue recovery"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 60,
            "c": 100,
            "d": 30,
            "e": 20
          },
          "outputs": [
            {
              "label": "Expected replacement bookings",
              "value": 6
            },
            {
              "label": "Expected recovered contribution (currency)",
              "value": 500
            },
            {
              "label": "Unrecovered contribution versus full service (currency)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1768",
      "name": "Service credit expiry liability",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Face-value exposure worksheet, not accounting recognition or a conclusion about enforceability of expiry. All cohorts are unexpired at reporting time.",
      "url": "/calculators/service-credit-expiry-liability/",
      "version": "1b3c3037d7652f0c1394ced5e2f7dda450231744416e2778022df513515a1754",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unredeemed credit face values by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Days until cohort expiry",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Expected redemption before expiry by cohort (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Reporting horizon (days)",
          "type": "integer",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total outstanding face value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Face value expiring within horizon (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected redemption value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Expected unused face value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Face-value exposure worksheet, not accounting recognition or a conclusion about enforceability of expiry. All cohorts are unexpired at reporting time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total outstanding face value (currency)",
          "text": "Add all currently unredeemed credits."
        },
        {
          "label": "Face value expiring within horizon (currency)",
          "text": "Select cohorts whose supplied expiry offset is inside the horizon."
        },
        {
          "label": "Expected redemption value (currency)",
          "text": "Apply each cohort redemption assumption."
        },
        {
          "label": "Expected unused face value (currency)",
          "text": "Deduct expected redemption from each cohort balance."
        }
      ],
      "example_questions": [
        "Use the Service credit expiry liability calculator.",
        "Help me calculate service credit expiry liability."
      ],
      "retrieval_phrases": [
        "Service credit expiry liability",
        "service credit expiry liability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,500",
            "b": "30,60",
            "c": "80,60",
            "d": 45
          },
          "outputs": [
            {
              "label": "Total outstanding face value (currency)",
              "value": 1500
            },
            {
              "label": "Face value expiring within horizon (currency)",
              "value": 1000
            },
            {
              "label": "Expected redemption value (currency)",
              "value": 1100
            },
            {
              "label": "Expected unused face value (currency)",
              "value": 399.99999999999994
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1769",
      "name": "Consultant scope-change estimate",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Task ranges are entered bounds, not statistical confidence intervals. All added effort is sequentially scheduled after existing scope.",
      "url": "/calculators/consultant-scope-change-estimate/",
      "version": "774d26f40c7f6f4ebcb76f4c8553dc803ef5103ddccbe3b524b7aac76a9d5dcd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Additional task low estimates (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Additional task high estimates (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Hourly billing rate (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Existing accepted quote (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Daily available project hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Revised low quote (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Revised high quote (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional low workdays",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Additional high workdays",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Task ranges are entered bounds, not statistical confidence intervals. All added effort is sequentially scheduled after existing scope."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Revised low quote (currency)",
          "text": "Add low additional effort at the entered billing rate."
        },
        {
          "label": "Revised high quote (currency)",
          "text": "Add high additional effort at the same rate."
        },
        {
          "label": "Additional low workdays",
          "text": "Divide low effort by available project hours per day."
        },
        {
          "label": "Additional high workdays",
          "text": "Divide high effort by daily project availability."
        }
      ],
      "example_questions": [
        "Use the Consultant scope-change estimate calculator.",
        "Help me calculate consultant scope-change estimate."
      ],
      "retrieval_phrases": [
        "Consultant scope-change estimate",
        "consultant scope change estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": "4,5",
            "c": 100,
            "d": 2000,
            "e": 4
          },
          "outputs": [
            {
              "label": "Revised low quote (currency)",
              "value": 2500
            },
            {
              "label": "Revised high quote (currency)",
              "value": 2900
            },
            {
              "label": "Additional low workdays",
              "value": 1.25
            },
            {
              "label": "Additional high workdays",
              "value": 2.25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1770",
      "name": "Freelancer invoice collection aging",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Signed day offsets are supplied from contractual due dates; due today is current. Disputes, credit notes and interest are excluded.",
      "url": "/calculators/freelancer-invoice-collection-aging/",
      "version": "347615025c7cc98082a44d11c388748981c71be37667c6be2e9c50998a22e9a5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Invoice face values (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Receipts allocated to invoices (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Days overdue at report date",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Not yet due balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "1–30 days overdue balance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "31–90 days overdue balance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Over 90 days overdue balance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Total outstanding (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Signed day offsets are supplied from contractual due dates; due today is current. Disputes, credit notes and interest are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Not yet due balance (currency)",
          "text": "Include invoices due today or later."
        },
        {
          "label": "1–30 days overdue balance",
          "text": "Sum unpaid balances in the first overdue band."
        },
        {
          "label": "31–90 days overdue balance",
          "text": "Sum unpaid balances in the middle band."
        },
        {
          "label": "Over 90 days overdue balance",
          "text": "Sum unpaid balances beyond ninety days."
        },
        {
          "label": "Total outstanding (currency)",
          "text": "Add all invoice balances after allocated receipts."
        }
      ],
      "example_questions": [
        "Use the Freelancer invoice collection aging calculator.",
        "Help me calculate freelancer invoice collection aging."
      ],
      "retrieval_phrases": [
        "Freelancer invoice collection aging",
        "freelancer invoice collection aging"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200,300,400",
            "b": "0,50,100,0",
            "c": "-5,15,45,100"
          },
          "outputs": [
            {
              "label": "Not yet due balance (currency)",
              "value": 100
            },
            {
              "label": "1–30 days overdue balance",
              "value": 150
            },
            {
              "label": "31–90 days overdue balance",
              "value": 200
            },
            {
              "label": "Over 90 days overdue balance",
              "value": 400
            },
            {
              "label": "Total outstanding (currency)",
              "value": 850
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1771",
      "name": "Workshop instructor materials allocation",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Existing kits have no new purchase cost and are usable; shared kits are allocated to whole groups with one partial final group allowed.",
      "url": "/calculators/workshop-instructor-materials-allocation/",
      "version": "58cd6ad620722f7b14324edf80674a4ae78d5d625afac5feefaf47fdc41590a9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Workshop participants",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Participants sharing each group kit",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Individual kits in stock",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Shared kits in stock",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Individual kit cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Shared kit cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Individual kits to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Shared kits to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Purchase cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Purchase cost per participant",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Existing kits have no new purchase cost and are usable; shared kits are allocated to whole groups with one partial final group allowed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Individual kits to purchase",
          "text": "Provide one individual kit per participant."
        },
        {
          "label": "Shared kits to purchase",
          "text": "Round participant groups up and deduct shared-kit stock."
        },
        {
          "label": "Purchase cost (currency)",
          "text": "Price only missing individual and shared kits."
        },
        {
          "label": "Purchase cost per participant",
          "text": "Spread purchases across participants, zero for an empty workshop."
        }
      ],
      "example_questions": [
        "Use the Workshop instructor materials allocation calculator.",
        "Help me calculate workshop instructor materials allocation."
      ],
      "retrieval_phrases": [
        "Workshop instructor materials allocation",
        "workshop instructor materials allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 24,
            "b": 4,
            "c": 10,
            "d": 3,
            "e": 5,
            "f": 20
          },
          "outputs": [
            {
              "label": "Individual kits to purchase",
              "value": 14
            },
            {
              "label": "Shared kits to purchase",
              "value": 3
            },
            {
              "label": "Purchase cost (currency)",
              "value": 130
            },
            {
              "label": "Purchase cost per participant",
              "value": 5.416666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1772",
      "name": "House-call minimum fee threshold",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Target contribution is before fixed overhead and tax. Rates and job times are user assumptions, not a market quote.",
      "url": "/calculators/house-call-minimum-fee-threshold/",
      "version": "fd8b88256c41ad86f0a5237b045abc3949ebb7438acba046af403920f188e4bc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Round-trip travel time (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visit setup time (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Billable work time (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Desired contribution per occupied hour (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Direct travel expense (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Direct job materials (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total occupied time (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minimum visit fee (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Contribution at minimum fee (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Target contribution is before fixed overhead and tax. Rates and job times are user assumptions, not a market quote."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total occupied time (hours)",
          "text": "Include travel, setup and job time."
        },
        {
          "label": "Minimum visit fee (currency)",
          "text": "Fund desired contribution over all occupied time and recover expenses."
        },
        {
          "label": "Contribution at minimum fee (currency)",
          "text": "Report the amount remaining after listed direct expenses."
        }
      ],
      "example_questions": [
        "Use the House-call minimum fee threshold calculator.",
        "Help me calculate house-call minimum fee threshold."
      ],
      "retrieval_phrases": [
        "House-call minimum fee threshold",
        "house call minimum fee threshold"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 20,
            "c": 60,
            "d": 40,
            "e": 10,
            "f": 20
          },
          "outputs": [
            {
              "label": "Total occupied time (hours)",
              "value": 2
            },
            {
              "label": "Minimum visit fee (currency)",
              "value": 110
            },
            {
              "label": "Contribution at minimum fee (currency)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1773",
      "name": "Service booking lead-time profile",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Inputs are nonnegative day differences calculated on a consistent date basis. Describes completed observations only.",
      "url": "/calculators/service-booking-lead-time-profile/",
      "version": "40814a2764aedd601f8dc98de5e2b51e3f616458f160b5d0d0769a996de1262d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Booking lead times for service A (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Booking lead times for service B (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Service A mean lead time (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Service B mean lead time (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Combined mean lead time (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Shortest and longest lead time (days)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Inputs are nonnegative day differences calculated on a consistent date basis. Describes completed observations only."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Service A mean lead time (days)",
          "text": "Average days between booking and appointment for service A."
        },
        {
          "label": "Service B mean lead time (days)",
          "text": "Average observed lead times for service B."
        },
        {
          "label": "Combined mean lead time (days)",
          "text": "Weight service means by their booking counts."
        },
        {
          "label": "Shortest and longest lead time (days)",
          "text": "Report the observed combined range."
        }
      ],
      "example_questions": [
        "Use the Service booking lead-time profile calculator.",
        "Help me calculate service booking lead-time profile."
      ],
      "retrieval_phrases": [
        "Service booking lead-time profile",
        "service booking lead time profile"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,4,6",
            "b": "7,14,21"
          },
          "outputs": [
            {
              "label": "Service A mean lead time (days)",
              "value": 4
            },
            {
              "label": "Service B mean lead time (days)",
              "value": 14
            },
            {
              "label": "Combined mean lead time (days)",
              "value": 9
            },
            {
              "label": "Shortest and longest lead time (days)",
              "value": "2, 21"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1775",
      "name": "Solo business holiday income reserve",
      "category": "Personal service business administration",
      "status": "available",
      "purpose": "Cash timing is assumed compatible with payment dates; no interest or tax estimate. Owner draw is optional and can be entered as zero.",
      "url": "/calculators/solo-business-holiday-income-reserve/",
      "version": "bcde74b701e9c389525faf90b1f26fac4ecad56b5a24626a924e8853145daa06",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Planned nonworking weeks",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Weekly unavoidable business costs (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Weekly planned owner draw (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Expected receipts during leave (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cash already earmarked (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Saving weeks before leave",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Leave funding requirement (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Additional reserve needed (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Weekly saving target (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Cash timing is assumed compatible with payment dates; no interest or tax estimate. Owner draw is optional and can be entered as zero."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Leave funding requirement (currency)",
          "text": "Deduct expected leave-period receipts from costs and owner draw."
        },
        {
          "label": "Additional reserve needed (currency)",
          "text": "Deduct earmarked cash as well as expected receipts."
        },
        {
          "label": "Weekly saving target (currency)",
          "text": "Spread the remaining reserve over saving weeks."
        }
      ],
      "example_questions": [
        "Use the Solo business holiday income reserve calculator.",
        "Help me calculate solo business holiday income reserve."
      ],
      "retrieval_phrases": [
        "Solo business holiday income reserve",
        "solo business holiday income reserve"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 300,
            "c": 500,
            "d": 1000,
            "e": 500,
            "f": 10
          },
          "outputs": [
            {
              "label": "Leave funding requirement (currency)",
              "value": 2200
            },
            {
              "label": "Additional reserve needed (currency)",
              "value": 1700
            },
            {
              "label": "Weekly saving target (currency)",
              "value": 170
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1776",
      "name": "Plumber callout quote worksheet",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Supplied tariff treats travel as chargeable labour and includes the entered minutes in the fixed callout. No tax, diagnosis or trade-work recommendation.",
      "url": "/calculators/plumber-callout-quote-worksheet/",
      "version": "60bfb03e42ec105fe1e3ee98f221e2bf040ec8e7b00117a3a35da4c8b331db2d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Round-trip travel minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Diagnostic minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Repair labour minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Labour rate (currency/hour)",
          "type": "number",
          "required": true,
          "unit": "currency/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Parts cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Fixed callout charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Included labour minutes in callout",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Chargeable labour minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Labour charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Itemized quote total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supplied tariff treats travel as chargeable labour and includes the entered minutes in the fixed callout. No tax, diagnosis or trade-work recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Chargeable labour minutes",
          "text": "Deduct included minutes from total travel, diagnosis and repair time."
        },
        {
          "label": "Labour charge (currency)",
          "text": "Convert chargeable minutes to hours and apply labour rate."
        },
        {
          "label": "Itemized quote total (currency)",
          "text": "Add callout, parts and labour."
        }
      ],
      "example_questions": [
        "Use the Plumber callout quote worksheet calculator.",
        "Help me calculate plumber callout quote worksheet."
      ],
      "retrieval_phrases": [
        "Plumber callout quote worksheet",
        "plumber callout quote worksheet"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 30,
            "c": 60,
            "d": 60,
            "e": 80,
            "f": 40,
            "g": 30
          },
          "outputs": [
            {
              "label": "Chargeable labour minutes",
              "value": 90
            },
            {
              "label": "Labour charge (currency)",
              "value": 90
            },
            {
              "label": "Itemized quote total (currency)",
              "value": 210
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1779",
      "name": "Carpenter fixings schedule",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Fixing quantities must come from an approved assembly specification; this worksheet only calculates procurement quantities.",
      "url": "/calculators/carpenter-fixings-schedule/",
      "version": "ebb46ad0f8c9514c9e67c586b9d5fd3ccdd425d19afe870c4b65271dd5739972",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Assembly joints by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Specified fixings per joint by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Fixings per supplier pack by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Existing fixings by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required fixings by type",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Purchase packs by type",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Stock after assembly by type",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixing quantities must come from an approved assembly specification; this worksheet only calculates procurement quantities."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required fixings by type",
          "text": "Multiply joint counts by specified fixings per joint."
        },
        {
          "label": "Purchase packs by type",
          "text": "Deduct stock and round each fixing type to whole packs."
        },
        {
          "label": "Stock after assembly by type",
          "text": "Reconcile opening inventory, purchased packs and usage."
        }
      ],
      "example_questions": [
        "Use the Carpenter fixings schedule calculator.",
        "Help me calculate carpenter fixings schedule."
      ],
      "retrieval_phrases": [
        "Carpenter fixings schedule",
        "carpenter fixings schedule"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "4,2",
            "c": "25,30",
            "d": "5,0"
          },
          "outputs": [
            {
              "label": "Required fixings by type",
              "value": "40, 40"
            },
            {
              "label": "Purchase packs by type",
              "value": "2, 2"
            },
            {
              "label": "Stock after assembly by type",
              "value": "15, 20"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1782",
      "name": "Trades quote validity exposure",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "A quote remains valid through its expiry day. Price increases are user scenarios; no market forecast or contractual enforceability inference.",
      "url": "/calculators/trades-quote-validity-exposure/",
      "version": "22a2f0a8bc3a37f1110068ccd7191290bcaa8e4395f447dff4a5512c5a08931b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Quoted material costs by line (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Days until supplier quote expires",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Planned purchase days from today",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Assumed increase after expiry (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Material cost exposed to expiry (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Scenario extra cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Revised material budget (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A quote remains valid through its expiry day. Price increases are user scenarios; no market forecast or contractual enforceability inference."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Material cost exposed to expiry (currency)",
          "text": "Select purchases scheduled after the quoted price expires."
        },
        {
          "label": "Scenario extra cost (currency)",
          "text": "Apply the assumed price increase only to exposed costs."
        },
        {
          "label": "Revised material budget (currency)",
          "text": "Add the exposure contingency to original material costs."
        }
      ],
      "example_questions": [
        "Use the Trades quote validity exposure calculator.",
        "Help me calculate trades quote validity exposure."
      ],
      "retrieval_phrases": [
        "Trades quote validity exposure",
        "trades quote validity exposure"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,500",
            "b": "10,30",
            "c": "20,20",
            "d": 10
          },
          "outputs": [
            {
              "label": "Material cost exposed to expiry (currency)",
              "value": 1000
            },
            {
              "label": "Scenario extra cost (currency)",
              "value": 100
            },
            {
              "label": "Revised material budget (currency)",
              "value": 1600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1783",
      "name": "Trades waste disposal ticket tally",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Rates are supplied and no waste classification or disposal authorization is determined; all weights use the same mass basis.",
      "url": "/calculators/trades-waste-disposal-ticket-tally/",
      "version": "4a19cbd7d84adcfd7a25d145b61754a54b178bd2e64730ade8159834c042c1bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured waste loads by type (tonnes)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Gate fees per tonne by type (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Tickets received by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Expected tickets by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Fixed haulage total (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Disposal charges by type (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total disposal and haulage (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Missing tickets by type",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rates are supplied and no waste classification or disposal authorization is determined; all weights use the same mass basis."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Disposal charges by type (currency)",
          "text": "Multiply measured loads by their entered gate tariffs."
        },
        {
          "label": "Total disposal and haulage (currency)",
          "text": "Add gate fees and fixed haulage."
        },
        {
          "label": "Missing tickets by type",
          "text": "Compare expected and received disposal records."
        }
      ],
      "example_questions": [
        "Use the Trades waste disposal ticket tally calculator.",
        "Help me calculate trades waste disposal ticket tally."
      ],
      "retrieval_phrases": [
        "Trades waste disposal ticket tally",
        "trades waste disposal ticket tally"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": "100,80",
            "c": "2,2",
            "d": "2,3",
            "e": 50
          },
          "outputs": [
            {
              "label": "Disposal charges by type (currency)",
              "value": "200, 240"
            },
            {
              "label": "Total disposal and haulage (currency)",
              "value": 490
            },
            {
              "label": "Missing tickets by type",
              "value": "0, 1"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1784",
      "name": "Trades access delay cost",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Entered rates govern this scenario. Restart cost is included once even if delay is zero; enter zero when no restart is incurred.",
      "url": "/calculators/trades-access-delay-cost/",
      "version": "ab91a5c59d60f636ff0228f09d4b4dbb77581db2ce800b19ae064a2ec354e0a3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Idle crew members",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Crew standby rate per person-hour (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Equipment standby rate per hour (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Access delay (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Unavoidable restart cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Crew standby cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Equipment standby cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total delay scenario cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Entered rates govern this scenario. Restart cost is included once even if delay is zero; enter zero when no restart is incurred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Crew standby cost (currency)",
          "text": "Multiply crew size, hourly standby rate and delay."
        },
        {
          "label": "Equipment standby cost (currency)",
          "text": "Apply equipment hourly charge over the delay."
        },
        {
          "label": "Total delay scenario cost (currency)",
          "text": "Add crew, equipment and entered restart costs."
        }
      ],
      "example_questions": [
        "Use the Trades access delay cost calculator.",
        "Help me calculate trades access delay cost."
      ],
      "retrieval_phrases": [
        "Trades access delay cost",
        "trades access delay cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 30,
            "c": 80,
            "d": 2,
            "e": 50
          },
          "outputs": [
            {
              "label": "Crew standby cost (currency)",
              "value": 240
            },
            {
              "label": "Equipment standby cost (currency)",
              "value": 160
            },
            {
              "label": "Total delay scenario cost (currency)",
              "value": 450
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1785",
      "name": "Trades stage payment reconciliation",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "One constant supplied retention rate with no cap, tax or release. Negative payment due indicates an overpayment/adjustment for review.",
      "url": "/calculators/trades-stage-payment-reconciliation/",
      "version": "f6dd13590f3d3a50c1c94007c3ff533fc6be683b0dcf6bf94b023d1e9ea3cbb4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cumulative completed-work valuation (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Retention percentage",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Previous certified payments (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Approved current-period deductions (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cumulative retention (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cumulative net certified value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Current payment due (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One constant supplied retention rate with no cap, tax or release. Negative payment due indicates an overpayment/adjustment for review."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cumulative retention (currency)",
          "text": "Apply supplied retention rate to cumulative valuation."
        },
        {
          "label": "Cumulative net certified value (currency)",
          "text": "Deduct retention from cumulative completed work."
        },
        {
          "label": "Current payment due (currency)",
          "text": "Deduct previous payments and current approved deductions."
        }
      ],
      "example_questions": [
        "Use the Trades stage payment reconciliation calculator.",
        "Help me calculate trades stage payment reconciliation."
      ],
      "retrieval_phrases": [
        "Trades stage payment reconciliation",
        "trades stage payment reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 5,
            "c": 6000,
            "d": 200
          },
          "outputs": [
            {
              "label": "Cumulative retention (currency)",
              "value": 500
            },
            {
              "label": "Cumulative net certified value (currency)",
              "value": 9500
            },
            {
              "label": "Current payment due (currency)",
              "value": 3300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1787",
      "name": "Trades variation order ledger",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Signed variations are already approved; balances do not establish the due date or payment entitlement.",
      "url": "/calculators/trades-variation-order-ledger/",
      "version": "bc3c43d4667067ea9938c053f40973bd7e1883dcacda74259f3ea2b5dd91c4bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original contract sum (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Approved variation values (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Payments already received (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Incremental labour cost of variations (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Incremental material cost of variations (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net approved contract variation (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Revised contract total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining contract balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Variation contribution change (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Signed variations are already approved; balances do not establish the due date or payment entitlement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net approved contract variation (currency)",
          "text": "Add increases and deduct approved credits."
        },
        {
          "label": "Revised contract total (currency)",
          "text": "Apply net approved variations to original contract."
        },
        {
          "label": "Remaining contract balance (currency)",
          "text": "Deduct received payments from revised contract value."
        },
        {
          "label": "Variation contribution change (currency)",
          "text": "Deduct incremental labour and materials from variation revenue."
        }
      ],
      "example_questions": [
        "Use the Trades variation order ledger calculator.",
        "Help me calculate trades variation order ledger."
      ],
      "retrieval_phrases": [
        "Trades variation order ledger",
        "trades variation order ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": "1000,-500",
            "c": 6000,
            "d": 200,
            "e": 100
          },
          "outputs": [
            {
              "label": "Net approved contract variation (currency)",
              "value": 500
            },
            {
              "label": "Revised contract total (currency)",
              "value": 10500
            },
            {
              "label": "Remaining contract balance (currency)",
              "value": 4500
            },
            {
              "label": "Variation contribution change (currency)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1792",
      "name": "Trades travel-zone contribution",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Contribution excludes wages and fixed overhead. All travel time and expenses are round trips.",
      "url": "/calculators/trades-travel-zone-contribution/",
      "version": "00efdf6384931f1da06b46cdb9f1a17f37045852350aa97a9c8146865e832745",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Job fees by travel zone (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Round-trip travel minutes by zone",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Work minutes per job",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Travel expense by zone (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Materials per job (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Contribution by zone (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Contribution per occupied hour by zone",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Contribution excludes wages and fixed overhead. All travel time and expenses are round trips."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Contribution by zone (currency)",
          "text": "Deduct travel expense and materials from job fees."
        },
        {
          "label": "Contribution per occupied hour by zone",
          "text": "Normalize contribution by travel plus work time."
        }
      ],
      "example_questions": [
        "Use the Trades travel-zone contribution calculator.",
        "Help me calculate trades travel-zone contribution."
      ],
      "retrieval_phrases": [
        "Trades travel-zone contribution",
        "trades travel zone contribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,150",
            "b": "30,60",
            "c": 60,
            "d": "10,20",
            "e": 20
          },
          "outputs": [
            {
              "label": "Contribution by zone (currency)",
              "value": "70, 110"
            },
            {
              "label": "Contribution per occupied hour by zone",
              "value": "46.666667, 55"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1793",
      "name": "Trades daywork sheet reconciliation",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Only signed hours are priced; materials and equipment are entered approved totals. Signature counts do not prove contractual entitlement.",
      "url": "/calculators/trades-daywork-sheet-reconciliation/",
      "version": "3c0abbaed7e49476c6890e0628833190c67eeda65e0b065b6ce81ed6f8fe5d9e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Signed labour hours by worker",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Agreed hourly rates by worker (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Materials total (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Equipment total (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Submitted daywork sheets",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Signed daywork sheets",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Labour amount (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Daywork total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unsigned sheets",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Only signed hours are priced; materials and equipment are entered approved totals. Signature counts do not prove contractual entitlement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Labour amount (currency)",
          "text": "Price signed worker hours at agreed rates."
        },
        {
          "label": "Daywork total (currency)",
          "text": "Add labour, materials and equipment."
        },
        {
          "label": "Unsigned sheets",
          "text": "Subtract signed sheets from submitted sheets."
        }
      ],
      "example_questions": [
        "Use the Trades daywork sheet reconciliation calculator.",
        "Help me calculate trades daywork sheet reconciliation."
      ],
      "retrieval_phrases": [
        "Trades daywork sheet reconciliation",
        "trades daywork sheet reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "8,6",
            "b": "30,40",
            "c": 100,
            "d": 80,
            "e": 3,
            "f": 2
          },
          "outputs": [
            {
              "label": "Labour amount (currency)",
              "value": 480
            },
            {
              "label": "Daywork total (currency)",
              "value": 660
            },
            {
              "label": "Unsigned sheets",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1794",
      "name": "Trades quote option comparison",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Quantities are common to both specifications; entered rates must cover comparable line scope. Taxes and lifecycle performance are excluded.",
      "url": "/calculators/trades-quote-option-comparison/",
      "version": "36748a242cbfbfcc5c782228f0e228eb52359aaf63789aca18e4a9f5788f111b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Common line quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Option A rates by line (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Option B rates by line (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Option A fixed extras (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Option B fixed extras (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Option A total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Option B total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Option B minus A (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Quantities are common to both specifications; entered rates must cover comparable line scope. Taxes and lifecycle performance are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Option A total (currency)",
          "text": "Apply option A rates to shared quantities and add extras."
        },
        {
          "label": "Option B total (currency)",
          "text": "Apply option B rates and its fixed extras."
        },
        {
          "label": "Option B minus A (currency)",
          "text": "Compare complete option totals."
        }
      ],
      "example_questions": [
        "Use the Trades quote option comparison calculator.",
        "Help me calculate trades quote option comparison."
      ],
      "retrieval_phrases": [
        "Trades quote option comparison",
        "trades quote option comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "5,8",
            "c": "6,7",
            "d": 50,
            "e": 70
          },
          "outputs": [
            {
              "label": "Option A total (currency)",
              "value": 260
            },
            {
              "label": "Option B total (currency)",
              "value": 270
            },
            {
              "label": "Option B minus A (currency)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1797",
      "name": "Trades van stock replenishment",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Target levels are supplied rather than statistically optimized; no outstanding purchase orders or inter-van transfers are included.",
      "url": "/calculators/trades-van-stock-replenishment/",
      "version": "bbccc1ffdf2652d5132386b04da3f3a67380c54d2954598e0580fb1a2e34defa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Van stock after recent usage by part",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Target replenishment levels by part",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Supplier pack sizes by part",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Units short of target by part",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Order packs by part",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Resulting van stock by part",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Target levels are supplied rather than statistically optimized; no outstanding purchase orders or inter-van transfers are included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Units short of target by part",
          "text": "Compare available van stock with each target."
        },
        {
          "label": "Order packs by part",
          "text": "Round positive shortfalls to supplier packs."
        },
        {
          "label": "Resulting van stock by part",
          "text": "Add ordered pack contents to current stock."
        }
      ],
      "example_questions": [
        "Use the Trades van stock replenishment calculator.",
        "Help me calculate trades van stock replenishment."
      ],
      "retrieval_phrases": [
        "Trades van stock replenishment",
        "trades van stock replenishment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,8",
            "b": "10,20",
            "c": "4,6"
          },
          "outputs": [
            {
              "label": "Units short of target by part",
              "value": "7, 12"
            },
            {
              "label": "Order packs by part",
              "value": "2, 2"
            },
            {
              "label": "Resulting van stock by part",
              "value": "11, 20"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1799",
      "name": "Trades project margin erosion",
      "category": "Trades quoting and site coordination",
      "status": "available",
      "purpose": "Remaining forecast excludes all committed costs to avoid double counting. Margin values are before unlisted overhead and tax.",
      "url": "/calculators/trades-project-margin-erosion/",
      "version": "f355eae019ebb9944b6620c163d32dfb12c917819749b030cdf2faaa9d27ec1f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Original contract revenue (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Original estimated cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Approved revenue changes (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Costs already committed (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Uncommitted remaining forecast cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Original estimated margin (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Current forecast margin (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Margin erosion (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Forecast cost over original estimate (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Remaining forecast excludes all committed costs to avoid double counting. Margin values are before unlisted overhead and tax."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Original estimated margin (currency)",
          "text": "Subtract original expected cost from original revenue."
        },
        {
          "label": "Current forecast margin (currency)",
          "text": "Deduct committed and additional remaining costs from revised revenue."
        },
        {
          "label": "Margin erosion (currency)",
          "text": "Compare original and current forecast margins."
        },
        {
          "label": "Forecast cost over original estimate (currency)",
          "text": "Isolate cost growth before approved revenue changes."
        }
      ],
      "example_questions": [
        "Use the Trades project margin erosion calculator.",
        "Help me calculate trades project margin erosion."
      ],
      "retrieval_phrases": [
        "Trades project margin erosion",
        "trades project margin erosion"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20000,
            "b": 15000,
            "c": 2000,
            "d": 12000,
            "e": 7000
          },
          "outputs": [
            {
              "label": "Original estimated margin (currency)",
              "value": 5000
            },
            {
              "label": "Current forecast margin (currency)",
              "value": 3000
            },
            {
              "label": "Margin erosion (currency)",
              "value": 2000
            },
            {
              "label": "Forecast cost over original estimate (currency)",
              "value": 4000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1801",
      "name": "Cleaning site frequency workload",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Measured productivity is per worker and includes the stated site cleaning scope. Travel and non-area tasks require separate allowance.",
      "url": "/calculators/cleaning-site-frequency-workload/",
      "version": "ddff9357ba790c4b23f251a4312568f9fb59bf09f0835bc5276bc02aac333f6f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cleanable areas by site (m²)",
          "type": "array",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Services per week by site",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured cleaning rates by site (m²/worker-hour)",
          "type": "array",
          "required": true,
          "unit": "m²/worker-hour",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weekly worker-hours by site",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total weekly worker-hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Weekly area serviced (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Measured productivity is per worker and includes the stated site cleaning scope. Travel and non-area tasks require separate allowance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weekly worker-hours by site",
          "text": "Multiply area by visits and divide by measured productivity."
        },
        {
          "label": "Total weekly worker-hours",
          "text": "Add all site workloads."
        },
        {
          "label": "Weekly area serviced (m²)",
          "text": "Sum area across the agreed visit frequencies."
        }
      ],
      "example_questions": [
        "Use the Cleaning site frequency workload calculator.",
        "Help me calculate cleaning site frequency workload."
      ],
      "retrieval_phrases": [
        "Cleaning site frequency workload",
        "cleaning site frequency workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,600",
            "b": "5,3",
            "c": "250,200"
          },
          "outputs": [
            {
              "label": "Weekly worker-hours by site",
              "value": "20, 9"
            },
            {
              "label": "Total weekly worker-hours",
              "value": 29
            },
            {
              "label": "Weekly area serviced (m²)",
              "value": 6800
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1802",
      "name": "Cleaning tender labour build-up",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Supervision is additional paid time and the same loaded rate is used throughout; task times exclude paid breaks.",
      "url": "/calculators/cleaning-tender-labour-build-up/",
      "version": "9707ca3b9ec803009a3c3feeed2242bfef78eb00b41d64455626a7918251344b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Task counts per shift",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Minutes per task",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Paid breaks per worker (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Workers assigned",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Supervision hours per shift",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Loaded hourly labour cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Productive cleaning hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total paid hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Shift labour cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supervision is additional paid time and the same loaded rate is used throughout; task times exclude paid breaks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Productive cleaning hours",
          "text": "Multiply task quantities by measured task times."
        },
        {
          "label": "Total paid hours",
          "text": "Add paid breaks for all assigned workers and supervision."
        },
        {
          "label": "Shift labour cost (currency)",
          "text": "Price all paid hours at the supplied loaded rate."
        }
      ],
      "example_questions": [
        "Use the Cleaning tender labour build-up calculator.",
        "Help me calculate cleaning tender labour build-up."
      ],
      "retrieval_phrases": [
        "Cleaning tender labour build-up",
        "cleaning tender labour build up"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,10",
            "b": "3,6",
            "c": 15,
            "d": 2,
            "e": 0.5,
            "f": 20
          },
          "outputs": [
            {
              "label": "Productive cleaning hours",
              "value": 2
            },
            {
              "label": "Total paid hours",
              "value": 3
            },
            {
              "label": "Shift labour cost (currency)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1804",
      "name": "Cleaning machine productivity audit",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Area is counted once and interruption time excludes productive movement; measured rate is descriptive and not a guarantee.",
      "url": "/calculators/cleaning-machine-productivity-audit/",
      "version": "8bf37d75703a58b2f4fbc87cba3af17d7d9de3bd58417c27c1c857b5974c9dd5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Area completed (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Total elapsed shift time (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Recorded interruptions (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Planned machine rate (m²/productive hour)",
          "type": "number",
          "required": true,
          "unit": "m²/productive hour",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Productive machine time (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Observed productive rate (m²/hour)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Downtime share (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Rate variance versus plan (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Area is counted once and interruption time excludes productive movement; measured rate is descriptive and not a guarantee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Productive machine time (hours)",
          "text": "Deduct interruptions from elapsed time."
        },
        {
          "label": "Observed productive rate (m²/hour)",
          "text": "Divide completed area by productive machine time."
        },
        {
          "label": "Downtime share (%)",
          "text": "Compare interruptions with total elapsed shift time."
        },
        {
          "label": "Rate variance versus plan (%)",
          "text": "Compare measured productive rate with the entered plan."
        }
      ],
      "example_questions": [
        "Use the Cleaning machine productivity audit calculator.",
        "Help me calculate cleaning machine productivity audit."
      ],
      "retrieval_phrases": [
        "Cleaning machine productivity audit",
        "cleaning machine productivity audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3000,
            "b": 6,
            "c": 1,
            "d": 500
          },
          "outputs": [
            {
              "label": "Productive machine time (hours)",
              "value": 5
            },
            {
              "label": "Observed productive rate (m²/hour)",
              "value": 600
            },
            {
              "label": "Downtime share (%)",
              "value": 16.666666666666668
            },
            {
              "label": "Rate variance versus plan (%)",
              "value": 19.999999999999996
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1805",
      "name": "Cleaning scrubber water autonomy",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Constant measured solution use and a full initial tank; residual inaccessible liquid is excluded from usable capacity.",
      "url": "/calculators/cleaning-scrubber-water-autonomy/",
      "version": "41dc4544d90f23fad9e3ce2b04c247f682dc4818a43223e6babd0a855119d1b7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Usable scrubber solution tank (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured solution use (L/m²)",
          "type": "number",
          "required": true,
          "unit": "L/m²",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Area to clean (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Refill time (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Area per full tank (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Tank fills needed",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Refills after initial fill",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Refill downtime (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant measured solution use and a full initial tank; residual inaccessible liquid is excluded from usable capacity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Area per full tank (m²)",
          "text": "Divide usable tank capacity by measured area consumption."
        },
        {
          "label": "Tank fills needed",
          "text": "Round required solution volume to full-tank equivalents."
        },
        {
          "label": "Refills after initial fill",
          "text": "Exclude the initial fill from on-route refills."
        },
        {
          "label": "Refill downtime (minutes)",
          "text": "Multiply in-route refills by refill duration."
        }
      ],
      "example_questions": [
        "Use the Cleaning scrubber water autonomy calculator.",
        "Help me calculate cleaning scrubber water autonomy."
      ],
      "retrieval_phrases": [
        "Cleaning scrubber water autonomy",
        "cleaning scrubber water autonomy"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 0.02,
            "c": 5000,
            "d": 10
          },
          "outputs": [
            {
              "label": "Area per full tank (m²)",
              "value": 2000
            },
            {
              "label": "Tank fills needed",
              "value": 3
            },
            {
              "label": "Refills after initial fill",
              "value": 2
            },
            {
              "label": "Refill downtime (minutes)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1806",
      "name": "Cleaning chemical inventory from labels",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Procurement arithmetic using already approved product-specific label doses. Does not recommend dilution, mixing products or application.",
      "url": "/calculators/cleaning-chemical-inventory-from-labels/",
      "version": "5ad7dfe98bd892a251a35cf5a2eca350ee546bcc2812081f1993f46f14ea58f7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Approved finished-solution quantities by job (L)",
          "type": "array",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Product label doses by job (mL/L)",
          "type": "array",
          "required": true,
          "unit": "mL/L",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Usable concentrate stock (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Concentrate bottle size (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Concentrate required by job (mL)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total concentrate required (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Bottles to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Procurement arithmetic using already approved product-specific label doses. Does not recommend dilution, mixing products or application."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Concentrate required by job (mL)",
          "text": "Apply the supplied label dose to each finished-solution quantity."
        },
        {
          "label": "Total concentrate required (mL)",
          "text": "Add job product requirements."
        },
        {
          "label": "Bottles to purchase",
          "text": "Deduct stock and round concentrate shortage to bottles."
        }
      ],
      "example_questions": [
        "Use the Cleaning chemical inventory from labels calculator.",
        "Help me calculate cleaning chemical inventory from labels."
      ],
      "retrieval_phrases": [
        "Cleaning chemical inventory from labels",
        "cleaning chemical inventory from labels"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "5,10",
            "c": 100,
            "d": 500
          },
          "outputs": [
            {
              "label": "Concentrate required by job (mL)",
              "value": "50, 200"
            },
            {
              "label": "Total concentrate required (mL)",
              "value": 250
            },
            {
              "label": "Bottles to purchase",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1809",
      "name": "Cleaning bin-liner fit planner",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Ideal rectangular bin and non-gusseted liner, without stretch; practical fit must account for seams and material thickness.",
      "url": "/calculators/cleaning-bin-liner-fit-planner/",
      "version": "7bee8e0baa0008ab831ac28f7a78a7f391ceecb5c842881fd5d9716b3af2d32c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rectangular bin opening length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Bin opening width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Bin depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Tie allowance above rim (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available liner lay-flat width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Available liner length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Minimum liner lay-flat width (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minimum liner length (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Fit of supplied liner",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal rectangular bin and non-gusseted liner, without stretch; practical fit must account for seams and material thickness."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Minimum liner lay-flat width (cm)",
          "text": "Use half the rectangular bin opening perimeter."
        },
        {
          "label": "Minimum liner length (cm)",
          "text": "Allow bin depth, half the shorter base side and top tie length."
        },
        {
          "label": "Fit of supplied liner",
          "text": "Compare both supplied liner dimensions with geometric requirements."
        }
      ],
      "example_questions": [
        "Use the Cleaning bin-liner fit planner calculator.",
        "Help me calculate cleaning bin-liner fit planner."
      ],
      "retrieval_phrases": [
        "Cleaning bin-liner fit planner",
        "cleaning bin liner fit planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 30,
            "c": 60,
            "d": 15,
            "e": 75,
            "f": 95
          },
          "outputs": [
            {
              "label": "Minimum liner lay-flat width (cm)",
              "value": 70
            },
            {
              "label": "Minimum liner length (cm)",
              "value": 90
            },
            {
              "label": "Fit of supplied liner",
              "value": "Fits geometric allowance"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1810",
      "name": "Cleaning waste bag change workload",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Frequencies are observed or supplied averages; purchasing rounds to whole rolls and does not carry unused rolls between days.",
      "url": "/calculators/cleaning-waste-bag-change-workload/",
      "version": "9e0132528c92ec8f491dd84ce37d36c0fcbd25f5b8340f6607262a7f10339a06",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bins by zone",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Bag changes per bin per day",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Minutes per bag change",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Daily access-route time (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Liners per purchased roll",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Daily bags by zone",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total daily service time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Whole liner rolls per day",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Frequencies are observed or supplied averages; purchasing rounds to whole rolls and does not carry unused rolls between days."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Daily bags by zone",
          "text": "Multiply bin counts by observed daily change frequency."
        },
        {
          "label": "Total daily service time (minutes)",
          "text": "Add change time and access-route time."
        },
        {
          "label": "Whole liner rolls per day",
          "text": "Round daily bags to whole liner rolls."
        }
      ],
      "example_questions": [
        "Use the Cleaning waste bag change workload calculator.",
        "Help me calculate cleaning waste bag change workload."
      ],
      "retrieval_phrases": [
        "Cleaning waste bag change workload",
        "cleaning waste bag change workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,10",
            "b": "1,2",
            "c": 1.5,
            "d": 20,
            "e": 25
          },
          "outputs": [
            {
              "label": "Daily bags by zone",
              "value": "20, 20"
            },
            {
              "label": "Total daily service time (minutes)",
              "value": 80
            },
            {
              "label": "Whole liner rolls per day",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1812",
      "name": "Cleaning window pane production log",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Area basis must consistently count one or both pane faces. This is measured productivity, not an access-method recommendation.",
      "url": "/calculators/cleaning-window-pane-production-log/",
      "version": "d25278736f31d4027964dd889aadbc38fde8749dd672294f47ba17da0a1422bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pane areas completed by access class (m²)",
          "type": "array",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Actual task times by class (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Nonproductive access/setup times by class (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Productive rates by class (m²/hour)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Elapsed rates by class (m²/hour)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Blended elapsed productivity (m²/hour)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Area basis must consistently count one or both pane faces. This is measured productivity, not an access-method recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Productive rates by class (m²/hour)",
          "text": "Divide completed pane area by actual cleaning time."
        },
        {
          "label": "Elapsed rates by class (m²/hour)",
          "text": "Include setup and access time in the denominator."
        },
        {
          "label": "Blended elapsed productivity (m²/hour)",
          "text": "Divide combined area by all elapsed hours."
        }
      ],
      "example_questions": [
        "Use the Cleaning window pane production log calculator.",
        "Help me calculate cleaning window pane production log."
      ],
      "retrieval_phrases": [
        "Cleaning window pane production log",
        "cleaning window pane production log"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,60",
            "b": "2,3",
            "c": "0.5,1"
          },
          "outputs": [
            {
              "label": "Productive rates by class (m²/hour)",
              "value": "50, 20"
            },
            {
              "label": "Elapsed rates by class (m²/hour)",
              "value": "40, 15"
            },
            {
              "label": "Blended elapsed productivity (m²/hour)",
              "value": 24.615384615384617
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1813",
      "name": "Cleaning contract escalation arithmetic",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Uses supplied contract weights and index changes for one adjustment period. Does not determine whether an adjustment is contractually allowed.",
      "url": "/calculators/cleaning-contract-escalation-arithmetic/",
      "version": "91fe86478a48bcb77539c962f23a98f09da859073f8960cb5c488f27df3af057",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current contract price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Contract cost-component weights (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Supplied component index changes (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weighted price adjustment (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Price adjustment (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Adjusted contract price (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses supplied contract weights and index changes for one adjustment period. Does not determine whether an adjustment is contractually allowed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weighted price adjustment (%)",
          "text": "Weight each supplied index change by the contractual component share."
        },
        {
          "label": "Price adjustment (currency)",
          "text": "Apply weighted percentage change to current contract price."
        },
        {
          "label": "Adjusted contract price (currency)",
          "text": "Add the calculated adjustment to current price."
        }
      ],
      "example_questions": [
        "Use the Cleaning contract escalation arithmetic calculator.",
        "Help me calculate cleaning contract escalation arithmetic."
      ],
      "retrieval_phrases": [
        "Cleaning contract escalation arithmetic",
        "cleaning contract escalation arithmetic"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": "60,30,10",
            "c": "5,10,0"
          },
          "outputs": [
            {
              "label": "Weighted price adjustment (%)",
              "value": 6
            },
            {
              "label": "Price adjustment (currency)",
              "value": 600
            },
            {
              "label": "Adjusted contract price (currency)",
              "value": 10600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1814",
      "name": "Cleaning quality inspection sample",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "User-selected proportional sample with site-level rounding, not a statistical assurance or audit acceptance plan.",
      "url": "/calculators/cleaning-quality-inspection-sample/",
      "version": "00c9c194ff5f3e2162702929de11e1fd9dbb0f7e3ba678fbe6f6184d6bc46549",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Inspectable zones by site",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Chosen sample fraction (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Inspection duration per zone (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Available inspection minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required sample zones by site",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total inspection minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Capacity shortfall (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Overall sample coverage (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "User-selected proportional sample with site-level rounding, not a statistical assurance or audit acceptance plan."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required sample zones by site",
          "text": "Apply the chosen fraction and round each site upward."
        },
        {
          "label": "Total inspection minutes",
          "text": "Multiply sampled zones by inspection duration."
        },
        {
          "label": "Capacity shortfall (minutes)",
          "text": "Compare sample workload with available inspection time."
        },
        {
          "label": "Overall sample coverage (%)",
          "text": "Compare whole sampled zones with the total population."
        }
      ],
      "example_questions": [
        "Use the Cleaning quality inspection sample calculator.",
        "Help me calculate cleaning quality inspection sample."
      ],
      "retrieval_phrases": [
        "Cleaning quality inspection sample",
        "cleaning quality inspection sample"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,60",
            "b": 10,
            "c": 5,
            "d": 60
          },
          "outputs": [
            {
              "label": "Required sample zones by site",
              "value": "4, 6"
            },
            {
              "label": "Total inspection minutes",
              "value": 50
            },
            {
              "label": "Capacity shortfall (minutes)",
              "value": 0
            },
            {
              "label": "Overall sample coverage (%)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1815",
      "name": "Cleaning missed-service credit",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Credit rates and cap are supplied agreement terms. Task completion counts instances equally rather than weighting by price or duration.",
      "url": "/calculators/cleaning-missed-service-credit/",
      "version": "cde3dac3d046ac06f9f5270e6d9e8bce2d03af24086d2b8c2a9bb07f9f382b2d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Scheduled task instances by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Missed task instances by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Agreed credit per missed task (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Maximum credit for period (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Uncapped credit by task type (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Period credit after cap (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Task completion (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Credit rates and cap are supplied agreement terms. Task completion counts instances equally rather than weighting by price or duration."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Uncapped credit by task type (currency)",
          "text": "Apply supplied per-instance credits to missed services."
        },
        {
          "label": "Period credit after cap (currency)",
          "text": "Cap total credits at the entered period maximum."
        },
        {
          "label": "Task completion (%)",
          "text": "Compare completed instances with scheduled work."
        }
      ],
      "example_questions": [
        "Use the Cleaning missed-service credit calculator.",
        "Help me calculate cleaning missed-service credit."
      ],
      "retrieval_phrases": [
        "Cleaning missed-service credit",
        "cleaning missed service credit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,10",
            "b": "2,1",
            "c": "5,20",
            "d": 100
          },
          "outputs": [
            {
              "label": "Uncapped credit by task type (currency)",
              "value": "10, 20"
            },
            {
              "label": "Period credit after cap (currency)",
              "value": 30
            },
            {
              "label": "Task completion (%)",
              "value": 90
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1820",
      "name": "Cleaning floor finish coating layers",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Coat count and coverage come from the approved product specification. No drying time, surface compatibility or safe-use determination.",
      "url": "/calculators/cleaning-floor-finish-coating-layers/",
      "version": "bd254087b5a3688c03bcb687d5f2790fdc460aff317021a1654d471a3617d0ae",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Floor area to coat (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Supplier coverage (m²/L/coat)",
          "type": "number",
          "required": true,
          "unit": "m²/L/coat",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "User-selected coat count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Material loss allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Usable material stock (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Can size (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Theoretical coating volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Volume including allowance (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cans to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Area-coat application workload (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Coat count and coverage come from the approved product specification. No drying time, surface compatibility or safe-use determination."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Theoretical coating volume (L)",
          "text": "Multiply area by coat count and divide by label coverage."
        },
        {
          "label": "Volume including allowance (L)",
          "text": "Add the selected loss allowance to theoretical consumption."
        },
        {
          "label": "Cans to purchase",
          "text": "Deduct usable stock and round to complete cans."
        },
        {
          "label": "Area-coat application workload (m²)",
          "text": "Count floor area once per specified coat."
        }
      ],
      "example_questions": [
        "Use the Cleaning floor finish coating layers calculator.",
        "Help me calculate cleaning floor finish coating layers."
      ],
      "retrieval_phrases": [
        "Cleaning floor finish coating layers",
        "cleaning floor finish coating layers"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 20,
            "c": 3,
            "d": 10,
            "e": 10,
            "f": 5
          },
          "outputs": [
            {
              "label": "Theoretical coating volume (L)",
              "value": 75
            },
            {
              "label": "Volume including allowance (L)",
              "value": 82.5
            },
            {
              "label": "Cans to purchase",
              "value": 15
            },
            {
              "label": "Area-coat application workload (m²)",
              "value": 1500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1822",
      "name": "Cleaning square-metre price decomposition",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "All quantities refer to the same contract period; area pricing alone does not establish adequate service frequency.",
      "url": "/calculators/cleaning-square-metre-price-decomposition/",
      "version": "6379dba1650d1faa3a078fc2ac699666fafdbca7e4fc7125817d5ce41c442cea",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Contract cleanable area (m²)",
          "type": "number",
          "required": true,
          "unit": "m2",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Quoted price per m² (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Expected paid labour hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Loaded hourly wage (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Supplies for contract period (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Allocated period overhead (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Contract revenue (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Contribution after entered costs (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Implied revenue per paid hour",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Break-even area price (currency/m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All quantities refer to the same contract period; area pricing alone does not establish adequate service frequency."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Contract revenue (currency)",
          "text": "Multiply quoted area price by contracted area."
        },
        {
          "label": "Contribution after entered costs (currency)",
          "text": "Deduct paid labour, supplies and overhead."
        },
        {
          "label": "Implied revenue per paid hour",
          "text": "Divide contract revenue by paid labour hours."
        },
        {
          "label": "Break-even area price (currency/m²)",
          "text": "Spread entered costs over contracted area."
        }
      ],
      "example_questions": [
        "Use the Cleaning square-metre price decomposition calculator.",
        "Help me calculate cleaning square-metre price decomposition."
      ],
      "retrieval_phrases": [
        "Cleaning square-metre price decomposition",
        "cleaning square metre price decomposition"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 2,
            "c": 50,
            "d": 20,
            "e": 200,
            "f": 300
          },
          "outputs": [
            {
              "label": "Contract revenue (currency)",
              "value": 2000
            },
            {
              "label": "Contribution after entered costs (currency)",
              "value": 500
            },
            {
              "label": "Implied revenue per paid hour",
              "value": 40
            },
            {
              "label": "Break-even area price (currency/m²)",
              "value": 1.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1823",
      "name": "Cleaning paid-versus-productive time",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Travel, breaks and productive tasks are mutually exclusive categories. Unallocated time is a recording gap, not proof of inactivity.",
      "url": "/calculators/cleaning-paid-versus-productive-time/",
      "version": "e4f958bb63684bff75de7f206c71fc8c23f546a781ab46ac9e672c6d23abe558",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Clocked hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Recorded travel hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recorded paid breaks (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Recorded productive task hours",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Productive fraction of paid hours (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unallocated paid hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Travel plus break share (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Travel, breaks and productive tasks are mutually exclusive categories. Unallocated time is a recording gap, not proof of inactivity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Productive fraction of paid hours (%)",
          "text": "Divide measured productive task time by clocked time."
        },
        {
          "label": "Unallocated paid hours",
          "text": "Subtract travel, paid breaks and productive tasks."
        },
        {
          "label": "Travel plus break share (%)",
          "text": "Compare recorded non-task time with clocked hours."
        }
      ],
      "example_questions": [
        "Use the Cleaning paid-versus-productive time calculator.",
        "Help me calculate cleaning paid-versus-productive time."
      ],
      "retrieval_phrases": [
        "Cleaning paid-versus-productive time",
        "cleaning paid versus productive time"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 5,
            "c": 3,
            "d": 30
          },
          "outputs": [
            {
              "label": "Productive fraction of paid hours (%)",
              "value": 75
            },
            {
              "label": "Unallocated paid hours",
              "value": 2
            },
            {
              "label": "Travel plus break share (%)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1824",
      "name": "Cleaning consumable loss reconciliation",
      "category": "Commercial cleaning operations",
      "status": "available",
      "purpose": "Units are consistent within each item; all receipts and issues should be recorded. Negative loss indicates a stock surplus.",
      "url": "/calculators/cleaning-consumable-loss-reconciliation/",
      "version": "52aaa9d6f292fdb67238781ba68392bf07abb3be4cae2ed79a2499e4db73dcc7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Opening consumable stock by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Purchases by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Recorded issues by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Physical closing count by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Unit acquisition costs (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected closing stock by item",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unexplained loss by item",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Value of signed unexplained loss (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Units are consistent within each item; all receipts and issues should be recorded. Negative loss indicates a stock surplus."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected closing stock by item",
          "text": "Roll forward opening stock plus purchases less issues."
        },
        {
          "label": "Unexplained loss by item",
          "text": "Compare expected stock with physical count."
        },
        {
          "label": "Value of signed unexplained loss (currency)",
          "text": "Value each signed discrepancy at the supplied unit cost."
        }
      ],
      "example_questions": [
        "Use the Cleaning consumable loss reconciliation calculator.",
        "Help me calculate cleaning consumable loss reconciliation."
      ],
      "retrieval_phrases": [
        "Cleaning consumable loss reconciliation",
        "cleaning consumable loss reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "50,100",
            "c": "120,240",
            "d": "20,50",
            "e": "2,1"
          },
          "outputs": [
            {
              "label": "Expected closing stock by item",
              "value": "30, 60"
            },
            {
              "label": "Unexplained loss by item",
              "value": "10, 10"
            },
            {
              "label": "Value of signed unexplained loss (currency)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1827",
      "name": "Rental minimum-period billing",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Elapsed hours are supplied from checkout and return using a consistent time basis. Every started period is charged; no grace period.",
      "url": "/calculators/rental-minimum-period-billing/",
      "version": "8eb4f0bc29bed4c38c352acf8edc814406889c66761290a669b91a28df70e73e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Elapsed rental time (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Billing-period length (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Minimum billable periods",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Charge per period (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fixed rental extras (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Elapsed periods rounded up",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Billable periods after minimum",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total rental charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Elapsed hours are supplied from checkout and return using a consistent time basis. Every started period is charged; no grace period."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Elapsed periods rounded up",
          "text": "Round elapsed rental time to started tariff periods."
        },
        {
          "label": "Billable periods after minimum",
          "text": "Apply the supplied minimum rental duration."
        },
        {
          "label": "Total rental charge (currency)",
          "text": "Price billable periods and add fixed extras."
        }
      ],
      "example_questions": [
        "Use the Rental minimum-period billing calculator.",
        "Help me calculate rental minimum-period billing."
      ],
      "retrieval_phrases": [
        "Rental minimum-period billing",
        "rental minimum period billing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 24,
            "c": 2,
            "d": 40,
            "e": 15
          },
          "outputs": [
            {
              "label": "Elapsed periods rounded up",
              "value": 3
            },
            {
              "label": "Billable periods after minimum",
              "value": 3
            },
            {
              "label": "Total rental charge (currency)",
              "value": 135
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1829",
      "name": "Rental asset payback scenarios",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Simple undiscounted payback with constant annual demand; excludes financing, tax, resale value and capital replacements.",
      "url": "/calculators/rental-asset-payback-scenarios/",
      "version": "82b96b2243f274161e4b2e695b4141cdcb10beb0377a599d98acc857f78ea294",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Asset purchase and setup cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rental days per year scenarios",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Rental revenue per day (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Variable cost per rented day (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Annual fixed maintenance cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Annual net cash contribution by scenario",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Simple payback years by scenario",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Annual break-even rented days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Simple undiscounted payback with constant annual demand; excludes financing, tax, resale value and capital replacements."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Annual net cash contribution by scenario",
          "text": "Deduct variable hire costs and annual maintenance from rental receipts."
        },
        {
          "label": "Simple payback years by scenario",
          "text": "Divide upfront cost by positive annual cash contribution."
        },
        {
          "label": "Annual break-even rented days",
          "text": "Calculate days needed to cover annual maintenance."
        }
      ],
      "example_questions": [
        "Use the Rental asset payback scenarios calculator.",
        "Help me calculate rental asset payback scenarios."
      ],
      "retrieval_phrases": [
        "Rental asset payback scenarios",
        "rental asset payback scenarios"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6000,
            "b": "60,100",
            "c": 100,
            "d": 20,
            "e": 1000
          },
          "outputs": [
            {
              "label": "Annual net cash contribution by scenario",
              "value": "3800, 7000"
            },
            {
              "label": "Simple payback years by scenario",
              "value": "1.578947, 0.857143"
            },
            {
              "label": "Annual break-even rented days",
              "value": 13
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1831",
      "name": "Rental maintenance hour counter",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Uses supplied service intervals only; calendar-based triggers and manufacturer operating restrictions may also apply.",
      "url": "/calculators/rental-maintenance-hour-counter/",
      "version": "6a246e487f701a2bacdfc26a3c7ce8908a8e877af307e947031a4785d5a9d43b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current operating meter by asset (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Meter at last service by asset (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "User-specified service intervals (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Operating hours since service",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining hours to service",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Hours overdue by asset",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses supplied service intervals only; calendar-based triggers and manufacturer operating restrictions may also apply."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Operating hours since service",
          "text": "Subtract the meter recorded at the last service."
        },
        {
          "label": "Remaining hours to service",
          "text": "Deduct elapsed usage from the supplied interval."
        },
        {
          "label": "Hours overdue by asset",
          "text": "Report usage beyond the supplied interval."
        }
      ],
      "example_questions": [
        "Use the Rental maintenance hour counter calculator.",
        "Help me calculate rental maintenance hour counter."
      ],
      "retrieval_phrases": [
        "Rental maintenance hour counter",
        "rental maintenance hour counter"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1200,850",
            "b": "1000,500",
            "c": "250,300"
          },
          "outputs": [
            {
              "label": "Operating hours since service",
              "value": "200, 350"
            },
            {
              "label": "Remaining hours to service",
              "value": "50, 0"
            },
            {
              "label": "Hours overdue by asset",
              "value": "0, 50"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1834",
      "name": "Rental deposit release ledger",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Approval and release eligibility are supplied inputs; no legal timing or entitlement rule is inferred.",
      "url": "/calculators/rental-deposit-release-ledger/",
      "version": "db864bb6980ed79e796e13479ccbd11fa8bf14b34f4e422b6a2fb881e7dcb2ad",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Deposits held by rental (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Approved deductions by rental (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Inspection completed flag by rental (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Approved refundable balances (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Ready-to-release refunds (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Refunds awaiting inspection (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Approval and release eligibility are supplied inputs; no legal timing or entitlement rule is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Approved refundable balances (currency)",
          "text": "Deduct approved charges from deposits."
        },
        {
          "label": "Ready-to-release refunds (currency)",
          "text": "Include refunds only for inspections marked complete."
        },
        {
          "label": "Refunds awaiting inspection (currency)",
          "text": "Report refundable balances held pending inspection."
        }
      ],
      "example_questions": [
        "Use the Rental deposit release ledger calculator.",
        "Help me calculate rental deposit release ledger."
      ],
      "retrieval_phrases": [
        "Rental deposit release ledger",
        "rental deposit release ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "200,300",
            "b": "50,0",
            "c": "1,0"
          },
          "outputs": [
            {
              "label": "Approved refundable balances (currency)",
              "value": "150, 300"
            },
            {
              "label": "Ready-to-release refunds (currency)",
              "value": 150
            },
            {
              "label": "Refunds awaiting inspection (currency)",
              "value": 300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1836",
      "name": "Rental lost accessory reconciliation",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Charges are supplied approved terms; normal wear, disputed losses and deposit release rules are outside this tally.",
      "url": "/calculators/rental-lost-accessory-reconciliation/",
      "version": "c9ffd73795e68c5903bfbdaf307a80502ebf20e32ea68cd3b2ed0af6c9e6ab9b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Issued accessory counts by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Returned accessory counts by item",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Approved replacement charge per accessory (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Deposit available against charges (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Missing accessories by item",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total replacement charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional amount beyond deposit (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Charges are supplied approved terms; normal wear, disputed losses and deposit release rules are outside this tally."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Missing accessories by item",
          "text": "Compare returned counts with the issued kit."
        },
        {
          "label": "Total replacement charge (currency)",
          "text": "Price missing accessories at approved replacement rates."
        },
        {
          "label": "Additional amount beyond deposit (currency)",
          "text": "Deduct available deposit from replacement charges."
        }
      ],
      "example_questions": [
        "Use the Rental lost accessory reconciliation calculator.",
        "Help me calculate rental lost accessory reconciliation."
      ],
      "retrieval_phrases": [
        "Rental lost accessory reconciliation",
        "rental lost accessory reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,2",
            "b": "3,0",
            "c": "20,50",
            "d": 80
          },
          "outputs": [
            {
              "label": "Missing accessories by item",
              "value": "1, 2"
            },
            {
              "label": "Total replacement charge (currency)",
              "value": 120
            },
            {
              "label": "Additional amount beyond deposit (currency)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1838",
      "name": "Rental equipment utilization split",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Hired, maintenance and idle categories are mutually exclusive; a day is allocated wholly to one category.",
      "url": "/calculators/rental-equipment-utilization-split/",
      "version": "96cb62f7e52c330b47c92c3aa17f47760d05dd50672fb92afd4df63a577b4f99",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Available calendar days by asset",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Hired days by asset",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Maintenance days by asset",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Idle days by asset",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Calendar utilization by asset (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Rentable-day utilization (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Hired, maintenance and idle categories are mutually exclusive; a day is allocated wholly to one category."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Idle days by asset",
          "text": "Deduct hired and maintenance days from total asset days."
        },
        {
          "label": "Calendar utilization by asset (%)",
          "text": "Divide hire days by all calendar asset days."
        },
        {
          "label": "Rentable-day utilization (%)",
          "text": "Exclude maintenance days from the pooled denominator."
        }
      ],
      "example_questions": [
        "Use the Rental equipment utilization split calculator.",
        "Help me calculate rental equipment utilization split."
      ],
      "retrieval_phrases": [
        "Rental equipment utilization split",
        "rental equipment utilization split"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,30",
            "b": "20,15",
            "c": "5,3"
          },
          "outputs": [
            {
              "label": "Idle days by asset",
              "value": "5, 12"
            },
            {
              "label": "Calendar utilization by asset (%)",
              "value": "66.666667, 50"
            },
            {
              "label": "Rentable-day utilization (%)",
              "value": 67.3076923076923
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1839",
      "name": "Rental customer project quote",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Billable periods already reflect the applicable tariff. Alternative quote must cover the same quantities, periods and extras.",
      "url": "/calculators/rental-customer-project-quote/",
      "version": "26a00e37c54285ba6c45c1622eab86d6e5563edaa0724a1bd6224224de73b84e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Equipment quantities by line",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Billable periods by line",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Rate per equipment-period (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Delivery and collection (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Consumables (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Alternative flat package quote (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Equipment line charges (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Itemized project quote (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Flat package minus itemized quote (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Billable periods already reflect the applicable tariff. Alternative quote must cover the same quantities, periods and extras."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Equipment line charges (currency)",
          "text": "Multiply quantities, billable periods and line rates."
        },
        {
          "label": "Itemized project quote (currency)",
          "text": "Add equipment charges, delivery and consumables."
        },
        {
          "label": "Flat package minus itemized quote (currency)",
          "text": "Compare a supplied equivalent-scope package quote."
        }
      ],
      "example_questions": [
        "Use the Rental customer project quote calculator.",
        "Help me calculate rental customer project quote."
      ],
      "retrieval_phrases": [
        "Rental customer project quote",
        "rental customer project quote"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,1",
            "b": "3,5",
            "c": "40,60",
            "d": 100,
            "e": 30,
            "f": 650
          },
          "outputs": [
            {
              "label": "Equipment line charges (currency)",
              "value": "240, 300"
            },
            {
              "label": "Itemized project quote (currency)",
              "value": 670
            },
            {
              "label": "Flat package minus itemized quote (currency)",
              "value": -20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1840",
      "name": "Rental consumable resale margin",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Separates gross contribution from cash tied in unsold stock; excludes rent, labour and tax.",
      "url": "/calculators/rental-consumable-resale-margin/",
      "version": "ae6f50e3d57b0e3ee916c533295a6667adc93126120cdbd75f944489cdd3dbbf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Consumable units purchased",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Purchase cost per unit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Units resold",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Resale price per unit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Units wasted",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unsold stock remaining",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Contribution after sold and wasted goods (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Closing stock at purchase cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Cash surplus from this purchase batch (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Separates gross contribution from cash tied in unsold stock; excludes rent, labour and tax."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unsold stock remaining",
          "text": "Deduct sold and wasted units from purchases."
        },
        {
          "label": "Contribution after sold and wasted goods (currency)",
          "text": "Charge sold and wasted unit costs against sales."
        },
        {
          "label": "Closing stock at purchase cost (currency)",
          "text": "Value remaining stock at its purchase cost."
        },
        {
          "label": "Cash surplus from this purchase batch (currency)",
          "text": "Compare receipts with total batch purchase cash."
        }
      ],
      "example_questions": [
        "Use the Rental consumable resale margin calculator.",
        "Help me calculate rental consumable resale margin."
      ],
      "retrieval_phrases": [
        "Rental consumable resale margin",
        "rental consumable resale margin"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 2,
            "c": 80,
            "d": 4,
            "e": 10
          },
          "outputs": [
            {
              "label": "Unsold stock remaining",
              "value": 10
            },
            {
              "label": "Contribution after sold and wasted goods (currency)",
              "value": 140
            },
            {
              "label": "Closing stock at purchase cost (currency)",
              "value": 20
            },
            {
              "label": "Cash surplus from this purchase batch (currency)",
              "value": 120
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1841",
      "name": "Rental subhire versus purchase",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Undiscounted user-specified horizon, resale and use assumptions. Availability, financing and taxation are excluded.",
      "url": "/calculators/rental-subhire-versus-purchase/",
      "version": "33f72e7958acd87b2368e831a86a47d2617051f7fceec326b7825039580d47c6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Forecast use (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "External subhire rate (currency/day)",
          "type": "number",
          "required": true,
          "unit": "currency/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Purchase price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Expected resale proceeds after horizon (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Owned variable cost (currency/use-day)",
          "type": "number",
          "required": true,
          "unit": "currency/use-day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Owned fixed cost over horizon (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Subhire total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Owned net cost over horizon (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Subhire minus owned cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Break-even use days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Undiscounted user-specified horizon, resale and use assumptions. Availability, financing and taxation are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Subhire total (currency)",
          "text": "Multiply forecast usage by external day rate."
        },
        {
          "label": "Owned net cost over horizon (currency)",
          "text": "Deduct expected resale and add owned variable and fixed costs."
        },
        {
          "label": "Subhire minus owned cost (currency)",
          "text": "Compare complete horizon costs."
        },
        {
          "label": "Break-even use days",
          "text": "Divide fixed ownership net cost by per-day saving."
        }
      ],
      "example_questions": [
        "Use the Rental subhire versus purchase calculator.",
        "Help me calculate rental subhire versus purchase."
      ],
      "retrieval_phrases": [
        "Rental subhire versus purchase",
        "rental subhire versus purchase"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 100,
            "c": 6000,
            "d": 2000,
            "e": 20,
            "f": 500
          },
          "outputs": [
            {
              "label": "Subhire total (currency)",
              "value": 5000
            },
            {
              "label": "Owned net cost over horizon (currency)",
              "value": 5500
            },
            {
              "label": "Subhire minus owned cost (currency)",
              "value": -500
            },
            {
              "label": "Break-even use days",
              "value": 56.25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1842",
      "name": "Rental meter overage billing",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Overage is rounded separately from the base rental. Meter readings are already reconciled and all fee rules are supplied.",
      "url": "/calculators/rental-meter-overage-billing/",
      "version": "c742a23fc4c848ac91b3078152d12fd64a3205c04d86efc3e7fce3b9f5d7ccb0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Actual metered rental runtime (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Included runtime (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overage billing increment (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Price per excess hour (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Base rental charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Raw excess runtime (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Billable excess runtime (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total invoice (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Overage is rounded separately from the base rental. Meter readings are already reconciled and all fee rules are supplied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Raw excess runtime (hours)",
          "text": "Deduct included runtime from actual usage."
        },
        {
          "label": "Billable excess runtime (hours)",
          "text": "Round excess runtime up to the supplied billing increment."
        },
        {
          "label": "Total invoice (currency)",
          "text": "Add priced excess runtime to the base rental."
        }
      ],
      "example_questions": [
        "Use the Rental meter overage billing calculator.",
        "Help me calculate rental meter overage billing."
      ],
      "retrieval_phrases": [
        "Rental meter overage billing",
        "rental meter overage billing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 35,
            "b": 20,
            "c": 0.5,
            "d": 8,
            "e": 200
          },
          "outputs": [
            {
              "label": "Raw excess runtime (hours)",
              "value": 15
            },
            {
              "label": "Billable excess runtime (hours)",
              "value": 15
            },
            {
              "label": "Total invoice (currency)",
              "value": 320
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1846",
      "name": "Rental package kit assembly",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "All kits have the same component recipe and components are freely interchangeable; no partial kit is counted as ready.",
      "url": "/calculators/rental-package-kit-assembly/",
      "version": "84c59127003ab18d9b9b2a1f91113dd804b91a156bfbbee89ec3f1fdedcf3a36",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Component stock counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Components required per rental kit",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Booked complete kits",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Complete kits currently available",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Component shortages for booked kits",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Bookings not coverable with complete kits",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All kits have the same component recipe and components are freely interchangeable; no partial kit is counted as ready."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Complete kits currently available",
          "text": "Find the limiting component after whole-kit division."
        },
        {
          "label": "Component shortages for booked kits",
          "text": "Compare each booked-kit requirement with component stock."
        },
        {
          "label": "Bookings not coverable with complete kits",
          "text": "Compare booked kits with the limiting component capacity."
        }
      ],
      "example_questions": [
        "Use the Rental package kit assembly calculator.",
        "Help me calculate rental package kit assembly."
      ],
      "retrieval_phrases": [
        "Rental package kit assembly",
        "rental package kit assembly"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,8,20",
            "b": "2,1,4",
            "c": 6
          },
          "outputs": [
            {
              "label": "Complete kits currently available",
              "value": 5
            },
            {
              "label": "Component shortages for booked kits",
              "value": "2, 0, 4"
            },
            {
              "label": "Bookings not coverable with complete kits",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1849",
      "name": "Rental customer credit exposure",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "Internal policy scenario, not a creditworthiness or insurance assessment. Deposits offset aggregate exposure only as explicitly assumed.",
      "url": "/calculators/rental-customer-credit-exposure/",
      "version": "532f416ee9aaad4ea7b9ab321ecae51673ef93339e23fb318025d89e3d65b2b5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unpaid rental invoices (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Deposits held (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Replacement value of active rented assets (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Policy inclusion of active asset value (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Supplied customer exposure limit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Included active-asset exposure (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net customer exposure (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Exposure above supplied limit (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Internal policy scenario, not a creditworthiness or insurance assessment. Deposits offset aggregate exposure only as explicitly assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Included active-asset exposure (currency)",
          "text": "Apply the chosen asset-value inclusion percentage."
        },
        {
          "label": "Net customer exposure (currency)",
          "text": "Add unpaid invoices and included assets, then deduct deposits."
        },
        {
          "label": "Exposure above supplied limit (currency)",
          "text": "Compare net exposure with the entered internal limit."
        }
      ],
      "example_questions": [
        "Use the Rental customer credit exposure calculator.",
        "Help me calculate rental customer credit exposure."
      ],
      "retrieval_phrases": [
        "Rental customer credit exposure",
        "rental customer credit exposure"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1200,
            "b": 500,
            "c": 8000,
            "d": 25,
            "e": 3000
          },
          "outputs": [
            {
              "label": "Included active-asset exposure (currency)",
              "value": 2000
            },
            {
              "label": "Net customer exposure (currency)",
              "value": 2700
            },
            {
              "label": "Exposure above supplied limit (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1850",
      "name": "Rental downtime attribution",
      "category": "Equipment hire and rental operations",
      "status": "available",
      "purpose": "No overlapping cause attribution on the same asset-day. Lost contribution assumes demand would have filled every unavailable day.",
      "url": "/calculators/rental-downtime-attribution/",
      "version": "696d76208343d8361297c3b99bc8dc436d7c665517befa1fb91ac14e4977386d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Downtime rental-days by cause",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Total fleet calendar asset-days",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Lost contribution per unavailable rental-day (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total downtime rental-days",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Downtime share of fleet calendar (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Scenario contribution lost by cause (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "No overlapping cause attribution on the same asset-day. Lost contribution assumes demand would have filled every unavailable day."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total downtime rental-days",
          "text": "Add mutually exclusive asset-day outages by cause."
        },
        {
          "label": "Downtime share of fleet calendar (%)",
          "text": "Compare outages with fleet asset-days."
        },
        {
          "label": "Scenario contribution lost by cause (currency)",
          "text": "Apply the assumed contribution opportunity per outage day."
        }
      ],
      "example_questions": [
        "Use the Rental downtime attribution calculator.",
        "Help me calculate rental downtime attribution."
      ],
      "retrieval_phrases": [
        "Rental downtime attribution",
        "rental downtime attribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,3,2",
            "b": 100,
            "c": 40
          },
          "outputs": [
            {
              "label": "Total downtime rental-days",
              "value": 10
            },
            {
              "label": "Downtime share of fleet calendar (%)",
              "value": 10
            },
            {
              "label": "Scenario contribution lost by cause (currency)",
              "value": "200, 120, 80"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1852",
      "name": "Coworking membership mix capacity",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Attendance is a scenario expectation, not a peak-availability guarantee. All attending members and guests require one desk each.",
      "url": "/calculators/coworking-membership-mix-capacity/",
      "version": "919385edf41218deaafcf6f5de1710a747baecc8983be92a97df1d74be7939ae",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Members by plan type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Assumed daily attendance by plan (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Usable desks",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Guest desks required per day",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected member desk demand",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total expected occupied desks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Whole desk gap",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Attendance is a scenario expectation, not a peak-availability guarantee. All attending members and guests require one desk each."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected member desk demand",
          "text": "Multiply members by plan-specific attendance assumptions."
        },
        {
          "label": "Total expected occupied desks",
          "text": "Add guest desk demand."
        },
        {
          "label": "Whole desk gap",
          "text": "Round member demand upward and compare with desks."
        }
      ],
      "example_questions": [
        "Use the Coworking membership mix capacity calculator.",
        "Help me calculate coworking membership mix capacity."
      ],
      "retrieval_phrases": [
        "Coworking membership mix capacity",
        "coworking membership mix capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,20",
            "b": "50,80",
            "c": 30,
            "d": 4
          },
          "outputs": [
            {
              "label": "Expected member desk demand",
              "value": 36
            },
            {
              "label": "Total expected occupied desks",
              "value": 40
            },
            {
              "label": "Whole desk gap",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1853",
      "name": "Coworking meeting credit settlement",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Expiry happens before the listed bookings; oldest eligible credits are used first, with no cash value attached to unused credit.",
      "url": "/calculators/coworking-meeting-credit-settlement/",
      "version": "43bd5504c6c5f93f550cd8d89f4e598c03105e88510c1690f7690bae6689ed26",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Opening meeting credits",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New period meeting credits",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Credits expiring before bookings",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Booking charges in credits",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Maximum credits allowed to roll forward",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Cash price per excess credit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Credits available after expiry",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Excess booking credits",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Overage invoice (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Credits rolled forward",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Expiry happens before the listed bookings; oldest eligible credits are used first, with no cash value attached to unused credit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Credits available after expiry",
          "text": "Add new credits and deduct known expiry before use."
        },
        {
          "label": "Excess booking credits",
          "text": "Compare bookings with available credits."
        },
        {
          "label": "Overage invoice (currency)",
          "text": "Price only booking credits beyond allowance."
        },
        {
          "label": "Credits rolled forward",
          "text": "Cap unused credit carryover under the supplied rule."
        }
      ],
      "example_questions": [
        "Use the Coworking meeting credit settlement calculator.",
        "Help me calculate coworking meeting credit settlement."
      ],
      "retrieval_phrases": [
        "Coworking meeting credit settlement",
        "coworking meeting credit settlement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 20,
            "c": 5,
            "d": 30,
            "e": 10,
            "f": 5
          },
          "outputs": [
            {
              "label": "Credits available after expiry",
              "value": 25
            },
            {
              "label": "Excess booking credits",
              "value": 5
            },
            {
              "label": "Overage invoice (currency)",
              "value": 25
            },
            {
              "label": "Credits rolled forward",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1856",
      "name": "Coworking day-pass membership comparison",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "All visits fall within one membership/bundle validity period, with no membership extras. Enumeration is bounded by at most 1000 bundle candidates from the 1000-visit limit.",
      "url": "/calculators/coworking-day-pass-membership-comparison/",
      "version": "24427130a95c03a76b452e984efd5809b94667dd6d8db61457cae69a494bf5cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Planned desk visits",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Single day-pass price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Visits included in one pass bundle",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Bundle price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Monthly unlimited membership (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Single-pass total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cheapest bundle-and-single mix (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unlimited membership total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Cheapest supported total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All visits fall within one membership/bundle validity period, with no membership extras. Enumeration is bounded by at most 1000 bundle candidates from the 1000-visit limit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Single-pass total (currency)",
          "text": "Buy each visit individually."
        },
        {
          "label": "Cheapest bundle-and-single mix (currency)",
          "text": "Enumerate feasible whole bundle counts, including one partly used final bundle."
        },
        {
          "label": "Unlimited membership total (currency)",
          "text": "Use the supplied unlimited monthly price."
        },
        {
          "label": "Cheapest supported total (currency)",
          "text": "Compare unlimited membership with every bundle/single mix."
        }
      ],
      "example_questions": [
        "Use the Coworking day-pass membership comparison calculator.",
        "Help me calculate coworking day-pass membership comparison."
      ],
      "retrieval_phrases": [
        "Coworking day-pass membership comparison",
        "coworking day pass membership comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 25,
            "c": 5,
            "d": 100,
            "e": 250
          },
          "outputs": [
            {
              "label": "Single-pass total (currency)",
              "value": 300
            },
            {
              "label": "Cheapest bundle-and-single mix (currency)",
              "value": 250
            },
            {
              "label": "Unlimited membership total (currency)",
              "value": 250
            },
            {
              "label": "Cheapest supported total (currency)",
              "value": 250
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1857",
      "name": "Coworking shared printer allocation",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Counts refer to billed pages, with duplex treatment already resolved. Supplied operating cost must cover the same reporting period.",
      "url": "/calculators/coworking-shared-printer-allocation/",
      "version": "700008208bec4afca3d0fd3208662cfd0217646d39a63ae797c75110ba86446c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Monochrome page counts by member",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Colour page counts by member",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Monochrome charge per page (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Colour charge per page (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Total supplier printing cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Member print charges (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total recovered printing charges (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cost recovery surplus (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts refer to billed pages, with duplex treatment already resolved. Supplied operating cost must cover the same reporting period."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Member print charges (currency)",
          "text": "Price each member monochrome and colour usage separately."
        },
        {
          "label": "Total recovered printing charges (currency)",
          "text": "Sum member usage charges."
        },
        {
          "label": "Cost recovery surplus (currency)",
          "text": "Deduct supplied printer operating cost."
        }
      ],
      "example_questions": [
        "Use the Coworking shared printer allocation calculator.",
        "Help me calculate coworking shared printer allocation."
      ],
      "retrieval_phrases": [
        "Coworking shared printer allocation",
        "coworking shared printer allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "20,40",
            "c": 0.05,
            "d": 0.2,
            "e": 15
          },
          "outputs": [
            {
              "label": "Member print charges (currency)",
              "value": "9, 10.5"
            },
            {
              "label": "Total recovered printing charges (currency)",
              "value": 19.5
            },
            {
              "label": "Cost recovery surplus (currency)",
              "value": 4.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1858",
      "name": "Coworking internet concurrency budget",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Measured demands and concurrency are supplied, including overhead if relevant. A ratio below one does not guarantee latency or service quality.",
      "url": "/calculators/coworking-internet-concurrency-budget/",
      "version": "859b1473eb95eb0d5b38d017c35f862cbc35cb9391984da5900eee4f2ca91588",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Concurrent users by application class",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured average bandwidth per user by class (Mbps)",
          "type": "array",
          "required": true,
          "unit": "Mbps",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Usable internet link capacity (Mbps)",
          "type": "number",
          "required": true,
          "unit": "Mbps",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Assumed burst multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mean scenario bandwidth (Mbps)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Burst scenario bandwidth (Mbps)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Burst contention ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Burst capacity gap (Mbps)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Measured demands and concurrency are supplied, including overhead if relevant. A ratio below one does not guarantee latency or service quality."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mean scenario bandwidth (Mbps)",
          "text": "Add application-class concurrent user demand."
        },
        {
          "label": "Burst scenario bandwidth (Mbps)",
          "text": "Apply the entered common burst factor."
        },
        {
          "label": "Burst contention ratio",
          "text": "Divide burst demand by usable link capacity."
        },
        {
          "label": "Burst capacity gap (Mbps)",
          "text": "Report demand above usable link speed."
        }
      ],
      "example_questions": [
        "Use the Coworking internet concurrency budget calculator.",
        "Help me calculate coworking internet concurrency budget."
      ],
      "retrieval_phrases": [
        "Coworking internet concurrency budget",
        "coworking internet concurrency budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,5",
            "b": "2,10",
            "c": 100,
            "d": 1.5
          },
          "outputs": [
            {
              "label": "Mean scenario bandwidth (Mbps)",
              "value": 90
            },
            {
              "label": "Burst scenario bandwidth (Mbps)",
              "value": 135
            },
            {
              "label": "Burst contention ratio",
              "value": 1.35
            },
            {
              "label": "Burst capacity gap (Mbps)",
              "value": 35
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1860",
      "name": "Coworking access-card reconciliation",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Unmatched active records and departed-member records are disjoint. Inventory audit only; card deactivation status must be checked in the access system.",
      "url": "/calculators/coworking-access-card-reconciliation/",
      "version": "1518a341b88667b83fa3ec6d4980a58fb034648a567ea3c149e4a66eca65029b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cards issued to active members",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cards returned by active members",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cards issued to departed members",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Cards returned by departed members",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Active-member card records with no valid member match",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Active-member cards still outstanding",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Departed-member cards not returned",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Outstanding cards requiring record review",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Unmatched active records and departed-member records are disjoint. Inventory audit only; card deactivation status must be checked in the access system."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Active-member cards still outstanding",
          "text": "Subtract active-member returns from issues."
        },
        {
          "label": "Departed-member cards not returned",
          "text": "Count unreturned cards assigned to former members."
        },
        {
          "label": "Outstanding cards requiring record review",
          "text": "Combine departed-member outstanding cards and unmatched active records."
        }
      ],
      "example_questions": [
        "Use the Coworking access-card reconciliation calculator.",
        "Help me calculate coworking access-card reconciliation."
      ],
      "retrieval_phrases": [
        "Coworking access-card reconciliation",
        "coworking access card reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 5,
            "c": 30,
            "d": 20,
            "e": 2
          },
          "outputs": [
            {
              "label": "Active-member cards still outstanding",
              "value": 95
            },
            {
              "label": "Departed-member cards not returned",
              "value": 10
            },
            {
              "label": "Outstanding cards requiring record review",
              "value": 12
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1865",
      "name": "Coworking revenue per usable desk",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Dedicated and hot desks are physical usable desks, without membership double counting. Revenue recognition convention must be consistent across inputs.",
      "url": "/calculators/coworking-revenue-per-usable-desk/",
      "version": "66274b4069e6685a8a0579f51617f8837cf98bba723482eb9c31bc8c0c02b399",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Period coworking receipts (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dedicated desks in service",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hot desks in service",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable reporting days",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Desk receipts excluding non-desk services (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total revenue per usable desk (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Desk-only revenue per usable desk-day",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Non-desk receipts share (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Dedicated and hot desks are physical usable desks, without membership double counting. Revenue recognition convention must be consistent across inputs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total revenue per usable desk (currency)",
          "text": "Divide all receipts by in-service desks."
        },
        {
          "label": "Desk-only revenue per usable desk-day",
          "text": "Divide desk-only receipts by usable desk-days."
        },
        {
          "label": "Non-desk receipts share (%)",
          "text": "Compare non-desk receipts with all period receipts."
        }
      ],
      "example_questions": [
        "Use the Coworking revenue per usable desk calculator.",
        "Help me calculate coworking revenue per usable desk."
      ],
      "retrieval_phrases": [
        "Coworking revenue per usable desk",
        "coworking revenue per usable desk"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12000,
            "b": 20,
            "c": 30,
            "d": 20,
            "e": 10000
          },
          "outputs": [
            {
              "label": "Total revenue per usable desk (currency)",
              "value": 240
            },
            {
              "label": "Desk-only revenue per usable desk-day",
              "value": 10
            },
            {
              "label": "Non-desk receipts share (%)",
              "value": 16.666666666666668
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1866",
      "name": "Coworking utility cost allocation",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Weights are supplied policy inputs and may represent floor area or another agreed basis. No tariff or tenancy-law determination.",
      "url": "/calculators/coworking-utility-cost-allocation/",
      "version": "225b68c357543f2765fe144c0e85eb1b102efc31246745105002235f80eb522f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Tenant submeter use (kWh)",
          "type": "array",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Shared unmetered use (kWh)",
          "type": "number",
          "required": true,
          "unit": "kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Shared-load allocation weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Energy price (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": "currency/kWh",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fixed bill charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Shared energy allocated by tenant (kWh)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Tenant charges (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Reconciled total utility charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Weights are supplied policy inputs and may represent floor area or another agreed basis. No tariff or tenancy-law determination."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Shared energy allocated by tenant (kWh)",
          "text": "Allocate shared energy in proportion to supplied weights."
        },
        {
          "label": "Tenant charges (currency)",
          "text": "Charge metered use and allocate shared energy plus fixed charges by weight."
        },
        {
          "label": "Reconciled total utility charge (currency)",
          "text": "Add all measured and shared use at the unit price plus fixed bill charge."
        }
      ],
      "example_questions": [
        "Use the Coworking utility cost allocation calculator.",
        "Help me calculate coworking utility cost allocation."
      ],
      "retrieval_phrases": [
        "Coworking utility cost allocation",
        "coworking utility cost allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": 100,
            "c": "1,3",
            "d": 0.2,
            "e": 20
          },
          "outputs": [
            {
              "label": "Shared energy allocated by tenant (kWh)",
              "value": "25, 75"
            },
            {
              "label": "Tenant charges (currency)",
              "value": "30, 70"
            },
            {
              "label": "Reconciled total utility charge (currency)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1867",
      "name": "Coworking overflow partner budget",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "One partner per day with interchangeable desks; every unmet desk-day is reported without assuming carryover to another date.",
      "url": "/calculators/coworking-overflow-partner-budget/",
      "version": "5a085fab650f2e886b9038c25e3733298a348baaa2b9d86a53d5e44a632fcc9f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Excess desk demand by day",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Partner available desks by day",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Partner desk-day rates (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Partner desk-days booked by day",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unmet desk-days by day",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total overflow cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One partner per day with interchangeable desks; every unmet desk-day is reported without assuming carryover to another date."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Partner desk-days booked by day",
          "text": "Use partner desks up to excess demand and partner capacity."
        },
        {
          "label": "Unmet desk-days by day",
          "text": "Report excess demand beyond partner availability."
        },
        {
          "label": "Total overflow cost (currency)",
          "text": "Price the feasible desk-day allocations."
        }
      ],
      "example_questions": [
        "Use the Coworking overflow partner budget calculator.",
        "Help me calculate coworking overflow partner budget."
      ],
      "retrieval_phrases": [
        "Coworking overflow partner budget",
        "coworking overflow partner budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,10",
            "b": "4,12",
            "c": "20,25"
          },
          "outputs": [
            {
              "label": "Partner desk-days booked by day",
              "value": "4, 10"
            },
            {
              "label": "Unmet desk-days by day",
              "value": "1, 0"
            },
            {
              "label": "Total overflow cost (currency)",
              "value": 330
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1868",
      "name": "Coworking member guest allowance",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Visits are counted under the supplied plan policy within one billing period; allowances are not pooled or carried forward.",
      "url": "/calculators/coworking-member-guest-allowance/",
      "version": "cefb9fdc90edc9a4346930929717a181f90f05cf50c5727119109935ec290886",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Guest visits by member",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Included guest visits by member",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Overage charge per guest visit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Overage visits by member",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unused allowance by member",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total guest overage charges (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Visits are counted under the supplied plan policy within one billing period; allowances are not pooled or carried forward."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Overage visits by member",
          "text": "Compare each member usage with their included allowance."
        },
        {
          "label": "Unused allowance by member",
          "text": "Show member-specific remaining guest entitlement."
        },
        {
          "label": "Total guest overage charges (currency)",
          "text": "Charge only overage; unused allowances cannot offset another member."
        }
      ],
      "example_questions": [
        "Use the Coworking member guest allowance calculator.",
        "Help me calculate coworking member guest allowance."
      ],
      "retrieval_phrases": [
        "Coworking member guest allowance",
        "coworking member guest allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "6,3",
            "b": "4,5",
            "c": 10
          },
          "outputs": [
            {
              "label": "Overage visits by member",
              "value": "2, 0"
            },
            {
              "label": "Unused allowance by member",
              "value": "0, 2"
            },
            {
              "label": "Total guest overage charges (currency)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1870",
      "name": "Coworking mail handling workload",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Steady-state arrivals with one collection per item; mean inventory excludes peak buffers, oversize packages and abandoned mail.",
      "url": "/calculators/coworking-mail-handling-workload/",
      "version": "b0dafbca4f41bfa53cfe0dba5d4fa3dce31d1a8a1f62ce9d60831f887efe929e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Mail items received per day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Handling minutes per incoming item",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average storage duration (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Average occupied shelf volume per item (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Collection handling minutes per item",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Daily handling hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mean items held in storage",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Mean shelf volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Steady-state arrivals with one collection per item; mean inventory excludes peak buffers, oversize packages and abandoned mail."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Daily handling hours",
          "text": "Include incoming processing and eventual collection handling."
        },
        {
          "label": "Mean items held in storage",
          "text": "Multiply daily arrivals by mean storage duration."
        },
        {
          "label": "Mean shelf volume (L)",
          "text": "Multiply circulating mail inventory by item shelf volume."
        }
      ],
      "example_questions": [
        "Use the Coworking mail handling workload calculator.",
        "Help me calculate coworking mail handling workload."
      ],
      "retrieval_phrases": [
        "Coworking mail handling workload",
        "coworking mail handling workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 1.5,
            "c": 3,
            "d": 0.5,
            "e": 0.5
          },
          "outputs": [
            {
              "label": "Daily handling hours",
              "value": 3.3333333333333335
            },
            {
              "label": "Mean items held in storage",
              "value": 300
            },
            {
              "label": "Mean shelf volume (L)",
              "value": 150
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1872",
      "name": "Coworking meeting no-show recovery",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "No-show statuses are observed, release delay is supplied policy and recovery probability is a scenario assumption.",
      "url": "/calculators/coworking-meeting-no-show-recovery/",
      "version": "19750ee462306be819d368e8cc71b74d39f21463f527c9e3223b746b9fd79cca",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Booked meeting durations (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "No-show indicator per booking (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Release delay for unclaimed room (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Probability released minutes are rebooked (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "No-show booked minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Minutes releasable after delay",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected recovered room-minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "No-show statuses are observed, release delay is supplied policy and recovery probability is a scenario assumption."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "No-show booked minutes",
          "text": "Add full booked duration of no-show meetings."
        },
        {
          "label": "Minutes releasable after delay",
          "text": "Deduct release delay from each no-show booking, floored at zero."
        },
        {
          "label": "Expected recovered room-minutes",
          "text": "Apply the supplied rebooking probability to releasable time."
        }
      ],
      "example_questions": [
        "Use the Coworking meeting no-show recovery calculator.",
        "Help me calculate coworking meeting no-show recovery."
      ],
      "retrieval_phrases": [
        "Coworking meeting no-show recovery",
        "coworking meeting no show recovery"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "60,90",
            "b": "1,0",
            "c": 15,
            "d": 50
          },
          "outputs": [
            {
              "label": "No-show booked minutes",
              "value": 60
            },
            {
              "label": "Minutes releasable after delay",
              "value": 45
            },
            {
              "label": "Expected recovered room-minutes",
              "value": 22.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1874",
      "name": "Coworking space expansion scenario",
      "category": "Coworking and shared facilities",
      "status": "available",
      "purpose": "Undiscounted scenario with stable pricing and occupancy. Excludes financing, tax and physical occupancy certification.",
      "url": "/calculators/coworking-space-expansion-scenario/",
      "version": "8b1ec85272e4dd4134877bffd849259817dbde499d5b27601979df008dac45b5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "New desks in expansion",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Assumed paid desk occupancy (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly receipts per occupied desk (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Added monthly rent and fixed operations (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Monthly variable cost per occupied desk (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "One-time fit-out cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected occupied added desks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Monthly incremental contribution (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Fit-out simple payback (months)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Break-even occupied desks",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Undiscounted scenario with stable pricing and occupancy. Excludes financing, tax and physical occupancy certification."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected occupied added desks",
          "text": "Apply the assumed paid occupancy to new desks."
        },
        {
          "label": "Monthly incremental contribution (currency)",
          "text": "Deduct variable desk costs and added fixed operations."
        },
        {
          "label": "Fit-out simple payback (months)",
          "text": "Divide fit-out cost by positive incremental monthly contribution."
        },
        {
          "label": "Break-even occupied desks",
          "text": "Divide added fixed costs by per-desk contribution."
        }
      ],
      "example_questions": [
        "Use the Coworking space expansion scenario calculator.",
        "Help me calculate coworking space expansion scenario."
      ],
      "retrieval_phrases": [
        "Coworking space expansion scenario",
        "coworking space expansion scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 75,
            "c": 300,
            "d": 2500,
            "e": 50,
            "f": 15000
          },
          "outputs": [
            {
              "label": "Expected occupied added desks",
              "value": 15
            },
            {
              "label": "Monthly incremental contribution (currency)",
              "value": 1250
            },
            {
              "label": "Fit-out simple payback (months)",
              "value": 12
            },
            {
              "label": "Break-even occupied desks",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1876",
      "name": "Subscription cohort payback curve",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Observed whole-month payback, no interpolation or future forecast. Negative later contributions can reverse an earlier recovery.",
      "url": "/calculators/subscription-cohort-payback-curve/",
      "version": "4087c53353698ffb1473291913f226582e7b7afd6e0c86b2763f35a6ec4233f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cohort acquisition cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Net cohort contributions by month (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cumulative cohort contributions (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "First end-month recovering acquisition cost",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Final net return after acquisition (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Observed whole-month payback, no interpolation or future forecast. Negative later contributions can reverse an earlier recovery."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cumulative cohort contributions (currency)",
          "text": "Accumulate observed net contribution month by month."
        },
        {
          "label": "First end-month recovering acquisition cost",
          "text": "Find the first observed cumulative balance covering acquisition cost."
        },
        {
          "label": "Final net return after acquisition (currency)",
          "text": "Deduct acquisition cost from all supplied monthly contribution."
        }
      ],
      "example_questions": [
        "Use the Subscription cohort payback curve calculator.",
        "Help me calculate subscription cohort payback curve."
      ],
      "retrieval_phrases": [
        "Subscription cohort payback curve",
        "subscription cohort payback curve"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": "200,300,600"
          },
          "outputs": [
            {
              "label": "Cumulative cohort contributions (currency)",
              "value": "200, 500, 1100"
            },
            {
              "label": "First end-month recovering acquisition cost",
              "value": 3
            },
            {
              "label": "Final net return after acquisition (currency)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1877",
      "name": "Subscription deferred revenue schedule",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Even recognition across equal complete service periods is an explicit supplied convention. Does not determine accounting-policy eligibility.",
      "url": "/calculators/subscription-deferred-revenue-schedule/",
      "version": "24f31ddc44a7315717c5dbc6fe0dcc13c0279c467e3df7d81f6f4366ff1eab3f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Prepayments by contract (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Equal service periods in each contract",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Completed service periods by contract",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Revenue recognized per complete period by contract",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cumulative recognized revenue (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Deferred balances by contract (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Total remaining deferred balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Even recognition across equal complete service periods is an explicit supplied convention. Does not determine accounting-policy eligibility."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Revenue recognized per complete period by contract",
          "text": "Spread each supplied prepayment evenly over its service periods."
        },
        {
          "label": "Cumulative recognized revenue (currency)",
          "text": "Multiply each period amount by completed service periods."
        },
        {
          "label": "Deferred balances by contract (currency)",
          "text": "Deduct completed-period recognition from each prepayment."
        },
        {
          "label": "Total remaining deferred balance (currency)",
          "text": "Sum remaining contract balances."
        }
      ],
      "example_questions": [
        "Use the Subscription deferred revenue schedule calculator.",
        "Help me calculate subscription deferred revenue schedule."
      ],
      "retrieval_phrases": [
        "Subscription deferred revenue schedule",
        "subscription deferred revenue schedule"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1200,600",
            "b": "12,6",
            "c": "3,2"
          },
          "outputs": [
            {
              "label": "Revenue recognized per complete period by contract",
              "value": "100, 100"
            },
            {
              "label": "Cumulative recognized revenue (currency)",
              "value": 500
            },
            {
              "label": "Deferred balances by contract (currency)",
              "value": "900, 400"
            },
            {
              "label": "Total remaining deferred balance (currency)",
              "value": 1300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1880",
      "name": "Subscription grandfathered price exposure",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Account counts remain fixed and all accounts migrate on the supplied cohort schedule; no churn response or price-change permission is inferred.",
      "url": "/calculators/subscription-grandfathered-price-exposure/",
      "version": "281f8999e7f6bd858d4a3abbc4831b52f3e9ae7795adadae4f68303d20c20063",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Legacy accounts by cohort",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Legacy monthly price by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Current monthly price by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Months until migration by cohort",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly legacy discount exposure by cohort",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Exposure until planned migration (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Monthly receipts after all migrations (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Account counts remain fixed and all accounts migrate on the supplied cohort schedule; no churn response or price-change permission is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly legacy discount exposure by cohort",
          "text": "Compare current-price and legacy-price receipts at unchanged account counts."
        },
        {
          "label": "Exposure until planned migration (currency)",
          "text": "Multiply monthly revenue differences by the supplied migration delay."
        },
        {
          "label": "Monthly receipts after all migrations (currency)",
          "text": "Apply current prices to all accounts."
        }
      ],
      "example_questions": [
        "Use the Subscription grandfathered price exposure calculator.",
        "Help me calculate subscription grandfathered price exposure."
      ],
      "retrieval_phrases": [
        "Subscription grandfathered price exposure",
        "subscription grandfathered price exposure"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "10,15",
            "c": "12,20",
            "d": "3,6"
          },
          "outputs": [
            {
              "label": "Monthly legacy discount exposure by cohort",
              "value": "200, 250"
            },
            {
              "label": "Exposure until planned migration (currency)",
              "value": 2100
            },
            {
              "label": "Monthly receipts after all migrations (currency)",
              "value": 2200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1881",
      "name": "Subscription plan migration proration",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Actual-day proration with identical included/excluded day convention for old and new plans. All credit and fee terms are supplied.",
      "url": "/calculators/subscription-plan-migration-proration/",
      "version": "99ef0eeee03e5460da90f86b999d8bf4c152706918f25bca3a1b31d2eaf22734",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Old plan full-cycle price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New plan full-cycle price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Days in billing cycle",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Unused billable days at migration",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "One-time migration fee (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unused old-plan credit (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining-cycle new-plan charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Net migration invoice adjustment (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Actual-day proration with identical included/excluded day convention for old and new plans. All credit and fee terms are supplied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unused old-plan credit (currency)",
          "text": "Prorate the old price by unused days."
        },
        {
          "label": "Remaining-cycle new-plan charge (currency)",
          "text": "Prorate the new price over the same remaining days."
        },
        {
          "label": "Net migration invoice adjustment (currency)",
          "text": "Deduct old credit from new charge and add the supplied fee."
        }
      ],
      "example_questions": [
        "Use the Subscription plan migration proration calculator.",
        "Help me calculate subscription plan migration proration."
      ],
      "retrieval_phrases": [
        "Subscription plan migration proration",
        "subscription plan migration proration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 50,
            "c": 30,
            "d": 12,
            "e": 5
          },
          "outputs": [
            {
              "label": "Unused old-plan credit (currency)",
              "value": 12
            },
            {
              "label": "Remaining-cycle new-plan charge (currency)",
              "value": 20
            },
            {
              "label": "Net migration invoice adjustment (currency)",
              "value": 13
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1882",
      "name": "Subscription usage tier invoice",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Two marginal tiers, not an all-units volume discount. Usage quantities and tier thresholds share the same billing unit.",
      "url": "/calculators/subscription-usage-tier-invoice/",
      "version": "64056bbbaa5415816d3e753c1200383886e92e11213f422f31edff65736d11e4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Metered usage units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Included allowance units",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "First overage tier width (units)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "First overage rate (currency/unit)",
          "type": "number",
          "required": true,
          "unit": "currency/unit",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Remaining overage rate (currency/unit)",
          "type": "number",
          "required": true,
          "unit": "currency/unit",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Base subscription fee (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "First-tier billable units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Second-tier billable units",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Usage invoice total (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Two marginal tiers, not an all-units volume discount. Usage quantities and tier thresholds share the same billing unit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "First-tier billable units",
          "text": "Apply the first marginal rate to usage immediately above allowance."
        },
        {
          "label": "Second-tier billable units",
          "text": "Count usage beyond the allowance plus first tier."
        },
        {
          "label": "Usage invoice total (currency)",
          "text": "Add base fee and the two marginal usage charges."
        }
      ],
      "example_questions": [
        "Use the Subscription usage tier invoice calculator.",
        "Help me calculate subscription usage tier invoice."
      ],
      "retrieval_phrases": [
        "Subscription usage tier invoice",
        "subscription usage tier invoice"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 250,
            "b": 100,
            "c": 100,
            "d": 0.2,
            "e": 0.1,
            "f": 30
          },
          "outputs": [
            {
              "label": "First-tier billable units",
              "value": 100
            },
            {
              "label": "Second-tier billable units",
              "value": 50
            },
            {
              "label": "Usage invoice total (currency)",
              "value": 55
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1883",
      "name": "Subscription seat true-up",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Segments partition one full billing cycle without overlaps or gaps. Daily proration uses the maximum of actual seats and committed minimum.",
      "url": "/calculators/subscription-seat-true-up/",
      "version": "88e57d35fbf9e7fd9ed421ee3c83917ab4108079d714362ab7d24561f9b4fbba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Seat counts in successive cycle segments",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Billable days in each segment",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Committed minimum seat count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Full-cycle seat price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Seat subscription amount already invoiced (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Billed seat-days after minimum",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Weighted average billable seats",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Final cycle seat charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "True-up amount (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Segments partition one full billing cycle without overlaps or gaps. Daily proration uses the maximum of actual seats and committed minimum."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Billed seat-days after minimum",
          "text": "Apply committed minimum separately to each dated segment."
        },
        {
          "label": "Weighted average billable seats",
          "text": "Divide billed seat-days by cycle days."
        },
        {
          "label": "Final cycle seat charge (currency)",
          "text": "Price the day-weighted seat count."
        },
        {
          "label": "True-up amount (currency)",
          "text": "Subtract the amount already invoiced."
        }
      ],
      "example_questions": [
        "Use the Subscription seat true-up calculator.",
        "Help me calculate subscription seat true-up."
      ],
      "retrieval_phrases": [
        "Subscription seat true-up",
        "subscription seat true up"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,15,12",
            "b": "10,10,10",
            "c": 10,
            "d": 30,
            "e": 300
          },
          "outputs": [
            {
              "label": "Billed seat-days after minimum",
              "value": 370
            },
            {
              "label": "Weighted average billable seats",
              "value": 12.333333333333334
            },
            {
              "label": "Final cycle seat charge (currency)",
              "value": 370
            },
            {
              "label": "True-up amount (currency)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1885",
      "name": "Subscription dunning recovery cohorts",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Recovery is measured by money, not customer count. Cohorts use equal observation windows and recoveries exclude duplicate payments.",
      "url": "/calculators/subscription-dunning-recovery-cohorts/",
      "version": "ee77bc2739bbf8d78b180f1a717dd62ba368cc9a8baf4f15fbe3c363432b7cec",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initially failed charges by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Gross successful recoveries by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Retry processing fees by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Retry attempts by cohort",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Value recovery rates by cohort (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net recovered receipts (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unrecovered failed value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Processing fees per retry attempt (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Recovery is measured by money, not customer count. Cohorts use equal observation windows and recoveries exclude duplicate payments."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Value recovery rates by cohort (%)",
          "text": "Divide recovered charge value by initially failed value."
        },
        {
          "label": "Net recovered receipts (currency)",
          "text": "Deduct all retry processing fees from recovered receipts."
        },
        {
          "label": "Unrecovered failed value (currency)",
          "text": "Subtract recoveries from originally failed charges."
        },
        {
          "label": "Processing fees per retry attempt (currency)",
          "text": "Divide all retry fees by attempt count."
        }
      ],
      "example_questions": [
        "Use the Subscription dunning recovery cohorts calculator.",
        "Help me calculate subscription dunning recovery cohorts."
      ],
      "retrieval_phrases": [
        "Subscription dunning recovery cohorts",
        "subscription dunning recovery cohorts"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,500",
            "b": "600,400",
            "c": "30,20",
            "d": "100,50"
          },
          "outputs": [
            {
              "label": "Value recovery rates by cohort (%)",
              "value": "60, 80"
            },
            {
              "label": "Net recovered receipts (currency)",
              "value": 950
            },
            {
              "label": "Unrecovered failed value (currency)",
              "value": 500
            },
            {
              "label": "Processing fees per retry attempt (currency)",
              "value": 0.3333333333333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1888",
      "name": "Subscription credit note allocation",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Input order is the supplied application priority; credit cannot be applied beyond an invoice balance. No tax or legal priority rule is inferred.",
      "url": "/calculators/subscription-credit-note-allocation/",
      "version": "71eb3fd7cb7e9a659687a599bee5f40e7229d3c76b119d7be1db3e5dd0c1b6ee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Open invoice balances in application order (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Available credit note value (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Credit applied by invoice (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining invoice balances (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused credit balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Input order is the supplied application priority; credit cannot be applied beyond an invoice balance. No tax or legal priority rule is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Credit applied by invoice (currency)",
          "text": "Apply credit sequentially to invoices in supplied priority order."
        },
        {
          "label": "Remaining invoice balances (currency)",
          "text": "Subtract credit applied to each invoice."
        },
        {
          "label": "Unused credit balance (currency)",
          "text": "Return credit beyond all open balances."
        }
      ],
      "example_questions": [
        "Use the Subscription credit note allocation calculator.",
        "Help me calculate subscription credit note allocation."
      ],
      "retrieval_phrases": [
        "Subscription credit note allocation",
        "subscription credit note allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200,300",
            "b": 250
          },
          "outputs": [
            {
              "label": "Credit applied by invoice (currency)",
              "value": "100, 150, 0"
            },
            {
              "label": "Remaining invoice balances (currency)",
              "value": "0, 50, 300"
            },
            {
              "label": "Unused credit balance (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1889",
      "name": "Subscription contraction attribution",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Mutually exclusive reason per account; supplied cohort can be filtered before entry. Gross contraction excludes new accounts and expansion offsets.",
      "url": "/calculators/subscription-contraction-attribution/",
      "version": "d4c4be903589b4de797febeeb9ce21fa50fc80d6ab2c3a789bdcac0f18e3b078",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Beginning recurring revenue by account (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Ending recurring revenue by account (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Reason code by account (1=seats, 2=plan, 3=other)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gross contraction by account (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Contraction by reason: seats, plan, other",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Gross recurring-revenue contraction (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Mutually exclusive reason per account; supplied cohort can be filtered before entry. Gross contraction excludes new accounts and expansion offsets."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gross contraction by account (currency)",
          "text": "Keep only decreases and do not net them against expansions."
        },
        {
          "label": "Contraction by reason: seats, plan, other",
          "text": "Aggregate each account decrease under its supplied exclusive reason."
        },
        {
          "label": "Gross recurring-revenue contraction (currency)",
          "text": "Add all account decreases independently of positive changes."
        }
      ],
      "example_questions": [
        "Use the Subscription contraction attribution calculator.",
        "Help me calculate subscription contraction attribution."
      ],
      "retrieval_phrases": [
        "Subscription contraction attribution",
        "subscription contraction attribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200,300",
            "b": "80,150,350",
            "c": "1,2,3"
          },
          "outputs": [
            {
              "label": "Gross contraction by account (currency)",
              "value": "20, 50, 0"
            },
            {
              "label": "Contraction by reason: seats, plan, other",
              "value": "20, 50, 0"
            },
            {
              "label": "Gross recurring-revenue contraction (currency)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1890",
      "name": "Subscription expansion attribution",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Exact sequential bridge: change seats first at old price, then price across ending seats, then usage. Components may be negative; no interaction is double counted.",
      "url": "/calculators/subscription-expansion-attribution/",
      "version": "679fc47dc322ed729f7a7ded87e9860256c9c0384c7f32765f605755ac147563",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Beginning paid seats",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Ending paid seats",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Beginning recurring price per seat (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Ending recurring price per seat (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Beginning recurring usage charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Ending recurring usage charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Seat-count contribution to revenue change",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Plan-price contribution to revenue change",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Usage contribution to revenue change",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Total recurring-revenue change (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Exact sequential bridge: change seats first at old price, then price across ending seats, then usage. Components may be negative; no interaction is double counted."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Seat-count contribution to revenue change",
          "text": "Value seat changes at the beginning seat price."
        },
        {
          "label": "Plan-price contribution to revenue change",
          "text": "Value price changes across ending seats, allocating interaction here."
        },
        {
          "label": "Usage contribution to revenue change",
          "text": "Subtract beginning usage revenue from ending usage revenue."
        },
        {
          "label": "Total recurring-revenue change (currency)",
          "text": "Reconcile the three components to actual revenue change."
        }
      ],
      "example_questions": [
        "Use the Subscription expansion attribution calculator.",
        "Help me calculate subscription expansion attribution."
      ],
      "retrieval_phrases": [
        "Subscription expansion attribution",
        "subscription expansion attribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 12,
            "c": 20,
            "d": 25,
            "e": 100,
            "f": 150
          },
          "outputs": [
            {
              "label": "Seat-count contribution to revenue change",
              "value": 40
            },
            {
              "label": "Plan-price contribution to revenue change",
              "value": 60
            },
            {
              "label": "Usage contribution to revenue change",
              "value": 50
            },
            {
              "label": "Total recurring-revenue change (currency)",
              "value": 150
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1891",
      "name": "Subscription coupon liability",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "All redeeming accounts retain the plan for the full coupon term. Valid cycles are supplied after expiry rules; no liability recognition conclusion.",
      "url": "/calculators/subscription-coupon-liability/",
      "version": "29585e26db877c1447d70d6ee6eb99e0a5b3e0aba0ca129831c46ef892304abc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible coupon accounts",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Subscription price per billing cycle (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Coupon discount (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Coupon-valid billing cycles",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Assumed eligible accounts redeeming (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum coupon discount exposure (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Scenario redeemed discount exposure (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Discount per redeemed account (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All redeeming accounts retain the plan for the full coupon term. Valid cycles are supplied after expiry rules; no liability recognition conclusion."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum coupon discount exposure (currency)",
          "text": "Apply discount to all eligible accounts for every valid cycle."
        },
        {
          "label": "Scenario redeemed discount exposure (currency)",
          "text": "Apply assumed account redemption to maximum exposure."
        },
        {
          "label": "Discount per redeemed account (currency)",
          "text": "Calculate the full-cycle coupon benefit per redeeming account."
        }
      ],
      "example_questions": [
        "Use the Subscription coupon liability calculator.",
        "Help me calculate subscription coupon liability."
      ],
      "retrieval_phrases": [
        "Subscription coupon liability",
        "subscription coupon liability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 20,
            "c": 25,
            "d": 3,
            "e": 60
          },
          "outputs": [
            {
              "label": "Maximum coupon discount exposure (currency)",
              "value": 1500
            },
            {
              "label": "Scenario redeemed discount exposure (currency)",
              "value": 900
            },
            {
              "label": "Discount per redeemed account (currency)",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1892",
      "name": "Subscription committed-use shortfall",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Take-or-pay commitment with no rollover or refund. Usage forecasts and rates are supplied; current usage may already exceed commitment.",
      "url": "/calculators/subscription-committed-use-shortfall/",
      "version": "320cab3fd041b8f7d1eb549b3e1116cb6a9b547b4058a54b1c8dce4715d8361a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Committed usage units for term",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Usage already consumed",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Forecast remaining usage",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Committed unit price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Overage unit price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Forecast total term usage",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Forecast unused commitment (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Forecast overage (units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Forecast total term charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Value of unused commitment (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Take-or-pay commitment with no rollover or refund. Usage forecasts and rates are supplied; current usage may already exceed commitment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Forecast total term usage",
          "text": "Add actual usage to forecast remaining use."
        },
        {
          "label": "Forecast unused commitment (units)",
          "text": "Subtract forecast use from committed quantity."
        },
        {
          "label": "Forecast overage (units)",
          "text": "Count usage beyond commitment."
        },
        {
          "label": "Forecast total term charge (currency)",
          "text": "Bill the full committed quantity plus any overage."
        },
        {
          "label": "Value of unused commitment (currency)",
          "text": "Value unused committed units at their prepaid unit rate."
        }
      ],
      "example_questions": [
        "Use the Subscription committed-use shortfall calculator.",
        "Help me calculate subscription committed-use shortfall."
      ],
      "retrieval_phrases": [
        "Subscription committed-use shortfall",
        "subscription committed use shortfall"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 600,
            "c": 300,
            "d": 2,
            "e": 3
          },
          "outputs": [
            {
              "label": "Forecast total term usage",
              "value": 900
            },
            {
              "label": "Forecast unused commitment (units)",
              "value": 100
            },
            {
              "label": "Forecast overage (units)",
              "value": 0
            },
            {
              "label": "Forecast total term charge (currency)",
              "value": 2000
            },
            {
              "label": "Value of unused commitment (currency)",
              "value": 200
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1893",
      "name": "Subscription cancellation save-offer economics",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Assumes the account would otherwise contribute nothing and the recurring offer lasts through all retained months. No causal retention estimate is made.",
      "url": "/calculators/subscription-cancellation-save-offer-economics/",
      "version": "2462ddad6b429e7c71067a490889f6a88f16bf151c96d6f9a430849ca65ca7a6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "One-time retention offer cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Normal monthly contribution per account (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Monthly contribution reduction during offer (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Assumed additional retained months",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly contribution after offer (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Break-even retained months",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Whole retained months to recover offer",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Scenario net retention contribution (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes the account would otherwise contribute nothing and the recurring offer lasts through all retained months. No causal retention estimate is made."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly contribution after offer (currency)",
          "text": "Deduct recurring offer cost from normal contribution."
        },
        {
          "label": "Break-even retained months",
          "text": "Divide one-time offer cost by ongoing contribution after offer."
        },
        {
          "label": "Whole retained months to recover offer",
          "text": "Round break-even time up to completed monthly periods."
        },
        {
          "label": "Scenario net retention contribution (currency)",
          "text": "Accumulate retained monthly contribution and subtract initial offer cost."
        }
      ],
      "example_questions": [
        "Use the Subscription cancellation save-offer economics calculator.",
        "Help me calculate subscription cancellation save-offer economics."
      ],
      "retrieval_phrases": [
        "Subscription cancellation save-offer economics",
        "subscription cancellation save offer economics"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 30,
            "c": 10,
            "d": 6
          },
          "outputs": [
            {
              "label": "Monthly contribution after offer (currency)",
              "value": 20
            },
            {
              "label": "Break-even retained months",
              "value": 3
            },
            {
              "label": "Whole retained months to recover offer",
              "value": 3
            },
            {
              "label": "Scenario net retention contribution (currency)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1894",
      "name": "Subscription reactivation cohort value",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Observed period value, not lifetime value or proof that the offer caused reactivation. Other costs belong in support or offer inputs only if defined consistently.",
      "url": "/calculators/subscription-reactivation-cohort-value/",
      "version": "f57a8a5cd498b90f5dbfe251784a29df6dbb7b85051921672657e708952d8bd5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Reactivated accounts by cohort",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observed cohort receipts (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Cohort support costs (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Cohort reactivation offer costs (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed net value by cohort (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net value per reactivated account by cohort",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Combined net cohort value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Observed period value, not lifetime value or proof that the offer caused reactivation. Other costs belong in support or offer inputs only if defined consistently."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed net value by cohort (currency)",
          "text": "Deduct measured support and offer costs from receipts."
        },
        {
          "label": "Net value per reactivated account by cohort",
          "text": "Divide net cohort value by reactivated account count."
        },
        {
          "label": "Combined net cohort value (currency)",
          "text": "Aggregate all observed net values."
        }
      ],
      "example_questions": [
        "Use the Subscription reactivation cohort value calculator.",
        "Help me calculate subscription reactivation cohort value."
      ],
      "retrieval_phrases": [
        "Subscription reactivation cohort value",
        "subscription reactivation cohort value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "1000,1600",
            "c": "100,300",
            "d": "200,400"
          },
          "outputs": [
            {
              "label": "Observed net value by cohort (currency)",
              "value": "700, 900"
            },
            {
              "label": "Net value per reactivated account by cohort",
              "value": "70, 45"
            },
            {
              "label": "Combined net cohort value (currency)",
              "value": 1600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1895",
      "name": "Subscription billing error reconciliation",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Positive adjustments add charges and negative adjustments are credits. Expected invoice amounts must be independently established; no tariff is inferred.",
      "url": "/calculators/subscription-billing-error-reconciliation/",
      "version": "7a07a69e8576895f123f802829d9dfe6fa4bbbc560bf3202cdf85df6bfe40b56",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Expected invoice totals by account (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Issued invoice totals by account (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Signed posted billing adjustments (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Residual billing errors by account (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Residual overbilling (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Residual underbilling (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Net residual billing error (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Positive adjustments add charges and negative adjustments are credits. Expected invoice amounts must be independently established; no tariff is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Residual billing errors by account (currency)",
          "text": "Apply signed adjustments and compare with expected invoices."
        },
        {
          "label": "Residual overbilling (currency)",
          "text": "Add positive residual errors without netting underbilling."
        },
        {
          "label": "Residual underbilling (currency)",
          "text": "Add absolute negative residual errors separately."
        },
        {
          "label": "Net residual billing error (currency)",
          "text": "Reconcile all posted billing to all expected billing."
        }
      ],
      "example_questions": [
        "Use the Subscription billing error reconciliation calculator.",
        "Help me calculate subscription billing error reconciliation."
      ],
      "retrieval_phrases": [
        "Subscription billing error reconciliation",
        "subscription billing error reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200,300",
            "b": "110,180,300",
            "c": "-5,10,0"
          },
          "outputs": [
            {
              "label": "Residual billing errors by account (currency)",
              "value": "5, -10, 0"
            },
            {
              "label": "Residual overbilling (currency)",
              "value": 5
            },
            {
              "label": "Residual underbilling (currency)",
              "value": 10
            },
            {
              "label": "Net residual billing error (currency)",
              "value": -5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1897",
      "name": "Subscription support allocation by plan",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "One plan per ticket/account and one reporting period. Handling time must include after-contact work if it is to be costed.",
      "url": "/calculators/subscription-support-allocation-by-plan/",
      "version": "91ac5e343243462e1f1f85d60f15ba463633d22a593f99ca6df1c67ffdf2dca7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Support ticket counts by subscription plan",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Mean handling time by plan (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Active accounts by plan",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Loaded support labour rate (currency/hour)",
          "type": "number",
          "required": true,
          "unit": "currency/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Support labour hours by plan",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Support cost by plan (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Support cost per active account by plan",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One plan per ticket/account and one reporting period. Handling time must include after-contact work if it is to be costed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Support labour hours by plan",
          "text": "Multiply tickets by mean handling time."
        },
        {
          "label": "Support cost by plan (currency)",
          "text": "Price measured handling work at the supplied labour rate."
        },
        {
          "label": "Support cost per active account by plan",
          "text": "Allocate each plan cost across its active accounts."
        }
      ],
      "example_questions": [
        "Use the Subscription support allocation by plan calculator.",
        "Help me calculate subscription support allocation by plan."
      ],
      "retrieval_phrases": [
        "Subscription support allocation by plan",
        "subscription support allocation by plan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "6,12",
            "c": "200,50",
            "d": 30
          },
          "outputs": [
            {
              "label": "Support labour hours by plan",
              "value": "10, 10"
            },
            {
              "label": "Support cost by plan (currency)",
              "value": "300, 300"
            },
            {
              "label": "Support cost per active account by plan",
              "value": "1.5, 6"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1899",
      "name": "Subscription minimum-commitment exit",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Illustrates supplied settlement rules only; excess prepayment is a remaining balance, not a determination of refund entitlement.",
      "url": "/calculators/subscription-minimum-commitment-exit/",
      "version": "5e46da9edb5832573d2a0916968f3df08b2b588bc6a473a3547f6dae68563864",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Remaining committed billing periods",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Price per remaining period (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Early-exit fee as share of remaining charges (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Unapplied prepaid balance (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Other supplied exit charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Remaining scheduled commitment (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Exit charge before prepayment (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional settlement payable (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Prepayment remaining after settlement (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Illustrates supplied settlement rules only; excess prepayment is a remaining balance, not a determination of refund entitlement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Remaining scheduled commitment (currency)",
          "text": "Price all remaining committed billing periods."
        },
        {
          "label": "Exit charge before prepayment (currency)",
          "text": "Apply the supplied exit percentage and fixed exit charge."
        },
        {
          "label": "Additional settlement payable (currency)",
          "text": "Offset exit charges with unapplied prepayment."
        },
        {
          "label": "Prepayment remaining after settlement (currency)",
          "text": "Report excess prepayment under the entered offset assumption."
        }
      ],
      "example_questions": [
        "Use the Subscription minimum-commitment exit calculator.",
        "Help me calculate subscription minimum-commitment exit."
      ],
      "retrieval_phrases": [
        "Subscription minimum-commitment exit",
        "subscription minimum commitment exit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6,
            "b": 50,
            "c": 40,
            "d": 80,
            "e": 10
          },
          "outputs": [
            {
              "label": "Remaining scheduled commitment (currency)",
              "value": 300
            },
            {
              "label": "Exit charge before prepayment (currency)",
              "value": 130
            },
            {
              "label": "Additional settlement payable (currency)",
              "value": 50
            },
            {
              "label": "Prepayment remaining after settlement (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1900",
      "name": "Subscription renewal workload calendar",
      "category": "Subscription product operations",
      "status": "available",
      "purpose": "Weeks are listed in chronological order, all incoming reviews are due within their week and oldest backlog is cleared first.",
      "url": "/calculators/subscription-renewal-workload-calendar/",
      "version": "bd5ed543bbd02e1efec77d9bb9f1fd9a10ffb0d0294fea119bbcefd8a594c1d4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Renewals needing review by week",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Review minutes per renewal",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Account managers available by week",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Renewal-review hours per manager-week",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Opening overdue renewal reviews",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Review capacity by week",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required review workload by week (hours)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Ending overdue backlog by week",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Weeks are listed in chronological order, all incoming reviews are due within their week and oldest backlog is cleared first."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Review capacity by week",
          "text": "Convert manager review hours to complete review capacity."
        },
        {
          "label": "Required review workload by week (hours)",
          "text": "Price incoming renewals in review time."
        },
        {
          "label": "Ending overdue backlog by week",
          "text": "Carry uncompleted reviews forward after using each week capacity."
        }
      ],
      "example_questions": [
        "Use the Subscription renewal workload calendar calculator.",
        "Help me calculate subscription renewal workload calendar."
      ],
      "retrieval_phrases": [
        "Subscription renewal workload calendar",
        "subscription renewal workload calendar"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,30",
            "b": 30,
            "c": "2,2",
            "d": 5,
            "e": 5
          },
          "outputs": [
            {
              "label": "Review capacity by week",
              "value": "20, 20"
            },
            {
              "label": "Required review workload by week (hours)",
              "value": "10, 15"
            },
            {
              "label": "Ending overdue backlog by week",
              "value": "5, 15"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1926",
      "name": "Bank statement reconciliation",
      "category": "Bookkeeping and financial records",
      "status": "available",
      "purpose": "One bank account and one statement date. Reconciling items are independently verified; differences identify unresolved entries rather than an automatic posting.",
      "url": "/calculators/bank-statement-reconciliation/",
      "version": "cd234ce7b893cb6e1b7fd10aa523dcf747de6c4f75e73da0470c1bd4fa77a45c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Statement closing bank balance (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Deposits in transit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Outstanding issued payments (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Ledger cash balance (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Unrecorded bank charges (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Unrecorded bank credits (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Adjusted bank balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Adjusted ledger balance (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unreconciled difference (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One bank account and one statement date. Reconciling items are independently verified; differences identify unresolved entries rather than an automatic posting."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Adjusted bank balance (currency)",
          "text": "Add deposits in transit and deduct outstanding payments."
        },
        {
          "label": "Adjusted ledger balance (currency)",
          "text": "Record known bank charges and credits in the cash ledger."
        },
        {
          "label": "Unreconciled difference (currency)",
          "text": "Subtract adjusted ledger balance from adjusted bank balance."
        }
      ],
      "example_questions": [
        "Use the Bank statement reconciliation calculator.",
        "Help me calculate bank statement reconciliation."
      ],
      "retrieval_phrases": [
        "Bank statement reconciliation",
        "bank statement reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5000,
            "b": 500,
            "c": 800,
            "d": 4800,
            "e": 100,
            "f": 0
          },
          "outputs": [
            {
              "label": "Adjusted bank balance (currency)",
              "value": 4700
            },
            {
              "label": "Adjusted ledger balance (currency)",
              "value": 4700
            },
            {
              "label": "Unreconciled difference (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1927",
      "name": "Petty cash imprest reconciliation",
      "category": "Bookkeeping and financial records",
      "status": "available",
      "purpose": "Imprest reconciliation. Advances remain outstanding assets and are not replenished as expenses until substantiated; shortages are not automatically reimbursed.",
      "url": "/calculators/petty-cash-imprest-reconciliation/",
      "version": "41996454e911667994a18c3e7bf3ad368366dbaae549ceb4dd375a7c7b8b8aa8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Authorized petty-cash float (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Physical cash counted (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supported expense vouchers (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Approved outstanding staff advances (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total accounted float (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Shortage or unexplained surplus (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Replenishment for vouched expenses (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Cash expected after voucher replenishment (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Imprest reconciliation. Advances remain outstanding assets and are not replenished as expenses until substantiated; shortages are not automatically reimbursed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total accounted float (currency)",
          "text": "Add physical cash, supported vouchers and approved outstanding advances."
        },
        {
          "label": "Shortage or unexplained surplus (currency)",
          "text": "Positive result is a shortage; negative result is a surplus."
        },
        {
          "label": "Replenishment for vouched expenses (currency)",
          "text": "Replace only expenses backed by approved vouchers."
        },
        {
          "label": "Cash expected after voucher replenishment (currency)",
          "text": "Add the authorized voucher replenishment to counted cash."
        }
      ],
      "example_questions": [
        "Use the Petty cash imprest reconciliation calculator.",
        "Help me calculate petty cash imprest reconciliation."
      ],
      "retrieval_phrases": [
        "Petty cash imprest reconciliation",
        "petty cash imprest reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 120,
            "c": 350,
            "d": 20
          },
          "outputs": [
            {
              "label": "Total accounted float (currency)",
              "value": 490
            },
            {
              "label": "Shortage or unexplained surplus (currency)",
              "value": 10
            },
            {
              "label": "Replenishment for vouched expenses (currency)",
              "value": 350
            },
            {
              "label": "Cash expected after voucher replenishment (currency)",
              "value": 470
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1947",
      "name": "Journal entry balance check",
      "category": "Bookkeeping and financial records",
      "status": "available",
      "purpose": "A numerical balance check does not establish that accounts, dates or amounts are substantively correct. Debit and credit lists may have different lengths.",
      "url": "/calculators/journal-entry-balance-check/",
      "version": "79de2d50bfdd9093511b166c00416fe7b60297864d58c033ec71053b69e91250",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Debit line amounts (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Credit line amounts (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Allowed balance tolerance (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total debits (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total credits (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Debit-minus-credit difference (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Balance check under supplied tolerance",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A numerical balance check does not establish that accounts, dates or amounts are substantively correct. Debit and credit lists may have different lengths."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total debits (currency)",
          "text": "Add all entered debit journal lines."
        },
        {
          "label": "Total credits (currency)",
          "text": "Add all entered credit journal lines."
        },
        {
          "label": "Debit-minus-credit difference (currency)",
          "text": "Compare the two sides of the journal."
        },
        {
          "label": "Balance check under supplied tolerance",
          "text": "Test the absolute difference against the supplied threshold."
        }
      ],
      "example_questions": [
        "Use the Journal entry balance check calculator.",
        "Help me calculate journal entry balance check."
      ],
      "retrieval_phrases": [
        "Journal entry balance check",
        "journal entry balance check"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "120,20",
            "c": 0.01
          },
          "outputs": [
            {
              "label": "Total debits (currency)",
              "value": 150
            },
            {
              "label": "Total credits (currency)",
              "value": 140
            },
            {
              "label": "Debit-minus-credit difference (currency)",
              "value": 10
            },
            {
              "label": "Balance check under supplied tolerance",
              "value": "Out of balance"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-1977",
      "name": "Fundraising matched-gift cap",
      "category": "Nonprofit and community fundraising",
      "status": "available",
      "purpose": "Each gift represents one distinct eligible donor or an already combined donor total. Matching eligibility and donor/campaign caps are supplied.",
      "url": "/calculators/fundraising-matched-gift-cap/",
      "version": "5e860fa172c6ce907277fe3ff10c56e05db58ada08d3597d30afe5245770ea66",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible donor gift amounts (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Matching multiplier",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Maximum matching amount per donor (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Remaining campaign matching pool (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Uncapped match request (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Match request after per-donor caps (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Campaign match payable (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Campaign match shortfall after caps (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each gift represents one distinct eligible donor or an already combined donor total. Matching eligibility and donor/campaign caps are supplied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Uncapped match request (currency)",
          "text": "Multiply all eligible gifts by the supplied match multiplier."
        },
        {
          "label": "Match request after per-donor caps (currency)",
          "text": "Cap matching amount separately for each donor."
        },
        {
          "label": "Campaign match payable (currency)",
          "text": "Apply the remaining campaign pool limit."
        },
        {
          "label": "Campaign match shortfall after caps (currency)",
          "text": "Report capped donor requests beyond remaining matching funds."
        }
      ],
      "example_questions": [
        "Use the Fundraising matched-gift cap calculator.",
        "Help me calculate fundraising matched-gift cap."
      ],
      "retrieval_phrases": [
        "Fundraising matched-gift cap",
        "fundraising matched gift cap"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,300,600",
            "b": 1,
            "c": 200,
            "d": 500
          },
          "outputs": [
            {
              "label": "Uncapped match request (currency)",
              "value": 1000
            },
            {
              "label": "Match request after per-donor caps (currency)",
              "value": 500
            },
            {
              "label": "Campaign match payable (currency)",
              "value": 500
            },
            {
              "label": "Campaign match shortfall after caps (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Financial-method review and dated rule provenance before release. Advice or statutory compliance is outside an unreviewed draft.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2502",
      "name": "Test flaky failure probability",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Observed failure frequency is used as a fixed probability. Future detection assumes identical independent runs; this is not a confidence interval.",
      "url": "/calculators/test-flaky-failure-probability/",
      "version": "e294800ebaa51306f7e694a9ea6444e5cd3e706c78a06df54f20782bd2784f94",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Failed runs (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Total repeated runs (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Future independent runs (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed failure rate (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "At least one future failure (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Observed failure frequency is used as a fixed probability. Future detection assumes identical independent runs; this is not a confidence interval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed failure rate (%)",
          "text": "Divide failed runs by total runs."
        },
        {
          "label": "At least one future failure (%)",
          "text": "Subtract the probability that every future run passes from one."
        }
      ],
      "example_questions": [
        "Use the Test flaky failure probability calculator.",
        "Help me calculate test flaky failure probability."
      ],
      "retrieval_phrases": [
        "Test flaky failure probability",
        "test flaky failure probability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Observed failure rate (%)",
              "value": 20
            },
            {
              "label": "At least one future failure (%)",
              "value": 35.999999999999986
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2503",
      "name": "Test retry masking audit",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Counts are for one test run; a hidden failure is an initially failing test that later passed. Retry attempts must include at least one attempt per recovered test.",
      "url": "/calculators/test-retry-masking-audit/",
      "version": "f27000a43fece236bdf48938fe943ee41334e5392ab6d3b70294987ca8e6cb73",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial failed tests (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Failures passing on retry (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Retry attempts executed (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Mean retry duration (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Masked failures (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unresolved failures (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional runtime (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts are for one test run; a hidden failure is an initially failing test that later passed. Retry attempts must include at least one attempt per recovered test."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Masked failures (count)",
          "text": "Count initially failed tests that passed on retry."
        },
        {
          "label": "Unresolved failures (count)",
          "text": "Subtract recovered tests from initial failures."
        },
        {
          "label": "Additional runtime (seconds)",
          "text": "Multiply retry attempts by measured average retry duration."
        }
      ],
      "example_questions": [
        "Use the Test retry masking audit calculator.",
        "Help me calculate test retry masking audit."
      ],
      "retrieval_phrases": [
        "Test retry masking audit",
        "test retry masking audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 6,
            "c": 12,
            "d": 5
          },
          "outputs": [
            {
              "label": "Masked failures (count)",
              "value": 6
            },
            {
              "label": "Unresolved failures (count)",
              "value": 4
            },
            {
              "label": "Additional runtime (seconds)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2504",
      "name": "Test mutation score breakdown",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Invalid mutants are excluded from the valid-mutant score and included in the generated-mutant denominator. Equivalent mutants must be classified externally.",
      "url": "/calculators/test-mutation-score-breakdown/",
      "version": "6f21574d8c388b7f26ccc6aa018342ee8fc32d0df0826bd68ffc7543dd77a069",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Killed mutants (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Surviving mutants (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Invalid mutants (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Valid mutation score (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Generated mutants (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Invalid share (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Invalid mutants are excluded from the valid-mutant score and included in the generated-mutant denominator. Equivalent mutants must be classified externally."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Valid mutation score (%)",
          "text": "Divide killed mutants by killed plus surviving mutants."
        },
        {
          "label": "Generated mutants (count)",
          "text": "Add all mutually exclusive outcome counts."
        },
        {
          "label": "Invalid share (%)",
          "text": "Divide invalid mutants by all generated mutants."
        }
      ],
      "example_questions": [
        "Use the Test mutation score breakdown calculator.",
        "Help me calculate test mutation score breakdown."
      ],
      "retrieval_phrases": [
        "Test mutation score breakdown",
        "test mutation score breakdown"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 20,
            "c": 10
          },
          "outputs": [
            {
              "label": "Valid mutation score (%)",
              "value": 75
            },
            {
              "label": "Generated mutants (count)",
              "value": 90
            },
            {
              "label": "Invalid share (%)",
              "value": 11.11111111111111
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2507",
      "name": "Test boundary partition inventory",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Supported partition is a single inclusive continuous numeric interval. The chosen step must fit within half the valid interval; generated cases cover just-outside, boundary and just-inside values.",
      "url": "/calculators/test-boundary-partition-inventory/",
      "version": "6135aa35c30e7a6d847296b5412ba4430a0d11d148aad7a750e9001322b1f64c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Inclusive numeric field minimum",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Inclusive numeric field maximum",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Chosen boundary test step",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Boundary candidate values",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected acceptance flags",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supported partition is a single inclusive continuous numeric interval. The chosen step must fit within half the valid interval; generated cases cover just-outside, boundary and just-inside values."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Boundary candidate values",
          "text": "Place one test step outside and inside each inclusive endpoint."
        },
        {
          "label": "Expected acceptance flags",
          "text": "Inclusive endpoints and interior points are valid; outside points are invalid."
        }
      ],
      "example_questions": [
        "Use the Test boundary partition inventory calculator.",
        "Help me calculate test boundary partition inventory."
      ],
      "retrieval_phrases": [
        "Test boundary partition inventory",
        "test boundary partition inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0,
            "b": 10,
            "c": 1
          },
          "outputs": [
            {
              "label": "Boundary candidate values",
              "value": "-1, 0, 1, 9, 10, 11"
            },
            {
              "label": "Expected acceptance flags",
              "value": "Reject, Accept, Accept, Accept, Accept, Reject"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2508",
      "name": "Test data volume sizing",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Uncompressed fixed-size records; metadata, indexes and replication are excluded. Cleanup removes all generations except the newest.",
      "url": "/calculators/test-data-volume-sizing/",
      "version": "3e32c72ec1362fa6161c24850eca8e5dd8f5d1c2065e5de21f3dc00992e2cc14",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Fixture cases (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Records per case (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bytes per record (bytes)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retained fixture generations (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "One fixture generation (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Retained storage (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Old-generation cleanup volume (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uncompressed fixed-size records; metadata, indexes and replication are excluded. Cleanup removes all generations except the newest."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "One fixture generation (bytes)",
          "text": "Multiply cases, records and record width."
        },
        {
          "label": "Retained storage (bytes)",
          "text": "Multiply one generation by retained generations."
        },
        {
          "label": "Old-generation cleanup volume (bytes)",
          "text": "Remove all but one retained generation."
        }
      ],
      "example_questions": [
        "Use the Test data volume sizing calculator.",
        "Help me calculate test data volume sizing."
      ],
      "retrieval_phrases": [
        "Test data volume sizing",
        "test data volume sizing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 100,
            "c": 500,
            "d": 3
          },
          "outputs": [
            {
              "label": "One fixture generation (bytes)",
              "value": 1000000
            },
            {
              "label": "Retained storage (bytes)",
              "value": 3000000
            },
            {
              "label": "Old-generation cleanup volume (bytes)",
              "value": 2000000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2511",
      "name": "Software defect escape rate",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Use the same observation period, severity grouping and deduplicated defect definition for both lists. Rates are descriptive, not causal.",
      "url": "/calculators/software-defect-escape-rate/",
      "version": "7de0b0226a6d09f4d4348373f5395a0b14e4af2ab76cb008fe795210baf4706f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pre-release defects by severity (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Post-release defects by severity (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Escape rates by severity (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Overall escape rate (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the same observation period, severity grouping and deduplicated defect definition for both lists. Rates are descriptive, not causal."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Escape rates by severity (%)",
          "text": "Divide escaped defects by all defects in each severity group."
        },
        {
          "label": "Overall escape rate (%)",
          "text": "Divide total post-release defects by total defects."
        }
      ],
      "example_questions": [
        "Use the Software defect escape rate calculator.",
        "Help me calculate software defect escape rate."
      ],
      "retrieval_phrases": [
        "Software defect escape rate",
        "software defect escape rate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "8,18",
            "b": "2,2"
          },
          "outputs": [
            {
              "label": "Escape rates by severity (%)",
              "value": "20, 10"
            },
            {
              "label": "Overall escape rate (%)",
              "value": 13.333333333333334
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2513",
      "name": "Software repair-time distribution",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "One already-grouped outage per row; timestamps use a shared origin. Percentiles use the nearest-rank method; overlapping outages remain separate events.",
      "url": "/calculators/software-repair-time-distribution/",
      "version": "84c69cfca727444b059e85cc121b0eb556651771a84ee82d85d35c1a2adf605e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Failure timestamps (elapsed minutes)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Recovery timestamps (elapsed minutes)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Repair durations (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mean repair time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "90th percentile repair time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One already-grouped outage per row; timestamps use a shared origin. Percentiles use the nearest-rank method; overlapping outages remain separate events."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Repair durations (minutes)",
          "text": "Subtract each failure timestamp from its matching recovery."
        },
        {
          "label": "Mean repair time (minutes)",
          "text": "Average the repair durations."
        },
        {
          "label": "90th percentile repair time (minutes)",
          "text": "Sort durations and select rank ceil(0.9 times count)."
        }
      ],
      "example_questions": [
        "Use the Software repair-time distribution calculator.",
        "Help me calculate software repair-time distribution."
      ],
      "retrieval_phrases": [
        "Software repair-time distribution",
        "software repair time distribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,10,30",
            "b": "5,20,45"
          },
          "outputs": [
            {
              "label": "Repair durations (minutes)",
              "value": "5, 10, 15"
            },
            {
              "label": "Mean repair time (minutes)",
              "value": 10
            },
            {
              "label": "90th percentile repair time (minutes)",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2515",
      "name": "Software series-system reliability",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Series system succeeds only when every component succeeds over the same interval. Independent component events are assumed; shared-cause failures are excluded.",
      "url": "/calculators/software-series-system-reliability/",
      "version": "3aa8491abefcc166cc80a4c8b34536745a48b07cd3fa851f030d1d02aa1f92f6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Independent component reliability (fractions)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Series reliability (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "System failure probability (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Series system succeeds only when every component succeeds over the same interval. Independent component events are assumed; shared-cause failures are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Series reliability (%)",
          "text": "Multiply independent component success probabilities."
        },
        {
          "label": "System failure probability (%)",
          "text": "Subtract series reliability from one."
        }
      ],
      "example_questions": [
        "Use the Software series-system reliability calculator.",
        "Help me calculate software series-system reliability."
      ],
      "retrieval_phrases": [
        "Software series-system reliability",
        "software series system reliability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0.9,0.8"
          },
          "outputs": [
            {
              "label": "Series reliability (%)",
              "value": 72.00000000000001
            },
            {
              "label": "System failure probability (%)",
              "value": 27.999999999999993
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2516",
      "name": "Software parallel redundancy reliability",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Supported threshold is one: the system works if at least one component works. Independent failures over the same interval are required; no shared-cause model.",
      "url": "/calculators/software-parallel-redundancy-reliability/",
      "version": "fa59c21ed191941bf920323babf4468c8c2a601078b186e6cbea6265bb1467de",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Independent component reliability (fractions)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "At-least-one reliability (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "All components fail (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supported threshold is one: the system works if at least one component works. Independent failures over the same interval are required; no shared-cause model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "At-least-one reliability (%)",
          "text": "Multiply component failure probabilities and subtract from one."
        },
        {
          "label": "All components fail (%)",
          "text": "Multiply all component failure probabilities."
        }
      ],
      "example_questions": [
        "Use the Software parallel redundancy reliability calculator.",
        "Help me calculate software parallel redundancy reliability."
      ],
      "retrieval_phrases": [
        "Software parallel redundancy reliability",
        "software parallel redundancy reliability"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0.9,0.8"
          },
          "outputs": [
            {
              "label": "At-least-one reliability (%)",
              "value": 98
            },
            {
              "label": "All components fail (%)",
              "value": 1.9999999999999991
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2518",
      "name": "Software release canary exposure",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Traffic rate and error probability stay constant within the entered stage schedule. Stages are sequential; potential failures are expected counts, not forecasts.",
      "url": "/calculators/software-release-canary-exposure/",
      "version": "37d8f9feea1900807d77993c76b5d6220aeea49ce29f6983d4a6fa24da0d6e08",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Canary stages (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Canary traffic share by stage (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Request arrival rate (requests/minute)",
          "type": "number",
          "required": true,
          "unit": "requests/minute",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Canary error scenario (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Canary-exposed requests (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Expected canary failures (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Traffic rate and error probability stay constant within the entered stage schedule. Stages are sequential; potential failures are expected counts, not forecasts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Canary-exposed requests (count)",
          "text": "Multiply each stage duration by traffic share and arrival rate, then add."
        },
        {
          "label": "Expected canary failures (count)",
          "text": "Multiply exposed requests by the supplied error rate."
        }
      ],
      "example_questions": [
        "Use the Software release canary exposure calculator.",
        "Help me calculate software release canary exposure."
      ],
      "retrieval_phrases": [
        "Software release canary exposure",
        "software release canary exposure"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "10,50",
            "c": 100,
            "d": 2
          },
          "outputs": [
            {
              "label": "Canary-exposed requests (count)",
              "value": 1100
            },
            {
              "label": "Expected canary failures (count)",
              "value": 22
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2519",
      "name": "Software rollback recovery budget",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Sequential recovery phases; affected request rate is held constant until warm-up finishes. This worksheet does not perform a rollback.",
      "url": "/calculators/software-rollback-recovery-budget/",
      "version": "e21af75a29b574ff327300b97227d74cfe76457028624fb4404ae5d76c557b15",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Detection delay (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Decision delay (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rollback duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Warm-up duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Affected requests (requests/minute)",
          "type": "number",
          "required": true,
          "unit": "requests/minute",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Decision reached (minute)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Recovery completed (minute)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Potential affected requests (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sequential recovery phases; affected request rate is held constant until warm-up finishes. This worksheet does not perform a rollback."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Decision reached (minute)",
          "text": "Add detection and decision delays."
        },
        {
          "label": "Recovery completed (minute)",
          "text": "Add all recovery phases."
        },
        {
          "label": "Potential affected requests (count)",
          "text": "Multiply elapsed recovery time by affected request rate."
        }
      ],
      "example_questions": [
        "Use the Software rollback recovery budget calculator.",
        "Help me calculate software rollback recovery budget."
      ],
      "retrieval_phrases": [
        "Software rollback recovery budget",
        "software rollback recovery budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 3,
            "c": 10,
            "d": 2,
            "e": 100
          },
          "outputs": [
            {
              "label": "Decision reached (minute)",
              "value": 8
            },
            {
              "label": "Recovery completed (minute)",
              "value": 20
            },
            {
              "label": "Potential affected requests (count)",
              "value": 2000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2520",
      "name": "Software deployment batch scheduling",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Fixed-size sequential batches; hosts in a batch deploy together, and validation occurs only between batches. Availability assumes every host in the active batch is unavailable.",
      "url": "/calculators/software-deployment-batch-scheduling/",
      "version": "7413280f5675d1bbcf5f475e8724be50c1453b4d25d7b97d021320bc54dcf6eb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Hosts to deploy (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Hosts per simultaneous batch (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Deployment per batch (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Validation between batches (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Deployment batches (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rollout duration (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Maximum unavailable hosts (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Last batch hosts (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed-size sequential batches; hosts in a batch deploy together, and validation occurs only between batches. Availability assumes every host in the active batch is unavailable."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Deployment batches (count)",
          "text": "Round host count divided by batch size upward."
        },
        {
          "label": "Rollout duration (minutes)",
          "text": "Add deployment duration for each batch and validation between batches."
        },
        {
          "label": "Maximum unavailable hosts (count)",
          "text": "Only the active batch is unavailable."
        },
        {
          "label": "Last batch hosts (count)",
          "text": "Subtract all complete earlier batches."
        }
      ],
      "example_questions": [
        "Use the Software deployment batch scheduling calculator.",
        "Help me calculate software deployment batch scheduling."
      ],
      "retrieval_phrases": [
        "Software deployment batch scheduling",
        "software deployment batch scheduling"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 3,
            "c": 4,
            "d": 2
          },
          "outputs": [
            {
              "label": "Deployment batches (count)",
              "value": 4
            },
            {
              "label": "Rollout duration (minutes)",
              "value": 22
            },
            {
              "label": "Maximum unavailable hosts (count)",
              "value": 3
            },
            {
              "label": "Last batch hosts (count)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2522",
      "name": "Software test maintenance cost",
      "category": "Software testing and reliability",
      "status": "available",
      "purpose": "Expected workload uses your observed failure frequency and handling time. Fractional expected failures are retained; no staffing efficiency adjustment.",
      "url": "/calculators/software-test-maintenance-cost/",
      "version": "274792c3d507492913e9590b6d6bf680e52d8b780e6224de3442c97a0cc21b2f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Maintained tests (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Review-triggering failure frequency (failures/test/month)",
          "type": "number",
          "required": true,
          "unit": "failures/test/month",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Review handling time (minutes/failure)",
          "type": "number",
          "required": true,
          "unit": "minutes/failure",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Scheduled maintenance (minutes/test/month)",
          "type": "number",
          "required": true,
          "unit": "minutes/test/month",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Failure review hours per month (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Scheduled maintenance hours per month (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total monthly workload (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Expected workload uses your observed failure frequency and handling time. Fractional expected failures are retained; no staffing efficiency adjustment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Failure review hours per month (hours)",
          "text": "Multiply tests, failure frequency and handling time; convert minutes to hours."
        },
        {
          "label": "Scheduled maintenance hours per month (hours)",
          "text": "Multiply tests by scheduled maintenance time."
        },
        {
          "label": "Total monthly workload (hours)",
          "text": "Add failure review and scheduled maintenance."
        }
      ],
      "example_questions": [
        "Use the Software test maintenance cost calculator.",
        "Help me calculate software test maintenance cost."
      ],
      "retrieval_phrases": [
        "Software test maintenance cost",
        "software test maintenance cost"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 0.1,
            "c": 6,
            "d": 1
          },
          "outputs": [
            {
              "label": "Failure review hours per month (hours)",
              "value": 2
            },
            {
              "label": "Scheduled maintenance hours per month (hours)",
              "value": 3.3333333333333335
            },
            {
              "label": "Total monthly workload (hours)",
              "value": 5.333333333333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2529",
      "name": "Security access-review workload",
      "category": "Security operations planning",
      "status": "available",
      "purpose": "Uniform entitlement workload distributed evenly; completion days round upward and exclude waiting for access decisions.",
      "url": "/calculators/security-access-review-workload/",
      "version": "83113fdbec5412422c27fac80e075dda7d50c42b437fc67307699fea74343868",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Accounts to review (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Entitlements per account (count)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Review minutes per entitlement (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reviewers (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Review hours per reviewer per day (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Review workload (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Completion workdays (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform entitlement workload distributed evenly; completion days round upward and exclude waiting for access decisions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Review workload (hours)",
          "text": "Multiply accounts, entitlements and review time."
        },
        {
          "label": "Completion workdays (days)",
          "text": "Divide workload by daily team capacity and round upward."
        }
      ],
      "example_questions": [
        "Use the Security access-review workload calculator.",
        "Help me calculate security access-review workload."
      ],
      "retrieval_phrases": [
        "Security access-review workload",
        "security access review workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 4,
            "c": 3,
            "d": 2,
            "e": 5
          },
          "outputs": [
            {
              "label": "Review workload (hours)",
              "value": 20
            },
            {
              "label": "Completion workdays (days)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2534",
      "name": "Security alert triage capacity",
      "category": "Security operations planning",
      "status": "available",
      "purpose": "Constant arrivals and processing capacity during the coverage period. Fluid workload approximation; it does not model bursts or priority queues.",
      "url": "/calculators/security-alert-triage-capacity/",
      "version": "bfb21aca3781a8c062a8f3f436d165540422331ead485026f588b57c07a024f3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Incoming alerts (alerts/hour)",
          "type": "number",
          "required": true,
          "unit": "alerts/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Mean triage time (minutes/alert)",
          "type": "number",
          "required": true,
          "unit": "minutes/alert",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Concurrent analysts (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Coverage period (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Starting backlog (alerts)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Triage capacity (alerts/hour)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "End backlog (alerts)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Analysts to match arrivals (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant arrivals and processing capacity during the coverage period. Fluid workload approximation; it does not model bursts or priority queues."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Triage capacity (alerts/hour)",
          "text": "Divide analyst minutes per hour by minutes per alert."
        },
        {
          "label": "End backlog (alerts)",
          "text": "Add arrivals and subtract available processing from starting backlog, floored at zero."
        },
        {
          "label": "Analysts to match arrivals (count)",
          "text": "Round the concurrent analyst workload upward."
        }
      ],
      "example_questions": [
        "Use the Security alert triage capacity calculator.",
        "Help me calculate security alert triage capacity."
      ],
      "retrieval_phrases": [
        "Security alert triage capacity",
        "security alert triage capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 4,
            "c": 1,
            "d": 8,
            "e": 20
          },
          "outputs": [
            {
              "label": "Triage capacity (alerts/hour)",
              "value": 15
            },
            {
              "label": "End backlog (alerts)",
              "value": 140
            },
            {
              "label": "Analysts to match arrivals (count)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2535",
      "name": "Security false-positive review burden",
      "category": "Security operations planning",
      "status": "available",
      "purpose": "Categories are disjoint and each alert receives the entered mean review duration; outcome assessment is supplied externally.",
      "url": "/calculators/security-false-positive-review-burden/",
      "version": "8fc82f239aa7fd52470a82d3e614096cd4ff614e173a8f3244a40c60c13083d0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "False-positive alerts by category (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "True-positive alerts by category (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Review minutes per alert by category (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "False-positive review time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "False-positive share of review time (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Categories are disjoint and each alert receives the entered mean review duration; outcome assessment is supplied externally."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "False-positive review time (minutes)",
          "text": "Multiply false positives by review time per category, then sum."
        },
        {
          "label": "False-positive share of review time (%)",
          "text": "Divide false-positive review time by all review time."
        }
      ],
      "example_questions": [
        "Use the Security false-positive review burden calculator.",
        "Help me calculate security false-positive review burden."
      ],
      "retrieval_phrases": [
        "Security false-positive review burden",
        "security false positive review burden"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "5,5",
            "c": "2,3"
          },
          "outputs": [
            {
              "label": "False-positive review time (minutes)",
              "value": 80
            },
            {
              "label": "False-positive share of review time (%)",
              "value": 76.19047619047619
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2540",
      "name": "Security phishing-training completion",
      "category": "Security operations planning",
      "status": "available",
      "purpose": "Reported messages refer to invited users who reported the simulation, whether or not they completed it. Counts are deduplicated users in the same exercise.",
      "url": "/calculators/security-phishing-training-completion/",
      "version": "83166de1af77919335923ed169bca38e9f2b518a25aabbbf11f6585380d177da",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Invitations by cohort (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Completed exercises by cohort (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Reported training messages by cohort (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Completion rates by cohort (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Overall completion (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Overall reporting (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reported messages refer to invited users who reported the simulation, whether or not they completed it. Counts are deduplicated users in the same exercise."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Completion rates by cohort (%)",
          "text": "Divide completions by invitations in each cohort."
        },
        {
          "label": "Overall completion (%)",
          "text": "Divide all completions by all invitations."
        },
        {
          "label": "Overall reporting (%)",
          "text": "Divide all reporters by all invitations."
        }
      ],
      "example_questions": [
        "Use the Security phishing-training completion calculator.",
        "Help me calculate security phishing-training completion."
      ],
      "retrieval_phrases": [
        "Security phishing-training completion",
        "security phishing training completion"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,30",
            "b": "15,15",
            "c": "5,10"
          },
          "outputs": [
            {
              "label": "Completion rates by cohort (%)",
              "value": "75, 50"
            },
            {
              "label": "Overall completion (%)",
              "value": 60
            },
            {
              "label": "Overall reporting (%)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2546",
      "name": "Security data retention deletion queue",
      "category": "Security operations planning",
      "status": "available",
      "purpose": "A record is due when age is at least the supplied retention duration. No legal rule is inferred and no deletion occurs.",
      "url": "/calculators/security-data-retention-deletion-queue/",
      "version": "426b05e04e9542e5e5b6339498c9429c6586ea0f38d62534c60cd79379c47e0c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Record ages (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Record volumes (MB)",
          "type": "array",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Retention duration (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Due record row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Due volume (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Retained volume (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A record is due when age is at least the supplied retention duration. No legal rule is inferred and no deletion occurs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Due record row numbers",
          "text": "Select records at or beyond their entered retention duration."
        },
        {
          "label": "Due volume (MB)",
          "text": "Add the volumes of selected records."
        },
        {
          "label": "Retained volume (MB)",
          "text": "Add the volumes of records younger than the threshold."
        }
      ],
      "example_questions": [
        "Use the Security data retention deletion queue calculator.",
        "Help me calculate security data retention deletion queue."
      ],
      "retrieval_phrases": [
        "Security data retention deletion queue",
        "security data retention deletion queue"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,30,50",
            "b": "2,3,5",
            "c": 30
          },
          "outputs": [
            {
              "label": "Due record row numbers",
              "value": "2, 3"
            },
            {
              "label": "Due volume (MB)",
              "value": 8
            },
            {
              "label": "Retained volume (MB)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2551",
      "name": "Classification confusion matrix metrics",
      "category": "Data science and machine learning evaluation",
      "status": "available",
      "purpose": "Binary classification with the positive class chosen by you. All counts refer to the same evaluation set; undefined precision or recall denominators are rejected.",
      "url": "/calculators/classification-confusion-matrix-metrics/",
      "version": "cd713a4e988d93878222294d2f63ab278673a2bd618b50fa82b11d6bba2a04b6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "True positives (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "False positives (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "False negatives (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "True negatives (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Positive-class precision (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Positive-class recall (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "F1 score (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Overall accuracy (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Binary classification with the positive class chosen by you. All counts refer to the same evaluation set; undefined precision or recall denominators are rejected."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Positive-class precision (%)",
          "text": "Divide true positives by predicted positives."
        },
        {
          "label": "Positive-class recall (%)",
          "text": "Divide true positives by actual positives."
        },
        {
          "label": "F1 score (%)",
          "text": "Use the harmonic mean of positive-class precision and recall."
        },
        {
          "label": "Overall accuracy (%)",
          "text": "Divide correct positive and negative predictions by all cases."
        }
      ],
      "example_questions": [
        "Use the Classification confusion matrix metrics calculator.",
        "Help me calculate classification confusion matrix metrics."
      ],
      "retrieval_phrases": [
        "Classification confusion matrix metrics",
        "classification confusion matrix metrics"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 10,
            "c": 20,
            "d": 40
          },
          "outputs": [
            {
              "label": "Positive-class precision (%)",
              "value": 75
            },
            {
              "label": "Positive-class recall (%)",
              "value": 60
            },
            {
              "label": "F1 score (%)",
              "value": 66.66666666666667
            },
            {
              "label": "Overall accuracy (%)",
              "value": 70
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2556",
      "name": "Classification Brier score",
      "category": "Data science and machine learning evaluation",
      "status": "available",
      "purpose": "Binary Brier score uses the mean squared difference between predicted event probability and observed zero/one outcome; range zero to one.",
      "url": "/calculators/classification-brier-score/",
      "version": "1663c692a1230f88cef8cc9882015dd010c8a3f9ee744cc0a1bce2ef3eceb97d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Predicted probabilities (fractions)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observed binary outcomes (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Brier score",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Binary Brier score uses the mean squared difference between predicted event probability and observed zero/one outcome; range zero to one."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Brier score",
          "text": "Square each probability error and average over examples."
        }
      ],
      "example_questions": [
        "Use the Classification Brier score calculator.",
        "Help me calculate classification brier score."
      ],
      "retrieval_phrases": [
        "Classification Brier score",
        "classification brier score"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,0.5,1",
            "b": "0,1,1"
          },
          "outputs": [
            {
              "label": "Brier score",
              "value": 0.08333333333333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2559",
      "name": "Regression residual diagnostics",
      "category": "Data science and machine learning evaluation",
      "status": "available",
      "purpose": "Unweighted paired residuals are prediction minus observation; all rows have equal importance. Percentage metrics and uncertainty estimates are excluded.",
      "url": "/calculators/regression-residual-diagnostics/",
      "version": "49df719dae230c4354d0b5f8557d4963442d37acf1e4299e6a83dd79681207f4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Predicted values (measurement units)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observed values (measurement units)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Residuals (measurement units)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mean absolute error (measurement units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Mean squared error (squared units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Mean bias (measurement units)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Unweighted paired residuals are prediction minus observation; all rows have equal importance. Percentage metrics and uncertainty estimates are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Residuals (measurement units)",
          "text": "Subtract observation from prediction for each row."
        },
        {
          "label": "Mean absolute error (measurement units)",
          "text": "Average absolute residuals."
        },
        {
          "label": "Mean squared error (squared units)",
          "text": "Average squared residuals."
        },
        {
          "label": "Mean bias (measurement units)",
          "text": "Average signed residuals."
        }
      ],
      "example_questions": [
        "Use the Regression residual diagnostics calculator.",
        "Help me calculate regression residual diagnostics."
      ],
      "retrieval_phrases": [
        "Regression residual diagnostics",
        "regression residual diagnostics"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,4,8",
            "b": "1,6,8"
          },
          "outputs": [
            {
              "label": "Residuals (measurement units)",
              "value": "1, -2, 0"
            },
            {
              "label": "Mean absolute error (measurement units)",
              "value": 1
            },
            {
              "label": "Mean squared error (squared units)",
              "value": 1.6666666666666667
            },
            {
              "label": "Mean bias (measurement units)",
              "value": -0.3333333333333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2560",
      "name": "Regression percentage error eligibility",
      "category": "Data science and machine learning evaluation",
      "status": "available",
      "purpose": "MAPE excludes zero observed outcomes and uses absolute observed values as denominators. Excluded rows remain explicitly identified; no replacement denominator is invented.",
      "url": "/calculators/regression-percentage-error-eligibility/",
      "version": "d4e77de0bfaa0823e00ff259fe43b6f3d5034baf9c99c6364872ed38af08f617",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Regression predictions (units)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observed outcomes (units)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Excluded zero-outcome row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Eligible absolute percentage errors (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "MAPE over eligible rows (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Eligible observation share (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "MAPE excludes zero observed outcomes and uses absolute observed values as denominators. Excluded rows remain explicitly identified; no replacement denominator is invented."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Excluded zero-outcome row numbers",
          "text": "Flag observations whose percentage error denominator is zero."
        },
        {
          "label": "Eligible absolute percentage errors (%)",
          "text": "Compute absolute relative error only for nonzero outcomes."
        },
        {
          "label": "MAPE over eligible rows (%)",
          "text": "Average absolute relative errors over eligible rows only."
        },
        {
          "label": "Eligible observation share (%)",
          "text": "Divide nonzero observed outcomes by all observations."
        }
      ],
      "example_questions": [
        "Use the Regression percentage error eligibility calculator.",
        "Help me calculate regression percentage error eligibility."
      ],
      "retrieval_phrases": [
        "Regression percentage error eligibility",
        "regression percentage error eligibility"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,10,30",
            "b": "0,20,30"
          },
          "outputs": [
            {
              "label": "Excluded zero-outcome row numbers",
              "value": "1"
            },
            {
              "label": "Eligible absolute percentage errors (%)",
              "value": "Excluded, 50, 0"
            },
            {
              "label": "MAPE over eligible rows (%)",
              "value": 25
            },
            {
              "label": "Eligible observation share (%)",
              "value": 66.66666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2562",
      "name": "Ranking reciprocal-rank summary",
      "category": "Data science and machine learning evaluation",
      "status": "available",
      "purpose": "Each query contributes reciprocal rank of its first relevant result; zero denotes no relevant result. All queries have equal weight.",
      "url": "/calculators/ranking-reciprocal-rank-summary/",
      "version": "d43b523212adc2265205560df129c7040e48f74aa349976be8f498523d632d67",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First relevant rank per query (0 means none)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mean reciprocal rank",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Queries with a relevant result (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "First-place result share (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each query contributes reciprocal rank of its first relevant result; zero denotes no relevant result. All queries have equal weight."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mean reciprocal rank",
          "text": "Average reciprocal ranks, assigning zero to unanswered queries."
        },
        {
          "label": "Queries with a relevant result (%)",
          "text": "Divide queries with a positive rank by all queries."
        },
        {
          "label": "First-place result share (%)",
          "text": "Divide rank-one queries by all queries."
        }
      ],
      "example_questions": [
        "Use the Ranking reciprocal-rank summary calculator.",
        "Help me calculate ranking reciprocal-rank summary."
      ],
      "retrieval_phrases": [
        "Ranking reciprocal-rank summary",
        "ranking reciprocal rank summary"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,0,4"
          },
          "outputs": [
            {
              "label": "Mean reciprocal rank",
              "value": 0.4375
            },
            {
              "label": "Queries with a relevant result (%)",
              "value": 75
            },
            {
              "label": "First-place result share (%)",
              "value": 25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2567",
      "name": "Dataset class imbalance audit",
      "category": "Data science and machine learning evaluation",
      "status": "available",
      "purpose": "Classes are mutually exclusive and exhaustive; every entered class must have observations. Imbalance is largest class divided by smallest.",
      "url": "/calculators/dataset-class-imbalance-audit/",
      "version": "ac533279b9180bee06574ead51b784c74db5177c0ed654f43abd783accb466e1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Class example counts (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Class shares (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Largest-to-smallest ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total examples (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Classes are mutually exclusive and exhaustive; every entered class must have observations. Imbalance is largest class divided by smallest."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Class shares (%)",
          "text": "Divide each class count by the total."
        },
        {
          "label": "Largest-to-smallest ratio",
          "text": "Divide largest count by smallest."
        },
        {
          "label": "Total examples (count)",
          "text": "Add all class counts."
        }
      ],
      "example_questions": [
        "Use the Dataset class imbalance audit calculator.",
        "Help me calculate dataset class imbalance audit."
      ],
      "retrieval_phrases": [
        "Dataset class imbalance audit",
        "dataset class imbalance audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,70"
          },
          "outputs": [
            {
              "label": "Class shares (%)",
              "value": "10, 20, 70"
            },
            {
              "label": "Largest-to-smallest ratio",
              "value": 7
            },
            {
              "label": "Total examples (count)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2572",
      "name": "Model inference batch throughput",
      "category": "Data science and machine learning evaluation",
      "status": "available",
      "purpose": "One fixed hardware/payload configuration; each measurement is end-to-end batch latency. A candidate is dominated when another has at least its throughput and no greater latency, with one strict improvement.",
      "url": "/calculators/model-inference-batch-throughput/",
      "version": "e04c6b967f7a22ba00b5a95ddeaff8ecd807384e07d9bf46674db2995b1a7bb3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured batch sizes (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured batch latency (milliseconds)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Throughputs (items/second)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Nondominated measurement row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One fixed hardware/payload configuration; each measurement is end-to-end batch latency. A candidate is dominated when another has at least its throughput and no greater latency, with one strict improvement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Throughputs (items/second)",
          "text": "Divide batch items by latency converted to seconds."
        },
        {
          "label": "Nondominated measurement row numbers",
          "text": "Remove measurements with a faster or equally fast lower-latency alternative."
        }
      ],
      "example_questions": [
        "Use the Model inference batch throughput calculator.",
        "Help me calculate model inference batch throughput."
      ],
      "retrieval_phrases": [
        "Model inference batch throughput",
        "model inference batch throughput"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,4,8",
            "b": "10,20,80"
          },
          "outputs": [
            {
              "label": "Throughputs (items/second)",
              "value": "100, 200, 100"
            },
            {
              "label": "Nondominated measurement row numbers",
              "value": "1, 2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2575",
      "name": "Model training token budget",
      "category": "Data science and machine learning evaluation",
      "status": "available",
      "purpose": "Expected token arithmetic with constant mean length and utilization; each epoch rounds up its own step count. Padding tokens are modeled as capacity minus useful tokens.",
      "url": "/calculators/model-training-token-budget/",
      "version": "c83a5163e497bc8df78313f1f33bd6f95efc835f722a3586b03b0b3ce3ddd309",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Dataset sequences (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Mean sequence tokens (tokens)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Training epochs (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Packed batch capacity (tokens)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Packing utilization (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Useful training tokens (tokens)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Optimizer steps (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Allocated batch token positions (tokens)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Expected token arithmetic with constant mean length and utilization; each epoch rounds up its own step count. Padding tokens are modeled as capacity minus useful tokens."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Useful training tokens (tokens)",
          "text": "Multiply dataset sequence count, mean length and epochs."
        },
        {
          "label": "Optimizer steps (count)",
          "text": "Divide one epoch tokens by useful batch capacity, round up and multiply epochs."
        },
        {
          "label": "Allocated batch token positions (tokens)",
          "text": "Multiply steps by nominal batch capacity."
        }
      ],
      "example_questions": [
        "Use the Model training token budget calculator.",
        "Help me calculate model training token budget."
      ],
      "retrieval_phrases": [
        "Model training token budget",
        "model training token budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 100,
            "c": 3,
            "d": 1000,
            "e": 80
          },
          "outputs": [
            {
              "label": "Useful training tokens (tokens)",
              "value": 300000
            },
            {
              "label": "Optimizer steps (count)",
              "value": 375
            },
            {
              "label": "Allocated batch token positions (tokens)",
              "value": 375000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2576",
      "name": "Data pipeline freshness budget",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Each stage timestamp is the newest usable data time, using one shared elapsed-time origin. SLA is supplied, not inferred.",
      "url": "/calculators/data-pipeline-freshness-budget/",
      "version": "72b81aaa3afc79b9bdf3ccd4e8cfa754b86507d733d319f521674b75a49d7ab5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Stage data timestamps (elapsed hours)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Current timestamp (elapsed hours)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Maximum permitted age (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Data age by stage (hours)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Age above freshness budget (hours)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Stages over budget (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each stage timestamp is the newest usable data time, using one shared elapsed-time origin. SLA is supplied, not inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Data age by stage (hours)",
          "text": "Subtract each stage data timestamp from now."
        },
        {
          "label": "Age above freshness budget (hours)",
          "text": "Subtract the allowed age and floor each excess at zero."
        },
        {
          "label": "Stages over budget (count)",
          "text": "Count stages whose age exceeds the limit."
        }
      ],
      "example_questions": [
        "Use the Data pipeline freshness budget calculator.",
        "Help me calculate data pipeline freshness budget."
      ],
      "retrieval_phrases": [
        "Data pipeline freshness budget",
        "data pipeline freshness budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,7,9",
            "b": 10,
            "c": 3
          },
          "outputs": [
            {
              "label": "Data age by stage (hours)",
              "value": "6, 3, 1"
            },
            {
              "label": "Age above freshness budget (hours)",
              "value": "3, 0, 0"
            },
            {
              "label": "Stages over budget (count)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2578",
      "name": "Data ingestion batch watermark",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Conceptual continuous-time watermark before an event is maximum timestamp of previous arrivals minus allowed lateness; engine-specific millisecond offsets are not modeled. An event is late only if below that watermark; equality is accepted.",
      "url": "/calculators/data-ingestion-batch-watermark/",
      "version": "1bf72054875ef741a1de1c2faf6d415a46c0ac2d33b299e355a9cb31cf2b824e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Event timestamps in arrival order (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Allowed lateness (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final watermark (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Late event row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Late event count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Conceptual continuous-time watermark before an event is maximum timestamp of previous arrivals minus allowed lateness; engine-specific millisecond offsets are not modeled. An event is late only if below that watermark; equality is accepted."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final watermark (seconds)",
          "text": "Subtract allowed lateness from maximum event timestamp."
        },
        {
          "label": "Late event row numbers",
          "text": "Compare each event with the watermark established by earlier arrivals."
        },
        {
          "label": "Late event count",
          "text": "Count events strictly below their prior watermark."
        }
      ],
      "example_questions": [
        "Use the Data ingestion batch watermark calculator.",
        "Help me calculate data ingestion batch watermark."
      ],
      "retrieval_phrases": [
        "Data ingestion batch watermark",
        "data ingestion batch watermark"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,12,30",
            "b": 5
          },
          "outputs": [
            {
              "label": "Final watermark (seconds)",
              "value": 25
            },
            {
              "label": "Late event row numbers",
              "value": "3"
            },
            {
              "label": "Late event count",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2579",
      "name": "Data stream out-of-order profile",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Event and arrival timestamps use synchronized clocks and the same origin. Lateness is arrival minus event time; this measures transport delay, not ordering inversions.",
      "url": "/calculators/data-stream-out-of-order-profile/",
      "version": "aa89199f44ece48291486f6b3faa066e6412e78a4d0a3b1f239c82a92fd68f66",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Event timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Arrival timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Chosen lateness buffer (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed event lateness (seconds)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mean lateness (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Events beyond chosen buffer (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Buffer covering all observed arrivals (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Event and arrival timestamps use synchronized clocks and the same origin. Lateness is arrival minus event time; this measures transport delay, not ordering inversions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed event lateness (seconds)",
          "text": "Subtract event time from arrival time."
        },
        {
          "label": "Mean lateness (seconds)",
          "text": "Average observed lateness."
        },
        {
          "label": "Events beyond chosen buffer (count)",
          "text": "Count strict lateness exceedances."
        },
        {
          "label": "Buffer covering all observed arrivals (seconds)",
          "text": "Use the maximum observed lateness; this gives no guarantee for future arrivals."
        }
      ],
      "example_questions": [
        "Use the Data stream out-of-order profile calculator.",
        "Help me calculate data stream out-of-order profile."
      ],
      "retrieval_phrases": [
        "Data stream out-of-order profile",
        "data stream out of order profile"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,10,20",
            "b": "2,15,21",
            "c": 3
          },
          "outputs": [
            {
              "label": "Observed event lateness (seconds)",
              "value": "2, 5, 1"
            },
            {
              "label": "Mean lateness (seconds)",
              "value": 2.6666666666666665
            },
            {
              "label": "Events beyond chosen buffer (count)",
              "value": 1
            },
            {
              "label": "Buffer covering all observed arrivals (seconds)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2581",
      "name": "Data join cardinality forecast",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Enter the union of keys, using zero for absent keys; null matching follows your preprocessing policy. Counts are key frequencies, not raw records.",
      "url": "/calculators/data-join-cardinality-forecast/",
      "version": "51c0990589ed4d89503059f103e25f10dbac333ec22e6040073922141b947499",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Left rows per aligned key (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Right rows per aligned key (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Inner join rows (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Left join rows (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Full outer join rows (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter the union of keys, using zero for absent keys; null matching follows your preprocessing policy. Counts are key frequencies, not raw records."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Inner join rows (count)",
          "text": "Multiply left and right frequencies for every key and sum."
        },
        {
          "label": "Left join rows (count)",
          "text": "Each left row matches the right count or emits one unmatched row."
        },
        {
          "label": "Full outer join rows (count)",
          "text": "Use products for matched keys and original counts for unmatched keys."
        }
      ],
      "example_questions": [
        "Use the Data join cardinality forecast calculator.",
        "Help me calculate data join cardinality forecast."
      ],
      "retrieval_phrases": [
        "Data join cardinality forecast",
        "data join cardinality forecast"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3,0",
            "b": "4,0,5"
          },
          "outputs": [
            {
              "label": "Inner join rows (count)",
              "value": 8
            },
            {
              "label": "Left join rows (count)",
              "value": 11
            },
            {
              "label": "Full outer join rows (count)",
              "value": 16
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2584",
      "name": "Data column encoding size estimate",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Compares fixed-width raw storage with an ideal bit-packed dictionary index plus one raw dictionary entry per distinct value. Headers, null bitmaps and codec overhead are excluded.",
      "url": "/calculators/data-column-encoding-size-estimate/",
      "version": "cce67714e1069f121b7ecb08e2dc0c15084c81f72f7561e9722864414a838eaa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Column rows (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Distinct values (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Raw value width (bytes)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Raw column size (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Dictionary index width (bits/row)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Dictionary encoded size (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Bytes saved (bytes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compares fixed-width raw storage with an ideal bit-packed dictionary index plus one raw dictionary entry per distinct value. Headers, null bitmaps and codec overhead are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Raw column size (bytes)",
          "text": "Multiply rows by raw value width."
        },
        {
          "label": "Dictionary index width (bits/row)",
          "text": "Use enough bits to address every distinct dictionary entry."
        },
        {
          "label": "Dictionary encoded size (bytes)",
          "text": "Add raw dictionary bytes and packed indices rounded to whole bytes."
        },
        {
          "label": "Bytes saved (bytes)",
          "text": "Subtract encoded size from raw size."
        }
      ],
      "example_questions": [
        "Use the Data column encoding size estimate calculator.",
        "Help me calculate data column encoding size estimate."
      ],
      "retrieval_phrases": [
        "Data column encoding size estimate",
        "data column encoding size estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 16,
            "c": 8
          },
          "outputs": [
            {
              "label": "Raw column size (bytes)",
              "value": 8000
            },
            {
              "label": "Dictionary index width (bits/row)",
              "value": 4
            },
            {
              "label": "Dictionary encoded size (bytes)",
              "value": 628
            },
            {
              "label": "Bytes saved (bytes)",
              "value": 7372
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2585",
      "name": "Data partition skew audit",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Partition sizes use one unit; empty partitions remain in the denominator. Heavy means strictly above the supplied multiple of mean.",
      "url": "/calculators/data-partition-skew-audit/",
      "version": "355a014b6b87ca7d07fc1687419f3075d82530edc97b69f76fad95dbc4746b5e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Partition data sizes (MB)",
          "type": "array",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Heavy-partition threshold (multiple of mean)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mean partition size (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Maximum-to-mean skew ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Heavy partition row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Partition sizes use one unit; empty partitions remain in the denominator. Heavy means strictly above the supplied multiple of mean."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mean partition size (MB)",
          "text": "Divide total size by partition count."
        },
        {
          "label": "Maximum-to-mean skew ratio",
          "text": "Divide maximum partition size by mean."
        },
        {
          "label": "Heavy partition row numbers",
          "text": "Select partitions strictly above threshold times mean."
        }
      ],
      "example_questions": [
        "Use the Data partition skew audit calculator.",
        "Help me calculate data partition skew audit."
      ],
      "retrieval_phrases": [
        "Data partition skew audit",
        "data partition skew audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30",
            "b": 1.4
          },
          "outputs": [
            {
              "label": "Mean partition size (MB)",
              "value": 20
            },
            {
              "label": "Maximum-to-mean skew ratio",
              "value": 1.5
            },
            {
              "label": "Heavy partition row numbers",
              "value": "3"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2586",
      "name": "Data shuffle memory budget",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "The listed tasks run simultaneously on one worker; expansion and overhead are user-measured assumptions. Does not estimate garbage collection or transient copies.",
      "url": "/calculators/data-shuffle-memory-budget/",
      "version": "a20858e120bcf7800f4d936bc526246168090e0fd5f041c9107755829cf1299d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Concurrent task partition sizes (MB)",
          "type": "array",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "In-memory expansion factor (multiple)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Per-task overhead (MB)",
          "type": "number",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Worker reserved memory (MB)",
          "type": "number",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Task memory requirements (MB)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total worker memory requirement (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The listed tasks run simultaneously on one worker; expansion and overhead are user-measured assumptions. Does not estimate garbage collection or transient copies."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Task memory requirements (MB)",
          "text": "Expand each input partition and add per-task overhead."
        },
        {
          "label": "Total worker memory requirement (MB)",
          "text": "Add all task requirements and reserved worker memory."
        }
      ],
      "example_questions": [
        "Use the Data shuffle memory budget calculator.",
        "Help me calculate data shuffle memory budget."
      ],
      "retrieval_phrases": [
        "Data shuffle memory budget",
        "data shuffle memory budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200,300",
            "b": 2,
            "c": 50,
            "d": 100
          },
          "outputs": [
            {
              "label": "Task memory requirements (MB)",
              "value": "250, 450, 650"
            },
            {
              "label": "Total worker memory requirement (MB)",
              "value": 1450
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2587",
      "name": "Data compaction job planning",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Assumes records can be repacked freely across files and one task writes each output file. Compression and indivisible records can change the result.",
      "url": "/calculators/data-compaction-job-planning/",
      "version": "75405a1f0499d0fc953f097c8cb6d74d9c4f9a86487583693b4a70559a2825cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Input file sizes (MB)",
          "type": "array",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Target output file capacity (MB)",
          "type": "number",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Concurrent output-writing tasks (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Input volume (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Output file count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Writing waves (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Final file size (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes records can be repacked freely across files and one task writes each output file. Compression and indivisible records can change the result."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Input volume (MB)",
          "text": "Sum input file sizes."
        },
        {
          "label": "Output file count",
          "text": "Round total size divided by target size upward."
        },
        {
          "label": "Writing waves (count)",
          "text": "Divide output files by concurrency and round upward."
        },
        {
          "label": "Final file size (MB)",
          "text": "Remove full target-sized files from the total."
        }
      ],
      "example_questions": [
        "Use the Data compaction job planning calculator.",
        "Help me calculate data compaction job planning."
      ],
      "retrieval_phrases": [
        "Data compaction job planning",
        "data compaction job planning"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30",
            "b": 25,
            "c": 2
          },
          "outputs": [
            {
              "label": "Input volume (MB)",
              "value": 60
            },
            {
              "label": "Output file count",
              "value": 3
            },
            {
              "label": "Writing waves (count)",
              "value": 2
            },
            {
              "label": "Final file size (MB)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2588",
      "name": "Data small-file overhead",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "One metadata request and one serial setup per file per scan. Data-transfer duration and payload charges are excluded.",
      "url": "/calculators/data-small-file-overhead/",
      "version": "cdd839030b770e6a7101e54ef9baaf0a7dfdb64e25fe66c7e54ba91a446c3edb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current file count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consolidated file count",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Setup time per file (milliseconds)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Metadata cost per 1000 requests (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Setup time saved per scan (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Metadata cost saved per scan (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "File count reduction (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One metadata request and one serial setup per file per scan. Data-transfer duration and payload charges are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Setup time saved per scan (seconds)",
          "text": "Multiply removed file opens by setup time and convert milliseconds to seconds."
        },
        {
          "label": "Metadata cost saved per scan (currency)",
          "text": "Multiply avoided requests by the per-request rate."
        },
        {
          "label": "File count reduction (%)",
          "text": "Divide eliminated file count by initial files."
        }
      ],
      "example_questions": [
        "Use the Data small-file overhead calculator.",
        "Help me calculate data small-file overhead."
      ],
      "retrieval_phrases": [
        "Data small-file overhead",
        "data small file overhead"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 100,
            "c": 20,
            "d": 0.5
          },
          "outputs": [
            {
              "label": "Setup time saved per scan (seconds)",
              "value": 18
            },
            {
              "label": "Metadata cost saved per scan (currency)",
              "value": 0.45
            },
            {
              "label": "File count reduction (%)",
              "value": 90
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2590",
      "name": "Data snapshot incremental growth",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Independent incremental storage model: the full baseline is retained and only the most recent specified increments consume additional space. Real snapshot dependency/reclamation rules may differ.",
      "url": "/calculators/data-snapshot-incremental-growth/",
      "version": "5648336189961fa9205474abae9e2e222315e7cb3e911d7d89ba7b7a8cf6c19b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Initial full snapshot (GB)",
          "type": "number",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Incremental changed-block volumes at successive snapshots (GB)",
          "type": "array",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Incremental snapshots retained (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Snapshot cadence (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Storage after each observed incremental snapshot (GB)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Final retained storage (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Observed snapshot elapsed span (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Independent incremental storage model: the full baseline is retained and only the most recent specified increments consume additional space. Real snapshot dependency/reclamation rules may differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Storage after each observed incremental snapshot (GB)",
          "text": "Add baseline to the rolling retained-increment window at each snapshot."
        },
        {
          "label": "Final retained storage (GB)",
          "text": "Add baseline to the final retained increments."
        },
        {
          "label": "Observed snapshot elapsed span (hours)",
          "text": "Multiply incremental snapshot count by cadence."
        }
      ],
      "example_questions": [
        "Use the Data snapshot incremental growth calculator.",
        "Help me calculate data snapshot incremental growth."
      ],
      "retrieval_phrases": [
        "Data snapshot incremental growth",
        "data snapshot incremental growth"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "10,20,10",
            "c": 2,
            "d": 24
          },
          "outputs": [
            {
              "label": "Storage after each observed incremental snapshot (GB)",
              "value": "110, 130, 130"
            },
            {
              "label": "Final retained storage (GB)",
              "value": 130
            },
            {
              "label": "Observed snapshot elapsed span (hours)",
              "value": 72
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2593",
      "name": "Data migration cutover window",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Changes continue during copy and cease before validation. Copy throughput must exceed change rate; all rates remain constant.",
      "url": "/calculators/data-migration-cutover-window/",
      "version": "3405bf79fcf87eb3ca439c1d470b42695ece148a1b0a8682c373a6370ff2af29",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Final uncopied delta (GB)",
          "type": "number",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Copy throughput (GB/hour)",
          "type": "number",
          "required": true,
          "unit": "GB/hour",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Ongoing change rate (GB/hour)",
          "type": "number",
          "required": true,
          "unit": "GB/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Post-copy validation (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net convergence rate (GB/hour)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Catch-up time (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cutover window including validation (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Changes continue during copy and cease before validation. Copy throughput must exceed change rate; all rates remain constant."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net convergence rate (GB/hour)",
          "text": "Subtract incoming changes from copy throughput."
        },
        {
          "label": "Catch-up time (hours)",
          "text": "Divide outstanding delta by net convergence rate."
        },
        {
          "label": "Cutover window including validation (hours)",
          "text": "Add validation to catch-up duration."
        }
      ],
      "example_questions": [
        "Use the Data migration cutover window calculator.",
        "Help me calculate data migration cutover window."
      ],
      "retrieval_phrases": [
        "Data migration cutover window",
        "data migration cutover window"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 30,
            "c": 10,
            "d": 2
          },
          "outputs": [
            {
              "label": "Net convergence rate (GB/hour)",
              "value": 20
            },
            {
              "label": "Catch-up time (hours)",
              "value": 5
            },
            {
              "label": "Cutover window including validation (hours)",
              "value": 7
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2594",
      "name": "Data row-count reconciliation",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Positive discrepancy means expected rows are missing at destination; negative means extra destination rows. Counts are from aligned snapshots.",
      "url": "/calculators/data-row-count-reconciliation/",
      "version": "1bfc07336f6137f7b835bd423fff4a0fed9f401a7b70b5c8c7b2bdfd76060d41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Source row counts by batch",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Destination row counts by batch",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Accepted excluded rows by batch",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unexplained differences by batch (rows)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Net unexplained difference (rows)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total absolute discrepancy (rows)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Positive discrepancy means expected rows are missing at destination; negative means extra destination rows. Counts are from aligned snapshots."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unexplained differences by batch (rows)",
          "text": "Subtract accepted exclusions and destination rows from each source count."
        },
        {
          "label": "Net unexplained difference (rows)",
          "text": "Sum signed discrepancies."
        },
        {
          "label": "Total absolute discrepancy (rows)",
          "text": "Add absolute differences so opposite discrepancies do not cancel."
        }
      ],
      "example_questions": [
        "Use the Data row-count reconciliation calculator.",
        "Help me calculate data row-count reconciliation."
      ],
      "retrieval_phrases": [
        "Data row-count reconciliation",
        "data row count reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "90,190",
            "c": "10,5"
          },
          "outputs": [
            {
              "label": "Unexplained differences by batch (rows)",
              "value": "0, 5"
            },
            {
              "label": "Net unexplained difference (rows)",
              "value": 5
            },
            {
              "label": "Total absolute discrepancy (rows)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2597",
      "name": "Data pipeline retry budget",
      "category": "Data engineering and databases",
      "status": "available",
      "purpose": "Stop after first success or the cap. Each attempt has equal independent failure probability and equal compute cost; backoff time is excluded.",
      "url": "/calculators/data-pipeline-retry-budget/",
      "version": "05aff237c832d1f42a6c793b8ba8429b965f60c95cbfce938f9227fa7858fb1f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Independent attempt failure probability (fraction)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Maximum attempts including first (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Compute cost per attempt (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected attempts (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Success by attempt cap (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected compute cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Stop after first success or the cap. Each attempt has equal independent failure probability and equal compute cost; backoff time is excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected attempts (count)",
          "text": "Sum the probability that each permitted attempt is reached."
        },
        {
          "label": "Success by attempt cap (%)",
          "text": "Subtract the probability all allowed attempts fail from one."
        },
        {
          "label": "Expected compute cost (currency)",
          "text": "Multiply expected attempts by per-attempt cost."
        }
      ],
      "example_questions": [
        "Use the Data pipeline retry budget calculator.",
        "Help me calculate data pipeline retry budget."
      ],
      "retrieval_phrases": [
        "Data pipeline retry budget",
        "data pipeline retry budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.5,
            "b": 3,
            "c": 2
          },
          "outputs": [
            {
              "label": "Expected attempts (count)",
              "value": 1.75
            },
            {
              "label": "Success by attempt cap (%)",
              "value": 87.5
            },
            {
              "label": "Expected compute cost (currency)",
              "value": 3.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2601",
      "name": "Photo library duplicate savings",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Groups and identical sizes are supplied after checksum/content validation; no files are read or deleted. Each group must have at least the retained copies.",
      "url": "/calculators/photo-library-duplicate-savings/",
      "version": "7398277825ed8c422dff2627704c022039fac219bd006fc5dcd561bf7f44187f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Copies in each duplicate group (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Identical file size by group (MB)",
          "type": "array",
          "required": true,
          "unit": "MB",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Copies retained per group (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Recoverable storage (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Copies removable (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Retained storage (MB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Groups and identical sizes are supplied after checksum/content validation; no files are read or deleted. Each group must have at least the retained copies."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Recoverable storage (MB)",
          "text": "Subtract kept copies from each group count and multiply by file size."
        },
        {
          "label": "Copies removable (count)",
          "text": "Count copies beyond the keep rule."
        },
        {
          "label": "Retained storage (MB)",
          "text": "Keep the chosen number of copies from every group."
        }
      ],
      "example_questions": [
        "Use the Photo library duplicate savings calculator.",
        "Help me calculate photo library duplicate savings."
      ],
      "retrieval_phrases": [
        "Photo library duplicate savings",
        "photo library duplicate savings"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,2",
            "b": "10,20",
            "c": 1
          },
          "outputs": [
            {
              "label": "Recoverable storage (MB)",
              "value": 40
            },
            {
              "label": "Copies removable (count)",
              "value": 3
            },
            {
              "label": "Retained storage (MB)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2603",
      "name": "Family photo scanning workload",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Each size group uses its own observed scan-and-edit time. Batches are counted separately by size group; travel, setup and retries are excluded.",
      "url": "/calculators/family-photo-scanning-workload/",
      "version": "def8dfc128cd190c67522e91e8c4d1254e4c42433a8e75b8948e4350e57d7a3d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Print counts by size group (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured scan-edit minutes per print (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Prints per working batch (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Digitization workload (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Working batches (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each size group uses its own observed scan-and-edit time. Batches are counted separately by size group; travel, setup and retries are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Digitization workload (hours)",
          "text": "Multiply group counts by minutes per print, sum and convert to hours."
        },
        {
          "label": "Working batches (count)",
          "text": "Round up batches separately within each print group."
        }
      ],
      "example_questions": [
        "Use the Family photo scanning workload calculator.",
        "Help me calculate family photo scanning workload."
      ],
      "retrieval_phrases": [
        "Family photo scanning workload",
        "family photo scanning workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "2,4",
            "c": 25
          },
          "outputs": [
            {
              "label": "Digitization workload (hours)",
              "value": 6.666666666666667
            },
            {
              "label": "Working batches (count)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2604",
      "name": "Document scanning duplex sheets",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Each document starts on a new physical sheet and becomes one output file. Feeder batches are counted separately per document.",
      "url": "/calculators/document-scanning-duplex-sheets/",
      "version": "4bf357a4cf4ae88e766de905ef679676d420a878815741458d3581ca34763d04",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Document page counts (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Printed sides per sheet (1 simplex or 2 duplex)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Feeder sheet capacity (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Physical sheets (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Feeder batches (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected output files (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each document starts on a new physical sheet and becomes one output file. Feeder batches are counted separately per document."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Physical sheets (count)",
          "text": "Round pages divided by sides per sheet upward for each document."
        },
        {
          "label": "Feeder batches (count)",
          "text": "Round each document sheet count up to feeder batches."
        },
        {
          "label": "Expected output files (count)",
          "text": "Produce one file for each document."
        }
      ],
      "example_questions": [
        "Use the Document scanning duplex sheets calculator.",
        "Help me calculate document scanning duplex sheets."
      ],
      "retrieval_phrases": [
        "Document scanning duplex sheets",
        "document scanning duplex sheets"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,8,10",
            "b": 2,
            "c": 4
          },
          "outputs": [
            {
              "label": "Physical sheets (count)",
              "value": 12
            },
            {
              "label": "Feeder batches (count)",
              "value": 4
            },
            {
              "label": "Expected output files (count)",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2607",
      "name": "Personal folder path length audit",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Counts JavaScript UTF-16 code units in each supplied path, including separators. This is not a platform-path validator; supply a limit using the same counting convention.",
      "url": "/calculators/personal-folder-path-length-audit/",
      "version": "a12244a701282bcb13746ef90b7c2e8e08552a44b92d575ee1cf543823bded6e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "File paths, one per line",
          "type": "string",
          "required": true,
          "unit": "text",
          "unit_status": "labelled_source",
          "maxLength": 10000
        },
        {
          "key": "b",
          "label": "Supplied maximum path length (UTF-16 code units)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Path lengths (UTF-16 code units)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Path row numbers exceeding limit",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Longest supplied path length",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts JavaScript UTF-16 code units in each supplied path, including separators. This is not a platform-path validator; supply a limit using the same counting convention."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Path lengths (UTF-16 code units)",
          "text": "Count code units in each complete line, without trimming path spaces."
        },
        {
          "label": "Path row numbers exceeding limit",
          "text": "Compare each measured path length with the supplied limit."
        },
        {
          "label": "Longest supplied path length",
          "text": "Take the largest measured path length."
        }
      ],
      "example_questions": [
        "Use the Personal folder path length audit calculator.",
        "Help me calculate personal folder path length audit."
      ],
      "retrieval_phrases": [
        "Personal folder path length audit",
        "personal folder path length audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "/a/file.txt\n/folder/long-name.txt",
            "b": 15
          },
          "outputs": [
            {
              "label": "Path lengths (UTF-16 code units)",
              "value": "11, 21"
            },
            {
              "label": "Path row numbers exceeding limit",
              "value": "2"
            },
            {
              "label": "Longest supplied path length",
              "value": 21
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2609",
      "name": "Personal media checksum verification plan",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Hashing can resume between windows; each window incurs setup. Decimal GB equals 1000 MB. Content validation and checksum algorithm selection are external.",
      "url": "/calculators/personal-media-checksum-verification-plan/",
      "version": "5648e4e08281abfce41d0e10d304b1108eb5033635ec2d7c10cd3d0f049b4069",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Media to checksum (GB, decimal)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured hashing speed (MB/second, decimal)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Verification window length (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Setup time each window (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Active hashing time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Windows needed (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total occupied time including setup (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Hashing can resume between windows; each window incurs setup. Decimal GB equals 1000 MB. Content validation and checksum algorithm selection are external."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Active hashing time (minutes)",
          "text": "Convert GB to MB, divide by speed and convert seconds to minutes."
        },
        {
          "label": "Windows needed (count)",
          "text": "Divide active time by usable minutes per window and round upward."
        },
        {
          "label": "Total occupied time including setup (minutes)",
          "text": "Add setup time for every required window."
        }
      ],
      "example_questions": [
        "Use the Personal media checksum verification plan calculator.",
        "Help me calculate personal media checksum verification plan."
      ],
      "retrieval_phrases": [
        "Personal media checksum verification plan",
        "personal media checksum verification plan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 100,
            "c": 10,
            "d": 2
          },
          "outputs": [
            {
              "label": "Active hashing time (minutes)",
              "value": 20
            },
            {
              "label": "Windows needed (count)",
              "value": 3
            },
            {
              "label": "Total occupied time including setup (minutes)",
              "value": 26
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2611",
      "name": "Personal email cleanup workload",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Message categories are disjoint. Constant review rates are measured by you; no automatic deletion or email access occurs.",
      "url": "/calculators/personal-email-cleanup-workload/",
      "version": "34ab11d4c7848a0fc4487b8ac7b4dd3012e74ccab3c4309ea1873707cb57af95",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Messages by cleanup category (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured review seconds per message (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Session duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total review time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Review sessions (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Final session active time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Message categories are disjoint. Constant review rates are measured by you; no automatic deletion or email access occurs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total review time (minutes)",
          "text": "Multiply category counts by seconds per message and convert to minutes."
        },
        {
          "label": "Review sessions (count)",
          "text": "Round total workload divided by session duration upward."
        },
        {
          "label": "Final session active time (minutes)",
          "text": "Subtract all full earlier sessions."
        }
      ],
      "example_questions": [
        "Use the Personal email cleanup workload calculator.",
        "Help me calculate personal email cleanup workload."
      ],
      "retrieval_phrases": [
        "Personal email cleanup workload",
        "personal email cleanup workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "6,12",
            "c": 10
          },
          "outputs": [
            {
              "label": "Total review time (minutes)",
              "value": 20
            },
            {
              "label": "Review sessions (count)",
              "value": 2
            },
            {
              "label": "Final session active time (minutes)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2612",
      "name": "Personal inbox processing capacity",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Continuous-capacity approximation with constant daily arrivals and handling time. Whole-message capacity is rounded downward before the projection.",
      "url": "/calculators/personal-inbox-processing-capacity/",
      "version": "030a4078ee6f88c32baee9dde500194f244feefd182b987bf06f75773f3dc20c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "New messages each day (count/day)",
          "type": "number",
          "required": true,
          "unit": "count/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Handling time (minutes/message)",
          "type": "number",
          "required": true,
          "unit": "minutes/message",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Daily review budget (minutes/day)",
          "type": "number",
          "required": true,
          "unit": "minutes/day",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Starting inbox backlog (count)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Days to project (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Daily message capacity (count/day)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Backlog after projection (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Daily capacity surplus (count/day)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Continuous-capacity approximation with constant daily arrivals and handling time. Whole-message capacity is rounded downward before the projection."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Daily message capacity (count/day)",
          "text": "Round available minutes divided by handling minutes downward."
        },
        {
          "label": "Backlog after projection (count)",
          "text": "Add daily arrivals minus capacity for every day, floored at zero."
        },
        {
          "label": "Daily capacity surplus (count/day)",
          "text": "Subtract arrivals from processing capacity; negative means backlog grows."
        }
      ],
      "example_questions": [
        "Use the Personal inbox processing capacity calculator.",
        "Help me calculate personal inbox processing capacity."
      ],
      "retrieval_phrases": [
        "Personal inbox processing capacity",
        "personal inbox processing capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 2,
            "c": 60,
            "d": 100,
            "e": 5
          },
          "outputs": [
            {
              "label": "Daily message capacity (count/day)",
              "value": 30
            },
            {
              "label": "Backlog after projection (count)",
              "value": 150
            },
            {
              "label": "Daily capacity surplus (count/day)",
              "value": -10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2614",
      "name": "Personal subscription renewal calendar",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Day offsets and notice periods are supplied contract terms; no automatic cancellation. A negative reminder offset means the stated notice deadline has passed.",
      "url": "/calculators/personal-subscription-renewal-calendar/",
      "version": "4acc2c26b305d0eb3ed5c520736507b2d10dd7f3f388ae2d89338b85a150d187",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Subscription renewal offsets (days from today)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Required cancellation notice periods (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Renewal charges (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Upcoming-charge horizon (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cancellation decision offsets (days from today)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Decision reminders due now or overdue (row numbers)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Renewal charges within horizon (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Day offsets and notice periods are supplied contract terms; no automatic cancellation. A negative reminder offset means the stated notice deadline has passed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cancellation decision offsets (days from today)",
          "text": "Subtract required notice period from renewal offset."
        },
        {
          "label": "Decision reminders due now or overdue (row numbers)",
          "text": "List subscriptions whose notice deadline is today or earlier."
        },
        {
          "label": "Renewal charges within horizon (currency)",
          "text": "Sum charges renewing at or before the horizon."
        }
      ],
      "example_questions": [
        "Use the Personal subscription renewal calendar calculator.",
        "Help me calculate personal subscription renewal calendar."
      ],
      "retrieval_phrases": [
        "Personal subscription renewal calendar",
        "personal subscription renewal calendar"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,30,60",
            "b": "5,15,30",
            "c": "20,40,60",
            "d": 30
          },
          "outputs": [
            {
              "label": "Cancellation decision offsets (days from today)",
              "value": "5, 15, 30"
            },
            {
              "label": "Decision reminders due now or overdue (row numbers)",
              "value": ""
            },
            {
              "label": "Renewal charges within horizon (currency)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2617",
      "name": "Personal device replacement data transfer",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Transfer all groups first, then run setup tasks in the entered order; no parallel transfer. Decimal storage units are used.",
      "url": "/calculators/personal-device-replacement-data-transfer/",
      "version": "89f7479a3845cfd521cecca790afb177ee17834771966ba56a06c647cfd0a7c7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Device data groups (GB, decimal)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured transfer rate (MB/second, decimal)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Sequential setup tasks (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Transfer duration (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total migration duration (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Setup completion offsets (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Transfer all groups first, then run setup tasks in the entered order; no parallel transfer. Decimal storage units are used."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Transfer duration (minutes)",
          "text": "Convert total GB to MB and divide by rate."
        },
        {
          "label": "Total migration duration (minutes)",
          "text": "Add sequential setup tasks to transfer duration."
        },
        {
          "label": "Setup completion offsets (minutes)",
          "text": "Add each cumulative setup duration to the transfer finish time."
        }
      ],
      "example_questions": [
        "Use the Personal device replacement data transfer calculator.",
        "Help me calculate personal device replacement data transfer."
      ],
      "retrieval_phrases": [
        "Personal device replacement data transfer",
        "personal device replacement data transfer"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": 100,
            "c": "5,10"
          },
          "outputs": [
            {
              "label": "Transfer duration (minutes)",
              "value": 5
            },
            {
              "label": "Total migration duration (minutes)",
              "value": 20
            },
            {
              "label": "Setup completion offsets (minutes)",
              "value": "10, 20"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2618",
      "name": "Personal family cloud quota split",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Allocate capacity in proportion to stated requirements when oversubscribed; otherwise allocate each member exactly their requirement. No account limits or provider rules are inferred.",
      "url": "/calculators/personal-family-cloud-quota-split/",
      "version": "f2e21bfbe07b90a753bebe3e92504048cfe4442c84b7ed9101e581bc8d79a3c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required storage by family member (GB)",
          "type": "array",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Shared plan capacity (GB)",
          "type": "number",
          "required": true,
          "unit": "GB",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Allocated storage by member (GB)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unmet storage (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused plan capacity (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Allocate capacity in proportion to stated requirements when oversubscribed; otherwise allocate each member exactly their requirement. No account limits or provider rules are inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Allocated storage by member (GB)",
          "text": "Scale every requirement by capacity divided by total demand, capped at one."
        },
        {
          "label": "Unmet storage (GB)",
          "text": "Subtract shared capacity from demand, floored at zero."
        },
        {
          "label": "Unused plan capacity (GB)",
          "text": "Subtract demand from capacity, floored at zero."
        }
      ],
      "example_questions": [
        "Use the Personal family cloud quota split calculator.",
        "Help me calculate personal family cloud quota split."
      ],
      "retrieval_phrases": [
        "Personal family cloud quota split",
        "personal family cloud quota split"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,30,50",
            "b": 80
          },
          "outputs": [
            {
              "label": "Allocated storage by member (GB)",
              "value": "16, 24, 40"
            },
            {
              "label": "Unmet storage (GB)",
              "value": 20
            },
            {
              "label": "Unused plan capacity (GB)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2620",
      "name": "Personal home video digitization",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Capture is serial and storage follows source duration. Postprocessing is also serial and starts after capture; no codec quality recommendation.",
      "url": "/calculators/personal-home-video-digitization/",
      "version": "97e972432fa4392ce4d11dbcaed975146cc13eca7f15654f4046977cb911edd2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Tape running times (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Capture speed (source minutes per real minute)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Postprocessing time per tape (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Captured storage rate (GB/source hour)",
          "type": "number",
          "required": true,
          "unit": "GB/source hour",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Capture time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total active workflow time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Required storage (GB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Capture is serial and storage follows source duration. Postprocessing is also serial and starts after capture; no codec quality recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Capture time (minutes)",
          "text": "Divide source running time by capture speed."
        },
        {
          "label": "Total active workflow time (minutes)",
          "text": "Add per-tape postprocessing."
        },
        {
          "label": "Required storage (GB)",
          "text": "Multiply source hours by storage per hour."
        }
      ],
      "example_questions": [
        "Use the Personal home video digitization calculator.",
        "Help me calculate personal home video digitization."
      ],
      "retrieval_phrases": [
        "Personal home video digitization",
        "personal home video digitization"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "60,90",
            "b": 1,
            "c": 10,
            "d": 12
          },
          "outputs": [
            {
              "label": "Capture time (minutes)",
              "value": 150
            },
            {
              "label": "Total active workflow time (minutes)",
              "value": 170
            },
            {
              "label": "Required storage (GB)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2621",
      "name": "Personal audiobook listening plan",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Books are listened to sequentially and can continue between sessions. A fixed speed is used per book; breaks are outside the session budget.",
      "url": "/calculators/personal-audiobook-listening-plan/",
      "version": "07557da3fc9781f91d6f2220bc0d32138d9de46435c11c3964614db689ed15a8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Audiobook source lengths (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Playback speed by book (multipliers)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Listening session duration (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Adjusted listening times (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total listening time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Session each book finishes (count from 1)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Books are listened to sequentially and can continue between sessions. A fixed speed is used per book; breaks are outside the session budget."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Adjusted listening times (minutes)",
          "text": "Divide each source duration by its playback speed."
        },
        {
          "label": "Total listening time (minutes)",
          "text": "Add adjusted book times."
        },
        {
          "label": "Session each book finishes (count from 1)",
          "text": "Divide cumulative adjusted time by session duration and round up."
        }
      ],
      "example_questions": [
        "Use the Personal audiobook listening plan calculator.",
        "Help me calculate personal audiobook listening plan."
      ],
      "retrieval_phrases": [
        "Personal audiobook listening plan",
        "personal audiobook listening plan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "120,180",
            "b": "1.5,2",
            "c": 30
          },
          "outputs": [
            {
              "label": "Adjusted listening times (minutes)",
              "value": "80, 90"
            },
            {
              "label": "Total listening time (minutes)",
              "value": 170
            },
            {
              "label": "Session each book finishes (count from 1)",
              "value": "3, 6"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2622",
      "name": "Personal podcast backlog plan",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Constant weekly arrivals and listening capacity. Catch-up week is rounded up; when arrivals meet or exceed capacity the result explicitly reports no catch-up.",
      "url": "/calculators/personal-podcast-backlog-plan/",
      "version": "b4f9d2f8df8cf375151e5d1f41bbdba7455d4058075e718ae9738bd9ed0c8158",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Existing podcast backlog (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New episodes per week (count)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average new episode length (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Weekly listening capacity (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Projection length (weeks)",
          "type": "integer",
          "required": true,
          "unit": "weeks",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net catch-up capacity (minutes/week)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Projected backlog (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Catch-up week",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant weekly arrivals and listening capacity. Catch-up week is rounded up; when arrivals meet or exceed capacity the result explicitly reports no catch-up."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net catch-up capacity (minutes/week)",
          "text": "Subtract new episode minutes from listening capacity."
        },
        {
          "label": "Projected backlog (minutes)",
          "text": "Apply the weekly net change to initial backlog."
        },
        {
          "label": "Catch-up week",
          "text": "Divide backlog by positive net capacity; otherwise report nonconvergence."
        }
      ],
      "example_questions": [
        "Use the Personal podcast backlog plan calculator.",
        "Help me calculate personal podcast backlog plan."
      ],
      "retrieval_phrases": [
        "Personal podcast backlog plan",
        "personal podcast backlog plan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 2,
            "c": 30,
            "d": 120,
            "e": 4
          },
          "outputs": [
            {
              "label": "Net catch-up capacity (minutes/week)",
              "value": 60
            },
            {
              "label": "Projected backlog (minutes)",
              "value": 60
            },
            {
              "label": "Catch-up week",
              "value": "5"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2623",
      "name": "Personal ebook reading progress",
      "category": "Personal files and digital organization",
      "status": "available",
      "purpose": "Chapters can span days. The timetable uses constant daily effort and preserves chapter order.",
      "url": "/calculators/personal-ebook-reading-progress/",
      "version": "d8e716b985a482dd9626fe46e87b183036b41351828eee375d7c4bcd6375ff9e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Estimated chapter reading times (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Available reading days (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Daily reading budget (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total reading effort (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required daily effort (minutes/day)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Budget shortfall (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Chapter finish days at entered budget",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Chapters can span days. The timetable uses constant daily effort and preserves chapter order."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total reading effort (minutes)",
          "text": "Add chapter effort."
        },
        {
          "label": "Required daily effort (minutes/day)",
          "text": "Divide total effort evenly across available days."
        },
        {
          "label": "Budget shortfall (minutes)",
          "text": "Subtract available reading budget from effort."
        },
        {
          "label": "Chapter finish days at entered budget",
          "text": "Round cumulative chapter effort divided by daily budget upward."
        }
      ],
      "example_questions": [
        "Use the Personal ebook reading progress calculator.",
        "Help me calculate personal ebook reading progress."
      ],
      "retrieval_phrases": [
        "Personal ebook reading progress",
        "personal ebook reading progress"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,40,30",
            "b": 3,
            "c": 25
          },
          "outputs": [
            {
              "label": "Total reading effort (minutes)",
              "value": 90
            },
            {
              "label": "Required daily effort (minutes/day)",
              "value": 30
            },
            {
              "label": "Budget shortfall (minutes)",
              "value": 15
            },
            {
              "label": "Chapter finish days at entered budget",
              "value": "1, 3, 4"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2777",
      "name": "Research recruitment attrition forecast",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Stage retention assumptions are supplied, not estimated. Required initial enrollment is rounded upward; expected surviving participants remain fractional.",
      "url": "/calculators/research-recruitment-attrition-forecast/",
      "version": "d06b09de5419df4010a63983d095a9c5ab36e07b2d7a6f7be68bfc3bc99e6b1c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target study completers (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Retention at successive recruitment stages (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Combined retention (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required initial enrollment (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected completers from rounded enrollment (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Stage retention assumptions are supplied, not estimated. Required initial enrollment is rounded upward; expected surviving participants remain fractional."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Combined retention (%)",
          "text": "Multiply successive stage retention fractions."
        },
        {
          "label": "Required initial enrollment (count)",
          "text": "Divide target by combined retention and round up."
        },
        {
          "label": "Expected completers from rounded enrollment (count)",
          "text": "Multiply rounded enrollment by combined retention."
        }
      ],
      "example_questions": [
        "Use the Research recruitment attrition forecast calculator.",
        "Help me calculate research recruitment attrition forecast."
      ],
      "retrieval_phrases": [
        "Research recruitment attrition forecast",
        "research recruitment attrition forecast"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": "80,50"
          },
          "outputs": [
            {
              "label": "Combined retention (%)",
              "value": 40
            },
            {
              "label": "Required initial enrollment (count)",
              "value": 200
            },
            {
              "label": "Expected completers from rounded enrollment (count)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2778",
      "name": "Research participant reimbursement budget",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "All participants make all planned visits. Payment and travel rates are supplied approvals; the worksheet sets no eligibility or compensation policy.",
      "url": "/calculators/research-participant-reimbursement-budget/",
      "version": "a1002e1b7f83f2b72b18596c5e48813291643fd567904cf0c131663ffd8051ce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Participants (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visits per participant (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Approved payment per visit (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Return travel distance per visit (km)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Approved reimbursement per km (currency/km)",
          "type": "number",
          "required": true,
          "unit": "currency/km",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Per-participant reimbursement (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Study reimbursement budget (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Travel share of budget (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All participants make all planned visits. Payment and travel rates are supplied approvals; the worksheet sets no eligibility or compensation policy."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Per-participant reimbursement (currency)",
          "text": "Add visit payment and travel reimbursement, then multiply visits."
        },
        {
          "label": "Study reimbursement budget (currency)",
          "text": "Multiply per-participant reimbursement by participants."
        },
        {
          "label": "Travel share of budget (currency)",
          "text": "Multiply total visits by return distance and distance rate."
        }
      ],
      "example_questions": [
        "Use the Research participant reimbursement budget calculator.",
        "Help me calculate research participant reimbursement budget."
      ],
      "retrieval_phrases": [
        "Research participant reimbursement budget",
        "research participant reimbursement budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 3,
            "c": 25,
            "d": 10,
            "e": 0.5
          },
          "outputs": [
            {
              "label": "Per-participant reimbursement (currency)",
              "value": 90
            },
            {
              "label": "Study reimbursement budget (currency)",
              "value": 1800
            },
            {
              "label": "Travel share of budget (currency)",
              "value": 300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2780",
      "name": "Research instrument booking contention",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "One instrument, first-come order, setup before every experiment. No preemption or parallel use; timestamps are offsets from session start.",
      "url": "/calculators/research-instrument-booking-contention/",
      "version": "a614950dccd5d72aefc6ce3897ae857e33110e59ee45bf9e2648b86bb41be8cb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Experiment run durations (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Instrument setup per run (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Available instrument session (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Experiment start offsets (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Experiment finish offsets (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Session overflow (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One instrument, first-come order, setup before every experiment. No preemption or parallel use; timestamps are offsets from session start."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Experiment start offsets (minutes)",
          "text": "Add all previous runs and setups including the current setup."
        },
        {
          "label": "Experiment finish offsets (minutes)",
          "text": "Add current run duration to its start."
        },
        {
          "label": "Session overflow (minutes)",
          "text": "Subtract available session from total instrument occupancy."
        }
      ],
      "example_questions": [
        "Use the Research instrument booking contention calculator.",
        "Help me calculate research instrument booking contention."
      ],
      "retrieval_phrases": [
        "Research instrument booking contention",
        "research instrument booking contention"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,45,15",
            "b": 5,
            "c": 90
          },
          "outputs": [
            {
              "label": "Experiment start offsets (minutes)",
              "value": "5, 40, 90"
            },
            {
              "label": "Experiment finish offsets (minutes)",
              "value": "35, 85, 105"
            },
            {
              "label": "Session overflow (minutes)",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2781",
      "name": "Research sample processing capacity",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Every lane can execute an entire batch independently; stages within a batch are sequential and batches have equal cycle times. Part-filled final batches use a full cycle.",
      "url": "/calculators/research-sample-processing-capacity/",
      "version": "d7e785c076d5cf662ca0d7b3e29174ffd003532f772770dc7e1e368568dcbd6f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Samples to process (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Samples per batch (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Sequential stage durations per batch (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Independent fully staffed processing lanes (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Batches required (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Slowest stage (1-based position)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Completion duration (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Every lane can execute an entire batch independently; stages within a batch are sequential and batches have equal cycle times. Part-filled final batches use a full cycle."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Batches required (count)",
          "text": "Round samples divided by batch capacity up."
        },
        {
          "label": "Slowest stage (1-based position)",
          "text": "Locate the longest stage; first position wins ties."
        },
        {
          "label": "Completion duration (minutes)",
          "text": "Multiply parallel batch waves by total stage duration."
        }
      ],
      "example_questions": [
        "Use the Research sample processing capacity calculator.",
        "Help me calculate research sample processing capacity."
      ],
      "retrieval_phrases": [
        "Research sample processing capacity",
        "research sample processing capacity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 20,
            "c": "10,20,5",
            "d": 2
          },
          "outputs": [
            {
              "label": "Batches required (count)",
              "value": 5
            },
            {
              "label": "Slowest stage (1-based position)",
              "value": 2
            },
            {
              "label": "Completion duration (minutes)",
              "value": 105
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2784",
      "name": "Research protocol deviation tally",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Events may repeat within a participant; affected-participant prevalence and events per participant have different denominators. Categories must be mutually exclusive for the event total.",
      "url": "/calculators/research-protocol-deviation-tally/",
      "version": "eede49e1d80b377c3ead4008bf3a4b885f90658ded0ea9142557663f0d987cb3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Deviation events by predefined category (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Participants observed (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Participants with any deviation (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total deviation events (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Events per 100 participants",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Participants with deviations (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Events may repeat within a participant; affected-participant prevalence and events per participant have different denominators. Categories must be mutually exclusive for the event total."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total deviation events (count)",
          "text": "Sum category event counts."
        },
        {
          "label": "Events per 100 participants",
          "text": "Divide events by observed participants and multiply by 100."
        },
        {
          "label": "Participants with deviations (%)",
          "text": "Divide affected unique participants by all participants."
        }
      ],
      "example_questions": [
        "Use the Research protocol deviation tally calculator.",
        "Help me calculate research protocol deviation tally."
      ],
      "retrieval_phrases": [
        "Research protocol deviation tally",
        "research protocol deviation tally"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": 20,
            "c": 4
          },
          "outputs": [
            {
              "label": "Total deviation events (count)",
              "value": 5
            },
            {
              "label": "Events per 100 participants",
              "value": 25
            },
            {
              "label": "Participants with deviations (%)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2788",
      "name": "Research multi-site enrollment pace",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Constant observed site pace is extrapolated independently. Sites already at target have zero remaining time; sites with zero enrollment report no finite completion estimate.",
      "url": "/calculators/research-multi-site-enrollment-pace/",
      "version": "01d553e73a1768e244d2fa2cad7291500bf63fb2cca16245f19935ff5f2a61d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Site enrollment targets (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Enrolled participants to date (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Observed recruiting days (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed site pace (participants/day)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining participants by site",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional recruiting days by site",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant observed site pace is extrapolated independently. Sites already at target have zero remaining time; sites with zero enrollment report no finite completion estimate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed site pace (participants/day)",
          "text": "Divide enrollment by observed recruiting days."
        },
        {
          "label": "Remaining participants by site",
          "text": "Subtract enrolled participants from target and floor at zero."
        },
        {
          "label": "Additional recruiting days by site",
          "text": "Divide remaining targets by each observed pace."
        }
      ],
      "example_questions": [
        "Use the Research multi-site enrollment pace calculator.",
        "Help me calculate research multi-site enrollment pace."
      ],
      "retrieval_phrases": [
        "Research multi-site enrollment pace",
        "research multi site enrollment pace"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "20,25",
            "c": "10,5"
          },
          "outputs": [
            {
              "label": "Observed site pace (participants/day)",
              "value": "2, 5"
            },
            {
              "label": "Remaining participants by site",
              "value": "80, 25"
            },
            {
              "label": "Additional recruiting days by site",
              "value": "40, 5"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2789",
      "name": "Research recruitment channel efficiency",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Each participant is attributed to one channel. Costs are descriptive; positive enrollment and inquiry counts are required for defined rates.",
      "url": "/calculators/research-recruitment-channel-efficiency/",
      "version": "ff95625e981815f00e334d4f52014ce5793b0dfdfb3cfa64e2aa260d75653b5c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Recruitment spend by channel (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Inquiries by channel (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Eligible inquiries by channel (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Enrolled participants by channel (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cost per enrollment by channel (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Inquiry-to-eligible conversion (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Eligible-to-enrolled conversion (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each participant is attributed to one channel. Costs are descriptive; positive enrollment and inquiry counts are required for defined rates."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cost per enrollment by channel (currency)",
          "text": "Divide each channel spend by enrollments."
        },
        {
          "label": "Inquiry-to-eligible conversion (%)",
          "text": "Divide eligible inquiries by all inquiries."
        },
        {
          "label": "Eligible-to-enrolled conversion (%)",
          "text": "Divide enrollments by eligible inquiries."
        }
      ],
      "example_questions": [
        "Use the Research recruitment channel efficiency calculator.",
        "Help me calculate research recruitment channel efficiency."
      ],
      "retrieval_phrases": [
        "Research recruitment channel efficiency",
        "research recruitment channel efficiency"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "20,40",
            "c": "10,20",
            "d": "5,10"
          },
          "outputs": [
            {
              "label": "Cost per enrollment by channel (currency)",
              "value": "20, 20"
            },
            {
              "label": "Inquiry-to-eligible conversion (%)",
              "value": "50, 50"
            },
            {
              "label": "Eligible-to-enrolled conversion (%)",
              "value": "50, 50"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2790",
      "name": "Research grant salary allocation",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Loaded salaries and eligible effort percentages are supplied under your grant rules. Constant monthly costs; no payroll tax or eligibility rules inferred.",
      "url": "/calculators/research-grant-salary-allocation/",
      "version": "7d5427970a6359fba230f85342fdd9e3ae85c6fe401be815e943742e551c2860",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly loaded salaries by staff (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Grant effort by staff (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Funded duration (months)",
          "type": "number",
          "required": true,
          "unit": "months",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Monthly personnel charge by staff (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total personnel budget (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Loaded salaries and eligible effort percentages are supplied under your grant rules. Constant monthly costs; no payroll tax or eligibility rules inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Monthly personnel charge by staff (currency)",
          "text": "Multiply loaded monthly salary by grant effort fraction."
        },
        {
          "label": "Total personnel budget (currency)",
          "text": "Add monthly grant charges and multiply funded months."
        }
      ],
      "example_questions": [
        "Use the Research grant salary allocation calculator.",
        "Help me calculate research grant salary allocation."
      ],
      "retrieval_phrases": [
        "Research grant salary allocation",
        "research grant salary allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4000,6000",
            "b": "50,25",
            "c": 6
          },
          "outputs": [
            {
              "label": "Monthly personnel charge by staff (currency)",
              "value": "2000, 1500"
            },
            {
              "label": "Total personnel budget (currency)",
              "value": 21000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2791",
      "name": "Research indirect cost worksheet",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "The entered rate applies only to direct costs minus supplied exclusions. This does not interpret grant eligibility or negotiated rate rules.",
      "url": "/calculators/research-indirect-cost-worksheet/",
      "version": "18d188cfb9c6371dba4fe6e8272bb44f59adca975e3a947bc67b9ae08f0741df",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total direct costs (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Costs excluded from indirect base (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplied indirect rate (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Eligible indirect-cost base (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Indirect costs (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total grant budget (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The entered rate applies only to direct costs minus supplied exclusions. This does not interpret grant eligibility or negotiated rate rules."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Eligible indirect-cost base (currency)",
          "text": "Subtract excluded direct costs."
        },
        {
          "label": "Indirect costs (currency)",
          "text": "Apply supplied rate to eligible base."
        },
        {
          "label": "Total grant budget (currency)",
          "text": "Add direct and indirect costs."
        }
      ],
      "example_questions": [
        "Use the Research indirect cost worksheet calculator.",
        "Help me calculate research indirect cost worksheet."
      ],
      "retrieval_phrases": [
        "Research indirect cost worksheet",
        "research indirect cost worksheet"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10000,
            "b": 2000,
            "c": 25
          },
          "outputs": [
            {
              "label": "Eligible indirect-cost base (currency)",
              "value": 8000
            },
            {
              "label": "Indirect costs (currency)",
              "value": 2000
            },
            {
              "label": "Total grant budget (currency)",
              "value": 12000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2792",
      "name": "Research equipment usage charge",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Select actual or booked billing explicitly; tariff, consumables and policy are supplied by your facility. No minimum-charge rules are added.",
      "url": "/calculators/research-equipment-usage-charge/",
      "version": "722c93dcb9f517c3641fce8e41da4d4ba0b57b1e46971e01e58363670074e901",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Booked equipment time (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Actual equipment time (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Usage tariff (currency/hour)",
          "type": "number",
          "required": true,
          "unit": "currency/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Consumables (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Charge basis (0 actual, 1 booked)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Billable equipment hours (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Usage charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total recharge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Unused booked time (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Select actual or booked billing explicitly; tariff, consumables and policy are supplied by your facility. No minimum-charge rules are added."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Billable equipment hours (hours)",
          "text": "Use actual or booked time according to selected policy."
        },
        {
          "label": "Usage charge (currency)",
          "text": "Multiply billable hours by tariff."
        },
        {
          "label": "Total recharge (currency)",
          "text": "Add consumables."
        },
        {
          "label": "Unused booked time (hours)",
          "text": "Subtract actual use from booked hours, floored at zero."
        }
      ],
      "example_questions": [
        "Use the Research equipment usage charge calculator.",
        "Help me calculate research equipment usage charge."
      ],
      "retrieval_phrases": [
        "Research equipment usage charge",
        "research equipment usage charge"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 8,
            "c": 20,
            "d": 30,
            "e": 0
          },
          "outputs": [
            {
              "label": "Billable equipment hours (hours)",
              "value": 8
            },
            {
              "label": "Usage charge (currency)",
              "value": 160
            },
            {
              "label": "Total recharge (currency)",
              "value": 190
            },
            {
              "label": "Unused booked time (hours)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2793",
      "name": "Research publication fee budget",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Exchange rates and fee quotes are entered by you; no live prices, taxes or currency forecasts. Each row is one manuscript.",
      "url": "/calculators/research-publication-fee-budget/",
      "version": "6b2f4453608be7fea9c869034f95b14569089dfa017992c03c9124caaa408bf4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Publication fees in original currencies",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Waivers or discounts (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Base-currency units per original-currency unit",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Base-currency spend per manuscript",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total publication budget (base currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Exchange rates and fee quotes are entered by you; no live prices, taxes or currency forecasts. Each row is one manuscript."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Base-currency spend per manuscript",
          "text": "Reduce each fee by waiver percentage and apply its exchange rate."
        },
        {
          "label": "Total publication budget (base currency)",
          "text": "Add converted discounted fees."
        }
      ],
      "example_questions": [
        "Use the Research publication fee budget calculator.",
        "Help me calculate research publication fee budget."
      ],
      "retrieval_phrases": [
        "Research publication fee budget",
        "research publication fee budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,2000",
            "b": "50,25",
            "c": "1,0.5"
          },
          "outputs": [
            {
              "label": "Base-currency spend per manuscript",
              "value": "500, 750"
            },
            {
              "label": "Total publication budget (base currency)",
              "value": 1250
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2794",
      "name": "Research systematic-review screening workload",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Duplicates are removed before screening; each remaining record and full-text review receives the specified independent reviewer count. Adjudication is excluded.",
      "url": "/calculators/research-systematic-review-screening-workload/",
      "version": "bcd10f42830c91ca9e86ffbeecd27b9b0ba38cfde488b1941edb18f32041aed0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Retrieved records (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Confirmed duplicates (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Title-abstract screening (minutes/record)",
          "type": "number",
          "required": true,
          "unit": "minutes/record",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Full-text reviews (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Full-text review time (minutes/record)",
          "type": "number",
          "required": true,
          "unit": "minutes/record",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Independent reviewers per record (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "g",
          "label": "Combined reviewer capacity (hours/day)",
          "type": "number",
          "required": true,
          "unit": "hours/day",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Reviewer workload (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Completion workdays (days)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Duplicates are removed before screening; each remaining record and full-text review receives the specified independent reviewer count. Adjudication is excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Reviewer workload (hours)",
          "text": "Add screening and full-text minutes, multiply independent reviewers and convert to hours."
        },
        {
          "label": "Completion workdays (days)",
          "text": "Divide reviewer-hours by daily combined capacity and round up."
        }
      ],
      "example_questions": [
        "Use the Research systematic-review screening workload calculator.",
        "Help me calculate research systematic-review screening workload."
      ],
      "retrieval_phrases": [
        "Research systematic-review screening workload",
        "research systematic review screening workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 200,
            "c": 1,
            "d": 100,
            "e": 10,
            "f": 2,
            "g": 10
          },
          "outputs": [
            {
              "label": "Reviewer workload (hours)",
              "value": 60
            },
            {
              "label": "Completion workdays (days)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2796",
      "name": "Research inter-rater screening conflicts",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Binary independent decisions on the same records. Agreement is observed percentage; no chance correction or adjudication is implied.",
      "url": "/calculators/research-inter-rater-screening-conflicts/",
      "version": "a42d2b8a01b87dc77a24de99ae32c9b23b9004c95a4112999e7e604768369028",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Reviewer A inclusion decisions (0 exclude, 1 include)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Reviewer B inclusion decisions (0 exclude, 1 include)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed agreement (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Adjudication row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Conflict count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Binary independent decisions on the same records. Agreement is observed percentage; no chance correction or adjudication is implied."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed agreement (%)",
          "text": "Divide matching decisions by all records."
        },
        {
          "label": "Adjudication row numbers",
          "text": "List records with conflicting decisions."
        },
        {
          "label": "Conflict count",
          "text": "Count mismatched paired decisions."
        }
      ],
      "example_questions": [
        "Use the Research inter-rater screening conflicts calculator.",
        "Help me calculate research inter-rater screening conflicts."
      ],
      "retrieval_phrases": [
        "Research inter-rater screening conflicts",
        "research inter rater screening conflicts"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,0,1,0",
            "b": "1,1,0,0"
          },
          "outputs": [
            {
              "label": "Observed agreement (%)",
              "value": 50
            },
            {
              "label": "Adjudication row numbers",
              "value": "2, 3"
            },
            {
              "label": "Conflict count",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2799",
      "name": "Research dataset release embargo",
      "category": "Academic and research administration",
      "status": "available",
      "purpose": "Dates use an explicitly chosen common day zero; supplied contractual periods are added as elapsed days. Business-day, timezone and legal interpretation are outside this worksheet.",
      "url": "/calculators/research-dataset-release-embargo/",
      "version": "a8df3705ef2978ad2cf07873613f424ae58c30b35bffd3b2ace11daae0dafbb8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Approval dates (days from project origin)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Embargo durations after approval (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Final dependency clearance (day from origin)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Embargo expiry days",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Earliest release day",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Governing restriction",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Dates use an explicitly chosen common day zero; supplied contractual periods are added as elapsed days. Business-day, timezone and legal interpretation are outside this worksheet."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Embargo expiry days",
          "text": "Add each supplied embargo duration to its approval day."
        },
        {
          "label": "Earliest release day",
          "text": "Take the latest expiry and dependency-clearance day."
        },
        {
          "label": "Governing restriction",
          "text": "Identify whether dependency clearance or an embargo sets the release day."
        }
      ],
      "example_questions": [
        "Use the Research dataset release embargo calculator.",
        "Help me calculate research dataset release embargo."
      ],
      "retrieval_phrases": [
        "Research dataset release embargo",
        "research dataset release embargo"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "30,15",
            "c": 45
          },
          "outputs": [
            {
              "label": "Embargo expiry days",
              "value": "40, 35"
            },
            {
              "label": "Earliest release day",
              "value": 45
            },
            {
              "label": "Governing restriction",
              "value": "Dependency clearance"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2807",
      "name": "Sports referee travel compensation",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Each distance is a complete return trip. Fees and rate are supplied club rules; no tax or entitlement rule is inferred.",
      "url": "/calculators/sports-referee-travel-compensation/",
      "version": "d3d75c13e72b2d48b2aee3efb526bd135f2106ec5850ca20b1311ad89b055c28",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Return travel distances by match (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Match officiating fees (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Approved distance rate (currency/km)",
          "type": "number",
          "required": true,
          "unit": "currency/km",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Travel reimbursements by match (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total compensation (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each distance is a complete return trip. Fees and rate are supplied club rules; no tax or entitlement rule is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Travel reimbursements by match (currency)",
          "text": "Multiply each return distance by the supplied rate."
        },
        {
          "label": "Total compensation (currency)",
          "text": "Add officiating fees and travel reimbursements."
        }
      ],
      "example_questions": [
        "Use the Sports referee travel compensation calculator.",
        "Help me calculate sports referee travel compensation."
      ],
      "retrieval_phrases": [
        "Sports referee travel compensation",
        "sports referee travel compensation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,40",
            "b": "30,40",
            "c": 0.5
          },
          "outputs": [
            {
              "label": "Travel reimbursements by match (currency)",
              "value": "10, 20"
            },
            {
              "label": "Total compensation (currency)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2808",
      "name": "Sports season registration revenue",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Every registrant pays the discounted category fee in the same number of equal installments. No defaults, refunds, taxes or payment processor charges.",
      "url": "/calculators/sports-season-registration-revenue/",
      "version": "a632f74d3836eb29d3ef3d38c66c1c03267b3d52312812c8d8b7d75fc75d2b8e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Registrations by member category (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Standard category fees (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Category discounts (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Equal installments (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Receipts by category (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total season receipts (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Receipts per installment (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Every registrant pays the discounted category fee in the same number of equal installments. No defaults, refunds, taxes or payment processor charges."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Receipts by category (currency)",
          "text": "Multiply registrations by discounted fee."
        },
        {
          "label": "Total season receipts (currency)",
          "text": "Add category receipts."
        },
        {
          "label": "Receipts per installment (currency)",
          "text": "Divide total receipts into equal installments."
        }
      ],
      "example_questions": [
        "Use the Sports season registration revenue calculator.",
        "Help me calculate sports season registration revenue."
      ],
      "retrieval_phrases": [
        "Sports season registration revenue",
        "sports season registration revenue"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,10",
            "b": "100,50",
            "c": "10,0",
            "d": 2
          },
          "outputs": [
            {
              "label": "Receipts by category (currency)",
              "value": "1800, 500"
            },
            {
              "label": "Total season receipts (currency)",
              "value": 2300
            },
            {
              "label": "Receipts per installment (currency)",
              "value": 1150
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2809",
      "name": "Sports equipment kit allocation",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Aligned rows represent sizes; kits cannot be substituted between sizes. Allocate up to demand and report stock remaining after issue.",
      "url": "/calculators/sports-equipment-kit-allocation/",
      "version": "f1a7481d25a0d31966e2e3b3a63560761096459ff7d1838c8efe2811785cfc5e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required kits by size (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Available kits by size (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Kits to issue by size",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Shortages by size",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Remaining stock by size",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Aligned rows represent sizes; kits cannot be substituted between sizes. Allocate up to demand and report stock remaining after issue."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Kits to issue by size",
          "text": "Issue the smaller of demand and available stock in each size."
        },
        {
          "label": "Shortages by size",
          "text": "Subtract stock from required kits, floored at zero."
        },
        {
          "label": "Remaining stock by size",
          "text": "Subtract issued kits from available stock."
        }
      ],
      "example_questions": [
        "Use the Sports equipment kit allocation calculator.",
        "Help me calculate sports equipment kit allocation."
      ],
      "retrieval_phrases": [
        "Sports equipment kit allocation",
        "sports equipment kit allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "12,20,8",
            "b": "10,25,5"
          },
          "outputs": [
            {
              "label": "Kits to issue by size",
              "value": "10, 20, 5"
            },
            {
              "label": "Shortages by size",
              "value": "2, 0, 3"
            },
            {
              "label": "Remaining stock by size",
              "value": "0, 5, 0"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2810",
      "name": "Sports facility booking utilization",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Enter already-unioned booking and closure durations for one facility. Bookings must be wholly outside closure intervals; this is an occupancy measure, not player capacity.",
      "url": "/calculators/sports-facility-booking-utilization/",
      "version": "be6ce0692ddc40f9da3c05bd26acd5040c21c65c3c1459eb653ddcaad77fa713",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total facility opening hours (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Closure time within opening hours (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Non-overlapping booked playable hours (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Playable hours (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Booked utilization (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused playable hours (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Enter already-unioned booking and closure durations for one facility. Bookings must be wholly outside closure intervals; this is an occupancy measure, not player capacity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Playable hours (hours)",
          "text": "Subtract closures from opening hours."
        },
        {
          "label": "Booked utilization (%)",
          "text": "Divide booked playable hours by playable hours."
        },
        {
          "label": "Unused playable hours (hours)",
          "text": "Subtract bookings from playable capacity."
        }
      ],
      "example_questions": [
        "Use the Sports facility booking utilization calculator.",
        "Help me calculate sports facility booking utilization."
      ],
      "retrieval_phrases": [
        "Sports facility booking utilization",
        "sports facility booking utilization"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 20,
            "c": 60
          },
          "outputs": [
            {
              "label": "Playable hours (hours)",
              "value": 80
            },
            {
              "label": "Booked utilization (%)",
              "value": 75
            },
            {
              "label": "Unused playable hours (hours)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2812",
      "name": "Sports race wave assignment",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Pace groups stay separate and retain the entered order; each group fills its own waves. All entrants within a wave share its start time.",
      "url": "/calculators/sports-race-wave-assignment/",
      "version": "61ff5f4584bb15f756ee9c0ac953ea29b3d852063ab3042bb83d38fa1e5b9d1b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Entrants per declared pace group (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Wave capacity (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Time between wave starts (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Waves per pace group",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total waves",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "First start by pace group (minutes from first wave)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Last wave starts (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Pace groups stay separate and retain the entered order; each group fills its own waves. All entrants within a wave share its start time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Waves per pace group",
          "text": "Round each pace-group count up to full wave capacity."
        },
        {
          "label": "Total waves",
          "text": "Add group wave counts."
        },
        {
          "label": "First start by pace group (minutes from first wave)",
          "text": "Multiply the number of preceding waves by start spacing."
        },
        {
          "label": "Last wave starts (minutes)",
          "text": "Multiply all but the first wave by spacing."
        }
      ],
      "example_questions": [
        "Use the Sports race wave assignment calculator.",
        "Help me calculate sports race wave assignment."
      ],
      "retrieval_phrases": [
        "Sports race wave assignment",
        "sports race wave assignment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "12,8,20",
            "b": 10,
            "c": 2
          },
          "outputs": [
            {
              "label": "Waves per pace group",
              "value": "2, 1, 2"
            },
            {
              "label": "Total waves",
              "value": 5
            },
            {
              "label": "First start by pace group (minutes from first wave)",
              "value": "0, 4, 6"
            },
            {
              "label": "Last wave starts (minutes)",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2814",
      "name": "Sports race cutoff itinerary",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Checkpoint distances and cutoff times must strictly increase. Paces are arithmetic segment cutoffs, not training or safety guidance.",
      "url": "/calculators/sports-race-cutoff-itinerary/",
      "version": "dfff0560cdd1d00311b88e192c470ce2efa45f6c6171154aa6579edf96a6388a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Checkpoint cumulative distances (km)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Checkpoint cutoff times (minutes from start)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Planned cumulative arrival times (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum segment pace between cutoffs (minutes/km)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Planned cutoff margins (minutes)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Checkpoint distances and cutoff times must strictly increase. Paces are arithmetic segment cutoffs, not training or safety guidance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum segment pace between cutoffs (minutes/km)",
          "text": "Divide cutoff time increase by distance increase for each segment."
        },
        {
          "label": "Planned cutoff margins (minutes)",
          "text": "Subtract planned cumulative arrival from cutoff; negative means late."
        }
      ],
      "example_questions": [
        "Use the Sports race cutoff itinerary calculator.",
        "Help me calculate sports race cutoff itinerary."
      ],
      "retrieval_phrases": [
        "Sports race cutoff itinerary",
        "sports race cutoff itinerary"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,10",
            "b": "40,90",
            "c": "35,80"
          },
          "outputs": [
            {
              "label": "Maximum segment pace between cutoffs (minutes/km)",
              "value": "8, 10"
            },
            {
              "label": "Planned cutoff margins (minutes)",
              "value": "5, 10"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2817",
      "name": "Sports match win-percentage conventions",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Reports strict wins/all matches and the supplied points convention separately. Losses score zero; draw points cannot exceed win points.",
      "url": "/calculators/sports-match-win-percentage-conventions/",
      "version": "f2129472e0daec0ec42b67238f271ec2354c28f78351ac8c1be0a95f77b9b9e9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Wins (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Losses (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Draws (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Points per win",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Points per draw",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Strict win percentage (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Points earned",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Maximum-points fraction (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reports strict wins/all matches and the supplied points convention separately. Losses score zero; draw points cannot exceed win points."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Strict win percentage (%)",
          "text": "Divide wins by all played matches."
        },
        {
          "label": "Points earned",
          "text": "Multiply outcomes by supplied point values."
        },
        {
          "label": "Maximum-points fraction (%)",
          "text": "Divide earned points by points for winning every match."
        }
      ],
      "example_questions": [
        "Use the Sports match win-percentage conventions calculator.",
        "Help me calculate sports match win-percentage conventions."
      ],
      "retrieval_phrases": [
        "Sports match win-percentage conventions",
        "sports match win percentage conventions"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 8,
            "b": 4,
            "c": 4,
            "d": 3,
            "e": 1
          },
          "outputs": [
            {
              "label": "Strict win percentage (%)",
              "value": 50
            },
            {
              "label": "Points earned",
              "value": 28
            },
            {
              "label": "Maximum-points fraction (%)",
              "value": 58.333333333333336
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2818",
      "name": "Sports target-score scenario",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Losses give zero points. Required wins assume all other remaining matches are draws; results are scenarios and do not model opponents or tie-breaks.",
      "url": "/calculators/sports-target-score-scenario/",
      "version": "c53a1db94b2430007b26921236153131960c56ef5a45b32b0143846f5a2c113f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current standings points",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Remaining fixtures (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Points per win",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Points per draw",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Target points",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum attainable points",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "All-draw finish points",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Wins needed with remaining draws",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Target reachable",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Losses give zero points. Required wins assume all other remaining matches are draws; results are scenarios and do not model opponents or tie-breaks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum attainable points",
          "text": "Add a win in every remaining fixture."
        },
        {
          "label": "All-draw finish points",
          "text": "Add draws in every remaining fixture."
        },
        {
          "label": "Wins needed with remaining draws",
          "text": "Replace draws with wins until target is met, rounding up."
        },
        {
          "label": "Target reachable",
          "text": "Compare target to all-win maximum."
        }
      ],
      "example_questions": [
        "Use the Sports target-score scenario calculator.",
        "Help me calculate sports target-score scenario."
      ],
      "retrieval_phrases": [
        "Sports target-score scenario",
        "sports target score scenario"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 5,
            "c": 3,
            "d": 1,
            "e": 30
          },
          "outputs": [
            {
              "label": "Maximum attainable points",
              "value": 35
            },
            {
              "label": "All-draw finish points",
              "value": 25
            },
            {
              "label": "Wins needed with remaining draws",
              "value": 3
            },
            {
              "label": "Target reachable",
              "value": "Yes"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2821",
      "name": "Sports water-station serving inventory",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "This sizes supplies from your chosen serving plan; it provides no hydration advice. Cups round upward separately by station and all filled cups use the entered volume.",
      "url": "/calculators/sports-water-station-serving-inventory/",
      "version": "a385d1ea8785da8e82c1d720b5f8a565e6d7c2ec6ef6eaec0df7ae211ae2db29",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Expected participants served by station (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "User-chosen servings per participant by station",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Serving cup capacity (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Inventory reserve (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Cups including reserve by station",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total filled-liquid inventory (litres)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This sizes supplies from your chosen serving plan; it provides no hydration advice. Cups round upward separately by station and all filled cups use the entered volume."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Cups including reserve by station",
          "text": "Multiply participants, servings and reserve factor, then round up."
        },
        {
          "label": "Total filled-liquid inventory (litres)",
          "text": "Multiply all reserved cups by cup capacity and convert mL to litres."
        }
      ],
      "example_questions": [
        "Use the Sports water-station serving inventory calculator.",
        "Help me calculate sports water-station serving inventory."
      ],
      "retrieval_phrases": [
        "Sports water-station serving inventory",
        "sports water station serving inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,80",
            "b": "1,2",
            "c": 200,
            "d": 10
          },
          "outputs": [
            {
              "label": "Cups including reserve by station",
              "value": "110, 176"
            },
            {
              "label": "Total filled-liquid inventory (litres)",
              "value": 57.2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2825",
      "name": "Sports scoreboard clock reconciliation",
      "category": "Sports competition administration",
      "status": "available",
      "purpose": "Single countdown period, with nonoverlapping completed pauses already identified. Overtime and pauses that extend beyond the observation time are excluded.",
      "url": "/calculators/sports-scoreboard-clock-reconciliation/",
      "version": "f3b7d4ff71c0cb041ac5ccaa65e492379fbddba8ed520e647c953f1e558c7403",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Period length (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Elapsed wall time since period start (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Completed clock pauses within elapsed time (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Elapsed playing time (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Time remaining on clock (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Playing time past period end (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single countdown period, with nonoverlapping completed pauses already identified. Overtime and pauses that extend beyond the observation time are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Elapsed playing time (minutes)",
          "text": "Subtract stopped-clock intervals from elapsed wall time."
        },
        {
          "label": "Time remaining on clock (minutes)",
          "text": "Subtract elapsed playing time from period length, floored at zero."
        },
        {
          "label": "Playing time past period end (minutes)",
          "text": "Report excess playing time beyond the entered period."
        }
      ],
      "example_questions": [
        "Use the Sports scoreboard clock reconciliation calculator.",
        "Help me calculate sports scoreboard clock reconciliation."
      ],
      "retrieval_phrases": [
        "Sports scoreboard clock reconciliation",
        "sports scoreboard clock reconciliation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 12,
            "c": "1,2"
          },
          "outputs": [
            {
              "label": "Elapsed playing time (minutes)",
              "value": 9
            },
            {
              "label": "Time remaining on clock (minutes)",
              "value": 11
            },
            {
              "label": "Playing time past period end (minutes)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Operations scope review; verify deterministic examples, resource limits and any policy-sensitive behavior.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2828",
      "name": "Miniature brick texture grid",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Stack-bond rectangular texture only, with aligned vertical joints. Module sizes include mortar; guides beyond the edge are trimmed.",
      "url": "/calculators/miniature-brick-texture-grid/",
      "version": "cf2b2f91d5a259eeffee1245a861d5bb3f55e1c4a3026a55314dc9219c5b54d9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Texture surface width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Texture surface height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Brick module width including mortar (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Brick course height including mortar (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Brick columns (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Brick courses (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Final column width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Final course height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Stack-bond rectangular texture only, with aligned vertical joints. Module sizes include mortar; guides beyond the edge are trimmed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Brick columns (count)",
          "text": "Round surface width divided by module width upward."
        },
        {
          "label": "Brick courses (count)",
          "text": "Round surface height divided by course height upward."
        },
        {
          "label": "Final column width (mm)",
          "text": "Subtract full earlier modules from surface width."
        },
        {
          "label": "Final course height (mm)",
          "text": "Subtract full earlier courses from surface height."
        }
      ],
      "example_questions": [
        "Use the Miniature brick texture grid calculator.",
        "Help me calculate miniature brick texture grid."
      ],
      "retrieval_phrases": [
        "Miniature brick texture grid",
        "miniature brick texture grid"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 50,
            "c": 20,
            "d": 10
          },
          "outputs": [
            {
              "label": "Brick columns (count)",
              "value": 5
            },
            {
              "label": "Brick courses (count)",
              "value": 5
            },
            {
              "label": "Final column width (mm)",
              "value": 20
            },
            {
              "label": "Final course height (mm)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2829",
      "name": "Miniature roof shingle rows",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "One rectangular roof slope. Alternate courses begin with a half-width shingle; a course consumes the required full stock pieces even if edges are trimmed. No reuse of offcuts.",
      "url": "/calculators/miniature-roof-shingle-rows/",
      "version": "f0efa29966ee10b567427dfaa7ee0cfd84d831fe3346aac59a09b8962be25066",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Miniature roof slope width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Roof slope length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Shingle width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Exposed height per course (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Course count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Stock shingles required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Alternate course offset (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One rectangular roof slope. Alternate courses begin with a half-width shingle; a course consumes the required full stock pieces even if edges are trimmed. No reuse of offcuts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Course count",
          "text": "Round slope length divided by exposed course height upward."
        },
        {
          "label": "Stock shingles required",
          "text": "Add full and half-offset row requirements."
        },
        {
          "label": "Alternate course offset (mm)",
          "text": "Start every second course half a shingle left of the edge."
        }
      ],
      "example_questions": [
        "Use the Miniature roof shingle rows calculator.",
        "Help me calculate miniature roof shingle rows."
      ],
      "retrieval_phrases": [
        "Miniature roof shingle rows",
        "miniature roof shingle rows"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 80,
            "c": 20,
            "d": 20
          },
          "outputs": [
            {
              "label": "Course count",
              "value": 4
            },
            {
              "label": "Stock shingles required",
              "value": 22
            },
            {
              "label": "Alternate course offset (mm)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2830",
      "name": "Miniature staircase tread layout",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Miniature model only. Equal treads over full run; riser panels fit below tread thickness. This does not size human-use stairs.",
      "url": "/calculators/miniature-staircase-tread-layout/",
      "version": "8f426237ec5b1a0c53c0fbd2ed07c88f4196099783ac797c0f9c3a178fc9a631",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Total miniature stair rise (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Total miniature stair run (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Equal steps (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Tread material thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Tread depth (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Finished rise per step (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Riser panel height below tread (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Miniature model only. Equal treads over full run; riser panels fit below tread thickness. This does not size human-use stairs."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Tread depth (mm)",
          "text": "Divide total run equally among steps."
        },
        {
          "label": "Finished rise per step (mm)",
          "text": "Divide total rise by steps."
        },
        {
          "label": "Riser panel height below tread (mm)",
          "text": "Subtract tread thickness from finished rise."
        }
      ],
      "example_questions": [
        "Use the Miniature staircase tread layout calculator.",
        "Help me calculate miniature staircase tread layout."
      ],
      "retrieval_phrases": [
        "Miniature staircase tread layout",
        "miniature staircase tread layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 60,
            "c": 6,
            "d": 1
          },
          "outputs": [
            {
              "label": "Tread depth (mm)",
              "value": 10
            },
            {
              "label": "Finished rise per step (mm)",
              "value": 5
            },
            {
              "label": "Riser panel height below tread (mm)",
              "value": 4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2833",
      "name": "Miniature resin pour cavity estimate",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Geometric liquid inventory only; follow product instructions for compatibility, cure, mixing and handling. Loss is a fraction of prepared material that does not reach the cavities.",
      "url": "/calculators/miniature-resin-pour-cavity-estimate/",
      "version": "14846d85439244be302515842dd42b97f864954245454021d38be07c9e40a2af",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Miniature mold cavity volumes (mL)",
          "type": "array",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Embedded object displacement (mL)",
          "type": "array",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured transfer loss (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Maximum prepared batch (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net cavity fill (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Prepared volume including transfer loss (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Batch count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Geometric liquid inventory only; follow product instructions for compatibility, cure, mixing and handling. Loss is a fraction of prepared material that does not reach the cavities."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net cavity fill (mL)",
          "text": "Subtract embedded displacement from cavity volume."
        },
        {
          "label": "Prepared volume including transfer loss (mL)",
          "text": "Divide net fill by retained fraction."
        },
        {
          "label": "Batch count",
          "text": "Round required prepared volume up to batch capacity."
        }
      ],
      "example_questions": [
        "Use the Miniature resin pour cavity estimate calculator.",
        "Help me calculate miniature resin pour cavity estimate."
      ],
      "retrieval_phrases": [
        "Miniature resin pour cavity estimate",
        "miniature resin pour cavity estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,30",
            "b": "2,3",
            "c": 10,
            "d": 25
          },
          "outputs": [
            {
              "label": "Net cavity fill (mL)",
              "value": 45
            },
            {
              "label": "Prepared volume including transfer loss (mL)",
              "value": 50
            },
            {
              "label": "Batch count",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2837",
      "name": "Miniature display shelf spacing",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Uniform-height shelves; cabinet bottom supports the first level and each additional level requires one shelf thickness. Width/depth fit is supplied as models per shelf.",
      "url": "/calculators/miniature-display-shelf-spacing/",
      "version": "92fddc82a3c11b671465cc17037f28b5067db6bb10b531c613e9ca5004fc6820",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cabinet usable height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Tallest displayed model including base (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Clearance above model (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Shelf thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Models fitting across each shelf (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Display levels (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Maximum model capacity (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Level base pitch (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform-height shelves; cabinet bottom supports the first level and each additional level requires one shelf thickness. Width/depth fit is supplied as models per shelf."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Display levels (count)",
          "text": "Fit complete model-clearance bays with shelf thickness only between levels."
        },
        {
          "label": "Maximum model capacity (count)",
          "text": "Multiply display levels by supplied per-level fit."
        },
        {
          "label": "Level base pitch (mm)",
          "text": "Add model height, clearance and intervening shelf thickness."
        }
      ],
      "example_questions": [
        "Use the Miniature display shelf spacing calculator.",
        "Help me calculate miniature display shelf spacing."
      ],
      "retrieval_phrases": [
        "Miniature display shelf spacing",
        "miniature display shelf spacing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 100,
            "c": 20,
            "d": 10,
            "e": 4
          },
          "outputs": [
            {
              "label": "Display levels (count)",
              "value": 3
            },
            {
              "label": "Maximum model capacity (count)",
              "value": 12
            },
            {
              "label": "Level base pitch (mm)",
              "value": 130
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2838",
      "name": "Miniature collection catalog value",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Values are supplied estimates, not appraisals or investment guidance. Every category uses one per-item cost and value.",
      "url": "/calculators/miniature-collection-catalog-value/",
      "version": "a9253667bea33368c1156d8a4c46891e2a51360571933314ce505687c79cf791",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Item counts by collection category",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Recorded unit acquisition cost (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "User-declared unit current value (currency)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total acquisition cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total declared collection value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Declared value shares by category (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Values are supplied estimates, not appraisals or investment guidance. Every category uses one per-item cost and value."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total acquisition cost (currency)",
          "text": "Multiply counts by acquisition cost and sum."
        },
        {
          "label": "Total declared collection value (currency)",
          "text": "Multiply counts by declared unit value and sum."
        },
        {
          "label": "Declared value shares by category (%)",
          "text": "Divide each category declared value by collection total."
        }
      ],
      "example_questions": [
        "Use the Miniature collection catalog value calculator.",
        "Help me calculate miniature collection catalog value."
      ],
      "retrieval_phrases": [
        "Miniature collection catalog value",
        "miniature collection catalog value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": "10,20",
            "c": "15,30"
          },
          "outputs": [
            {
              "label": "Total acquisition cost (currency)",
              "value": 80
            },
            {
              "label": "Total declared collection value (currency)",
              "value": 120
            },
            {
              "label": "Declared value shares by category (%)",
              "value": "25, 75"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2839",
      "name": "Miniature magnet placement inventory",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Each pair requires two magnets with opposite-facing poles. Magnet dimensions, retention strength and suitability are supplied externally.",
      "url": "/calculators/miniature-magnet-placement-inventory/",
      "version": "ff7f01e4f4e72c6686333392083b21228c2eed84f1309de5ce5450d844a2fce9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Assembly joints by model group (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Specified magnet pairs per joint (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Available magnets (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required magnet pairs (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required individual magnets (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Additional magnets to purchase (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Polarity checklist",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each pair requires two magnets with opposite-facing poles. Magnet dimensions, retention strength and suitability are supplied externally."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required magnet pairs (count)",
          "text": "Multiply joints by pairs per joint and add."
        },
        {
          "label": "Required individual magnets (count)",
          "text": "Use two magnets per pair."
        },
        {
          "label": "Additional magnets to purchase (count)",
          "text": "Subtract stock from required individual magnets."
        },
        {
          "label": "Polarity checklist",
          "text": "Provide one opposite-pole verification for every specified pair."
        }
      ],
      "example_questions": [
        "Use the Miniature magnet placement inventory calculator.",
        "Help me calculate miniature magnet placement inventory."
      ],
      "retrieval_phrases": [
        "Miniature magnet placement inventory",
        "miniature magnet placement inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,6",
            "b": "1,2",
            "c": 20
          },
          "outputs": [
            {
              "label": "Required magnet pairs (count)",
              "value": 16
            },
            {
              "label": "Required individual magnets (count)",
              "value": 32
            },
            {
              "label": "Additional magnets to purchase (count)",
              "value": 12
            },
            {
              "label": "Polarity checklist",
              "value": "Mark one outward pole on each of 16 pairs; match each partner opposite before installation."
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2840",
      "name": "Miniature decal sheet packing",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Identical rectangular decals in an unrotated grid. Margins apply to both opposing edges and gaps occur only between decals; no optimal irregular nesting claim.",
      "url": "/calculators/miniature-decal-sheet-packing/",
      "version": "ea7c64a81a1ee457f721871d8e9e3fb20b8daec0f317bde1d321960fe108f754",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Decal width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Decal height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Margin on every sheet edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Gap between decals (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Decals required (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Columns per sheet",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Rows per sheet",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Sheets needed",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Identical rectangular decals in an unrotated grid. Margins apply to both opposing edges and gaps occur only between decals; no optimal irregular nesting claim."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Columns per sheet",
          "text": "Fit width plus internal gaps inside sheet margins."
        },
        {
          "label": "Rows per sheet",
          "text": "Fit height plus internal gaps inside margins."
        },
        {
          "label": "Sheets needed",
          "text": "Divide decals by grid capacity and round upward."
        }
      ],
      "example_questions": [
        "Use the Miniature decal sheet packing calculator.",
        "Help me calculate miniature decal sheet packing."
      ],
      "retrieval_phrases": [
        "Miniature decal sheet packing",
        "miniature decal sheet packing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10,
            "c": 100,
            "d": 60,
            "e": 5,
            "f": 5,
            "g": 20
          },
          "outputs": [
            {
              "label": "Columns per sheet",
              "value": 3
            },
            {
              "label": "Rows per sheet",
              "value": 3
            },
            {
              "label": "Sheets needed",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2842",
      "name": "Miniature scratchbuild tube nesting",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Aligned rows test proposed tube pairs; radial clearance is half the difference between outer bore and inner tube outside diameter. Manufacturing tolerance must be included in supplied dimensions.",
      "url": "/calculators/miniature-scratchbuild-tube-nesting/",
      "version": "da58a35fdf816b6da8447a8290b2676abd6f460e464d39a120418252ab056c3d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Inner tube outside diameters (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Outer tube outside diameters (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Outer tube wall thicknesses (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Required radial clearance (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Available radial clearances (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Compatible pair row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Aligned rows test proposed tube pairs; radial clearance is half the difference between outer bore and inner tube outside diameter. Manufacturing tolerance must be included in supplied dimensions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Available radial clearances (mm)",
          "text": "Subtract inner-tube diameter from outer-tube bore and divide by two."
        },
        {
          "label": "Compatible pair row numbers",
          "text": "Keep pairs whose radial clearance meets the entered minimum."
        }
      ],
      "example_questions": [
        "Use the Miniature scratchbuild tube nesting calculator.",
        "Help me calculate miniature scratchbuild tube nesting."
      ],
      "retrieval_phrases": [
        "Miniature scratchbuild tube nesting",
        "miniature scratchbuild tube nesting"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,8",
            "b": "8,12",
            "c": "1,1",
            "d": 0.5
          },
          "outputs": [
            {
              "label": "Available radial clearances (mm)",
              "value": "0.5, 1"
            },
            {
              "label": "Compatible pair row numbers",
              "value": "1, 2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2843",
      "name": "Miniature diorama perspective scaling",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Forced-perspective linear-size proxy: apparent size scales inversely with entered distance multiplier. This is a small-angle visual model, not a camera calibration.",
      "url": "/calculators/miniature-diorama-perspective-scaling/",
      "version": "0232f9fa04d8f4c77ef998a280fe4a8e710ea9e0edb85d4f2896e0085f955b1c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Reference object sizes (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Desired apparent distance multipliers",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Scaled model sizes (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Size scale factors",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Forced-perspective linear-size proxy: apparent size scales inversely with entered distance multiplier. This is a small-angle visual model, not a camera calibration."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Scaled model sizes (mm)",
          "text": "Divide each reference size by its desired apparent distance multiplier."
        },
        {
          "label": "Size scale factors",
          "text": "Take the reciprocal of each distance multiplier."
        }
      ],
      "example_questions": [
        "Use the Miniature diorama perspective scaling calculator.",
        "Help me calculate miniature diorama perspective scaling."
      ],
      "retrieval_phrases": [
        "Miniature diorama perspective scaling",
        "miniature diorama perspective scaling"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": "2,4"
          },
          "outputs": [
            {
              "label": "Scaled model sizes (mm)",
              "value": "50, 50"
            },
            {
              "label": "Size scale factors",
              "value": "0.5, 0.25"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2844",
      "name": "Miniature photography focus-stack plan",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Positions start at zero and finish at the exact depth endpoint. Usable increment is measured for your setup; no optical depth-of-field guarantee.",
      "url": "/calculators/miniature-photography-focus-stack-plan/",
      "version": "1bceb74be5d14afc7405180de0b169082d05f9388cb16b97785d28f86c37a2b4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Depth range to cover (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured usable focus increment (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Desired increment overlap (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Maximum position step (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Image count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Capture positions (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Positions start at zero and finish at the exact depth endpoint. Usable increment is measured for your setup; no optical depth-of-field guarantee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Maximum position step (mm)",
          "text": "Reduce measured increment by overlap fraction."
        },
        {
          "label": "Image count",
          "text": "Count enough intervals to cover depth and include both endpoints."
        },
        {
          "label": "Capture positions (mm)",
          "text": "Step from zero using the overlap-adjusted increment and clamp the final position to depth."
        }
      ],
      "example_questions": [
        "Use the Miniature photography focus-stack plan calculator.",
        "Help me calculate miniature photography focus-stack plan."
      ],
      "retrieval_phrases": [
        "Miniature photography focus-stack plan",
        "miniature photography focus stack plan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2,
            "c": 50
          },
          "outputs": [
            {
              "label": "Maximum position step (mm)",
              "value": 1
            },
            {
              "label": "Image count",
              "value": 11
            },
            {
              "label": "Capture positions (mm)",
              "value": "0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2846",
      "name": "Miniature army list point tally",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Entered unit caps and point values define the only rules checked; faction legality and game edition must be reviewed separately.",
      "url": "/calculators/miniature-army-list-point-tally/",
      "version": "1c93e12daae82f5d734702e941218a37b417343776a5368495dcaea155b1b35a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Unit quantities (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "User-supplied points per unit",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Army point cap",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "User-supplied maximum quantities",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Army point total",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Points over cap",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unit rows violating quantity caps",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Entered unit caps and point values define the only rules checked; faction legality and game edition must be reviewed separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Army point total",
          "text": "Multiply each unit quantity by its supplied points and sum."
        },
        {
          "label": "Points over cap",
          "text": "Subtract point cap and floor at zero."
        },
        {
          "label": "Unit rows violating quantity caps",
          "text": "Compare each unit quantity with its supplied cap."
        }
      ],
      "example_questions": [
        "Use the Miniature army list point tally calculator.",
        "Help me calculate miniature army list point tally."
      ],
      "retrieval_phrases": [
        "Miniature army list point tally",
        "miniature army list point tally"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": "50,20",
            "c": 150,
            "d": "3,2"
          },
          "outputs": [
            {
              "label": "Army point total",
              "value": 160
            },
            {
              "label": "Points over cap",
              "value": 10
            },
            {
              "label": "Unit rows violating quantity caps",
              "value": "2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2848",
      "name": "Miniature terrain coverage percentage",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Supply area counted more than once, with higher-order overlaps reconciled externally. Reports aggregate open area only; corridor connectivity requires a spatial layout.",
      "url": "/calculators/miniature-terrain-coverage-percentage/",
      "version": "d6418ea8af7193e23178661780d85ca378610fac5bfeeef1fddefaee99c0c2fe",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Table length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Table width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Terrain footprint areas (square cm)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Measured repeated overlap area (square cm)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unique terrain coverage (square cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Terrain coverage (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Open table area (square cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supply area counted more than once, with higher-order overlaps reconciled externally. Reports aggregate open area only; corridor connectivity requires a spatial layout."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unique terrain coverage (square cm)",
          "text": "Subtract repeated overlap from summed footprint areas."
        },
        {
          "label": "Terrain coverage (%)",
          "text": "Divide unique coverage by rectangular table area."
        },
        {
          "label": "Open table area (square cm)",
          "text": "Subtract unique terrain area from table area."
        }
      ],
      "example_questions": [
        "Use the Miniature terrain coverage percentage calculator.",
        "Help me calculate miniature terrain coverage percentage."
      ],
      "retrieval_phrases": [
        "Miniature terrain coverage percentage",
        "miniature terrain coverage percentage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 120,
            "b": 60,
            "c": "600,1200",
            "d": 300
          },
          "outputs": [
            {
              "label": "Unique terrain coverage (square cm)",
              "value": 1500
            },
            {
              "label": "Terrain coverage (%)",
              "value": 20.833333333333332
            },
            {
              "label": "Open table area (square cm)",
              "value": 5700
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2849",
      "name": "Miniature base-edge label layout",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Single straight or unwrapped edge path; measured glyph widths include no extra kerning. Equal spacing fills the usable path when the label fits.",
      "url": "/calculators/miniature-base-edge-label-layout/",
      "version": "1d5dc4e2d6170ab43b5c3ba790041e548c30ddec95af46ba1628babc9c553682",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Available base-edge path length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured letter widths (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Margin at each end (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Desired minimum interletter gap (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Minimum label path required (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Fits supplied edge",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Equal interletter gap (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Single straight or unwrapped edge path; measured glyph widths include no extra kerning. Equal spacing fills the usable path when the label fits."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Minimum label path required (mm)",
          "text": "Add glyph widths, end margins and minimum gaps."
        },
        {
          "label": "Fits supplied edge",
          "text": "Compare minimum required path with available path."
        },
        {
          "label": "Equal interletter gap (mm)",
          "text": "Divide remaining path after letters and margins by number of internal gaps; negative signals overflow."
        }
      ],
      "example_questions": [
        "Use the Miniature base-edge label layout calculator.",
        "Help me calculate miniature base-edge label layout."
      ],
      "retrieval_phrases": [
        "Miniature base-edge label layout",
        "miniature base edge label layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "10,12,8,10",
            "c": 5,
            "d": 2
          },
          "outputs": [
            {
              "label": "Minimum label path required (mm)",
              "value": 56
            },
            {
              "label": "Fits supplied edge",
              "value": "Yes"
            },
            {
              "label": "Equal interletter gap (mm)",
              "value": 16.666666666666668
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2850",
      "name": "Miniature commission paint queue",
      "category": "Miniature models and tabletop terrain",
      "status": "available",
      "purpose": "Process complexity groups in entered order, one continuous queue. Work may split across days; due offsets are measured in workdays from start.",
      "url": "/calculators/miniature-commission-paint-queue/",
      "version": "189cc6d45db51056f7a57dd4aaf117eb11a64e78f7157715ec2a9124ebfe01b3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Model counts by complexity group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured work hours per model",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Available painting hours per workday",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Due day offsets by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Group work hours",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Group completion workdays",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Late group row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Process complexity groups in entered order, one continuous queue. Work may split across days; due offsets are measured in workdays from start."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Group work hours",
          "text": "Multiply model count by measured hours per model."
        },
        {
          "label": "Group completion workdays",
          "text": "Divide cumulative queue hours by daily capacity and round up."
        },
        {
          "label": "Late group row numbers",
          "text": "Compare completion workdays with supplied due days."
        }
      ],
      "example_questions": [
        "Use the Miniature commission paint queue calculator.",
        "Help me calculate miniature commission paint queue."
      ],
      "retrieval_phrases": [
        "Miniature commission paint queue",
        "miniature commission paint queue"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,2",
            "b": "1,3",
            "c": 2,
            "d": "3,5"
          },
          "outputs": [
            {
              "label": "Group work hours",
              "value": "4, 6"
            },
            {
              "label": "Group completion workdays",
              "value": "2, 5"
            },
            {
              "label": "Late group row numbers",
              "value": ""
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2852",
      "name": "Canvas fabric wrap allowance",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Fabric wraps across the frame depth and then the entered rear gripping margin on all four edges. Shrinkage and trimming reserve must be added to your measurements.",
      "url": "/calculators/canvas-fabric-wrap-allowance/",
      "version": "f550a8109ca65a0eb9a59ae67d586d419708bff838d152c4a469eb184ab8803a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Canvas frame width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Canvas frame height (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Frame depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Rear grip margin per edge (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Raw canvas cut width (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Raw canvas cut height (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Raw canvas area (square cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fabric wraps across the frame depth and then the entered rear gripping margin on all four edges. Shrinkage and trimming reserve must be added to your measurements."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Raw canvas cut width (cm)",
          "text": "Add depth plus grip margin on both sides."
        },
        {
          "label": "Raw canvas cut height (cm)",
          "text": "Add depth plus grip margin at top and bottom."
        },
        {
          "label": "Raw canvas area (square cm)",
          "text": "Multiply raw cut dimensions."
        }
      ],
      "example_questions": [
        "Use the Canvas fabric wrap allowance calculator.",
        "Help me calculate canvas fabric wrap allowance."
      ],
      "retrieval_phrases": [
        "Canvas fabric wrap allowance",
        "canvas fabric wrap allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 30,
            "c": 2,
            "d": 3
          },
          "outputs": [
            {
              "label": "Raw canvas cut width (cm)",
              "value": 50
            },
            {
              "label": "Raw canvas cut height (cm)",
              "value": 40
            },
            {
              "label": "Raw canvas area (square cm)",
              "value": 2000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2853",
      "name": "Canvas priming quantity",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Coverage is from your measured product/application test and is assumed constant for every coat. Purchase volume rounds up to whole containers.",
      "url": "/calculators/canvas-priming-quantity/",
      "version": "79bdf50f9172c214398d1c9b16b301019768edfe90eae8bc17b82cd9b70939ea",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Canvas surface area (square metres)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tested primer coverage per litre per coat (square metres/L)",
          "type": "number",
          "required": true,
          "unit": "square metres/L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Primer coats (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Primer container size (L)",
          "type": "number",
          "required": true,
          "unit": "L",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Price per container (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Primer required (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Containers to purchase",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Primer purchase cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Coverage is from your measured product/application test and is assumed constant for every coat. Purchase volume rounds up to whole containers."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Primer required (L)",
          "text": "Multiply area by coats and divide by measured coverage."
        },
        {
          "label": "Containers to purchase",
          "text": "Divide required litres by container size and round up."
        },
        {
          "label": "Primer purchase cost (currency)",
          "text": "Multiply whole containers by supplied price."
        }
      ],
      "example_questions": [
        "Use the Canvas priming quantity calculator.",
        "Help me calculate canvas priming quantity."
      ],
      "retrieval_phrases": [
        "Canvas priming quantity",
        "canvas priming quantity"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 8,
            "c": 2,
            "d": 1,
            "e": 15
          },
          "outputs": [
            {
              "label": "Primer required (L)",
              "value": 1
            },
            {
              "label": "Containers to purchase",
              "value": 1
            },
            {
              "label": "Primer purchase cost (currency)",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2854",
      "name": "Artist paint mixing proportion ledger",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Parts describe a user-tested volume recipe; quantities are proportional and do not predict colour, opacity or compatibility.",
      "url": "/calculators/artist-paint-mixing-proportion-ledger/",
      "version": "855e2fdf1f205a9619cc830f0c622e48d2214c178b1b1c2b9e4616efd049bb5c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Chosen paint proportions (parts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Total paint batch (mL)",
          "type": "number",
          "required": true,
          "unit": "mL",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Component paint quantities (mL)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Normalized component percentages (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Parts describe a user-tested volume recipe; quantities are proportional and do not predict colour, opacity or compatibility."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Component paint quantities (mL)",
          "text": "Divide total batch among components in proportion to their entered parts."
        },
        {
          "label": "Normalized component percentages (%)",
          "text": "Divide each component parts by total parts."
        }
      ],
      "example_questions": [
        "Use the Artist paint mixing proportion ledger calculator.",
        "Help me calculate artist paint mixing proportion ledger."
      ],
      "retrieval_phrases": [
        "Artist paint mixing proportion ledger",
        "artist paint mixing proportion ledger"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,1,1",
            "b": 100
          },
          "outputs": [
            {
              "label": "Component paint quantities (mL)",
              "value": "50, 25, 25"
            },
            {
              "label": "Normalized component percentages (%)",
              "value": "50, 25, 25"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2856",
      "name": "Artist colour swatch grid",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "One unmixed swatch per colour plus one unordered pairwise mix for every distinct colour pair. No repeated ratios or self-mixes are added.",
      "url": "/calculators/artist-colour-swatch-grid/",
      "version": "e3967121d7a3f828d94e377f14d589f3fce2c6fd3f9e5a325a0851f21ee1b0c3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Paint colours (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Swatch cell width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Swatch cell height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sheet columns (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pairwise mixed swatches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total swatches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Sheet rows required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Grid size (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One unmixed swatch per colour plus one unordered pairwise mix for every distinct colour pair. No repeated ratios or self-mixes are added."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pairwise mixed swatches",
          "text": "Count unordered pairs of distinct colours."
        },
        {
          "label": "Total swatches",
          "text": "Add pure-colour swatches."
        },
        {
          "label": "Sheet rows required",
          "text": "Round swatches divided by columns up."
        },
        {
          "label": "Grid size (mm)",
          "text": "Multiply grid columns and rows by cell dimensions."
        }
      ],
      "example_questions": [
        "Use the Artist colour swatch grid calculator.",
        "Help me calculate artist colour swatch grid."
      ],
      "retrieval_phrases": [
        "Artist colour swatch grid",
        "artist colour swatch grid"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 20,
            "c": 15,
            "d": 4
          },
          "outputs": [
            {
              "label": "Pairwise mixed swatches",
              "value": 10
            },
            {
              "label": "Total swatches",
              "value": 15
            },
            {
              "label": "Sheet rows required",
              "value": 4
            },
            {
              "label": "Grid size (mm)",
              "value": "80 × 60"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2858",
      "name": "Artist composition grid overlay",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Evenly spaced composition grid, with only internal guides returned; choose 3 for thirds. Coordinates start at the upper-left corner.",
      "url": "/calculators/artist-composition-grid-overlay/",
      "version": "0e6f110c1cd95d6267e4085fd992e76ca40a9a453b15a3359699412cbfc8e0f6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Artwork width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Artwork height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Equal grid divisions per axis (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Vertical guide positions (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Horizontal guide positions (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Evenly spaced composition grid, with only internal guides returned; choose 3 for thirds. Coordinates start at the upper-left corner."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Vertical guide positions (mm)",
          "text": "Place guides at successive equal fractions of width."
        },
        {
          "label": "Horizontal guide positions (mm)",
          "text": "Place guides at successive equal fractions of height."
        }
      ],
      "example_questions": [
        "Use the Artist composition grid overlay calculator.",
        "Help me calculate artist composition grid overlay."
      ],
      "retrieval_phrases": [
        "Artist composition grid overlay",
        "artist composition grid overlay"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 300,
            "b": 200,
            "c": 3
          },
          "outputs": [
            {
              "label": "Vertical guide positions (mm)",
              "value": "100, 200"
            },
            {
              "label": "Horizontal guide positions (mm)",
              "value": "66.666667, 133.333333"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2859",
      "name": "Artist mural scaling grid",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Reference cells map independently in x and y; differing scale factors imply distortion. The last reference row/column can be partial.",
      "url": "/calculators/artist-mural-scaling-grid/",
      "version": "156e5a35effb1eb14ff1e986fc87c1975ecf3f55665af8bcf34709081ff814c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Reference image width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Reference image height (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Mural width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Mural height (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Reference grid square side (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Horizontal scale factor",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Vertical scale factor",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Mapped full-cell width (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Mapped full-cell height (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_5",
          "label": "Reference grid columns × rows",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reference cells map independently in x and y; differing scale factors imply distortion. The last reference row/column can be partial."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Horizontal scale factor",
          "text": "Divide mural width by reference width."
        },
        {
          "label": "Vertical scale factor",
          "text": "Divide mural height by reference height."
        },
        {
          "label": "Mapped full-cell width (cm)",
          "text": "Scale reference grid width horizontally."
        },
        {
          "label": "Mapped full-cell height (cm)",
          "text": "Scale reference grid height vertically."
        },
        {
          "label": "Reference grid columns × rows",
          "text": "Round source dimensions up to grid-cell counts."
        }
      ],
      "example_questions": [
        "Use the Artist mural scaling grid calculator.",
        "Help me calculate artist mural scaling grid."
      ],
      "retrieval_phrases": [
        "Artist mural scaling grid",
        "artist mural scaling grid"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10,
            "c": 200,
            "d": 150,
            "e": 5
          },
          "outputs": [
            {
              "label": "Horizontal scale factor",
              "value": 10
            },
            {
              "label": "Vertical scale factor",
              "value": 15
            },
            {
              "label": "Mapped full-cell width (cm)",
              "value": 50
            },
            {
              "label": "Mapped full-cell height (cm)",
              "value": 75
            },
            {
              "label": "Reference grid columns × rows",
              "value": "4 × 2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2862",
      "name": "Artist print edition numbering",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Artist proofs are additional to the numbered edition and are not included in numbered stock. Sold and reserved copies are disjoint counts.",
      "url": "/calculators/artist-print-edition-numbering/",
      "version": "6137995c52acd8991de4dc488f9d5c6e88d64879bc8b8148e62bb9d90b978a88",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Numbered edition size (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Artist proofs outside numbered edition (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reserved numbered copies (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Sold numbered copies (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total physical edition inventory",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Available numbered copies",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Numbering labels",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Artist proofs are additional to the numbered edition and are not included in numbered stock. Sold and reserved copies are disjoint counts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total physical edition inventory",
          "text": "Add numbered edition and separate artist proofs."
        },
        {
          "label": "Available numbered copies",
          "text": "Subtract reserved and sold copies from the numbered edition."
        },
        {
          "label": "Numbering labels",
          "text": "Use separate labels for numbered copies and artist proofs."
        }
      ],
      "example_questions": [
        "Use the Artist print edition numbering calculator.",
        "Help me calculate artist print edition numbering."
      ],
      "retrieval_phrases": [
        "Artist print edition numbering",
        "artist print edition numbering"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 15,
            "d": 20
          },
          "outputs": [
            {
              "label": "Total physical edition inventory",
              "value": 110
            },
            {
              "label": "Available numbered copies",
              "value": 65
            },
            {
              "label": "Numbering labels",
              "value": "Numbered 1–100; artist proofs AP 1–10"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2863",
      "name": "Artist print sales commission",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Commission applies to the entered sale price. Production and shipping are borne entirely by the artist; taxes and discounts must already be reconciled.",
      "url": "/calculators/artist-print-sales-commission/",
      "version": "55fa65e84edb3fbb1f8f9ec5e286c4a80675390bf59ed79ad6795c411232c593",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Print sale price (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Gallery commission (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Production cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Artist-paid shipping (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Gallery commission (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Artist proceeds before own costs (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Net artist proceeds (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Commission applies to the entered sale price. Production and shipping are borne entirely by the artist; taxes and discounts must already be reconciled."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Gallery commission (currency)",
          "text": "Multiply sale price by commission percentage."
        },
        {
          "label": "Artist proceeds before own costs (currency)",
          "text": "Subtract commission from sale price."
        },
        {
          "label": "Net artist proceeds (currency)",
          "text": "Subtract production and shipping from artist proceeds."
        }
      ],
      "example_questions": [
        "Use the Artist print sales commission calculator.",
        "Help me calculate artist print sales commission."
      ],
      "retrieval_phrases": [
        "Artist print sales commission",
        "artist print sales commission"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 40,
            "c": 20,
            "d": 10
          },
          "outputs": [
            {
              "label": "Gallery commission (currency)",
              "value": 40
            },
            {
              "label": "Artist proceeds before own costs (currency)",
              "value": 60
            },
            {
              "label": "Net artist proceeds (currency)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2864",
      "name": "Artist gallery consignment settlement",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "One uniform commission on total receipts. Sold and returned works are disjoint; negative settlement means the entered advance exceeds current earned proceeds.",
      "url": "/calculators/artist-gallery-consignment-settlement/",
      "version": "6ffc315705f0d51eb877a678e138b9ca98b7a640601d855bdbe124f776580dca",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Works consigned (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Works sold (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Works returned (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total sold-work receipts (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Consignment commission (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Paid artist advance (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Works still held on consignment",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Earned artist proceeds (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Settlement balance due to artist (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One uniform commission on total receipts. Sold and returned works are disjoint; negative settlement means the entered advance exceeds current earned proceeds."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Works still held on consignment",
          "text": "Subtract sold and returned works from initial inventory."
        },
        {
          "label": "Earned artist proceeds (currency)",
          "text": "Subtract gallery commission from receipts."
        },
        {
          "label": "Settlement balance due to artist (currency)",
          "text": "Subtract advance already paid from earned proceeds."
        }
      ],
      "example_questions": [
        "Use the Artist gallery consignment settlement calculator.",
        "Help me calculate artist gallery consignment settlement."
      ],
      "retrieval_phrases": [
        "Artist gallery consignment settlement",
        "artist gallery consignment settlement"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 4,
            "c": 3,
            "d": 2000,
            "e": 30,
            "f": 500
          },
          "outputs": [
            {
              "label": "Works still held on consignment",
              "value": 3
            },
            {
              "label": "Earned artist proceeds (currency)",
              "value": 1400
            },
            {
              "label": "Settlement balance due to artist (currency)",
              "value": 900
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2865",
      "name": "Artist exhibition wall layout",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "One horizontal row on an uninterrupted wall segment after exclusions. Works are centered as a group with preferred internal gaps.",
      "url": "/calculators/artist-exhibition-wall-layout/",
      "version": "8cf5baa10d44b70951225bba75c4836e226bbc1c08f15798931aa153999a131a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Usable uninterrupted wall length (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Artwork widths in hanging order (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Preferred gap between artworks (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Minimum end margin (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hanging group width (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Equal end margins (cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Artwork left-edge positions (cm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Meets minimum end margins",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One horizontal row on an uninterrupted wall segment after exclusions. Works are centered as a group with preferred internal gaps."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hanging group width (cm)",
          "text": "Add artwork widths and internal gaps."
        },
        {
          "label": "Equal end margins (cm)",
          "text": "Center the complete group on the wall."
        },
        {
          "label": "Artwork left-edge positions (cm)",
          "text": "Start at centered end margin and add prior widths and gaps."
        },
        {
          "label": "Meets minimum end margins",
          "text": "Compare centered margins with entered minimum."
        }
      ],
      "example_questions": [
        "Use the Artist exhibition wall layout calculator.",
        "Help me calculate artist exhibition wall layout."
      ],
      "retrieval_phrases": [
        "Artist exhibition wall layout",
        "artist exhibition wall layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 400,
            "b": "60,80,60",
            "c": 20,
            "d": 30
          },
          "outputs": [
            {
              "label": "Hanging group width (cm)",
              "value": 240
            },
            {
              "label": "Equal end margins (cm)",
              "value": 80
            },
            {
              "label": "Artwork left-edge positions (cm)",
              "value": "80, 160, 260"
            },
            {
              "label": "Meets minimum end margins",
              "value": "Yes"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2866",
      "name": "Artist frame mat window layout",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Centered rectangular window; overlap hides the same amount of artwork on every edge. Mat outer size equals the entered frame opening.",
      "url": "/calculators/artist-frame-mat-window-layout/",
      "version": "eabf5e2ce2a5c60c9b3ba5cb71c21403ce215bb24350475bac76d2fb83e240e0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Artwork width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Artwork height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Artwork overlap under mat on each edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Frame opening width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Frame opening height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mat window width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mat window height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Left and right border (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Top and bottom border (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Centered rectangular window; overlap hides the same amount of artwork on every edge. Mat outer size equals the entered frame opening."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mat window width (mm)",
          "text": "Subtract overlap on both horizontal edges."
        },
        {
          "label": "Mat window height (mm)",
          "text": "Subtract overlap on top and bottom."
        },
        {
          "label": "Left and right border (mm)",
          "text": "Split remaining mat width equally."
        },
        {
          "label": "Top and bottom border (mm)",
          "text": "Split remaining mat height equally."
        }
      ],
      "example_questions": [
        "Use the Artist frame mat window layout calculator.",
        "Help me calculate artist frame mat window layout."
      ],
      "retrieval_phrases": [
        "Artist frame mat window layout",
        "artist frame mat window layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 150,
            "c": 5,
            "d": 300,
            "e": 250
          },
          "outputs": [
            {
              "label": "Mat window width (mm)",
              "value": 190
            },
            {
              "label": "Mat window height (mm)",
              "value": 140
            },
            {
              "label": "Left and right border (mm)",
              "value": 55
            },
            {
              "label": "Top and bottom border (mm)",
              "value": 55
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2869",
      "name": "Artist drying rack occupancy",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Each listed work occupies one slot and remains until its supplied observed drying time. No new work enters; times are not product cure recommendations.",
      "url": "/calculators/artist-drying-rack-occupancy/",
      "version": "796de89b35ec1ece67f71e7269a585280c17a7656b92441e7ce8a32f5c090059",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Artwork ready-to-handle times from now (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Total rack slots (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Future observation offset (hours)",
          "type": "number",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Free rack slots now",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Artwork rows ready by observation",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Free slots at observation",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "All current work ready after (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each listed work occupies one slot and remains until its supplied observed drying time. No new work enters; times are not product cure recommendations."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Free rack slots now",
          "text": "Subtract current artworks from slot count."
        },
        {
          "label": "Artwork rows ready by observation",
          "text": "Select works whose entered ready time is at or before observation."
        },
        {
          "label": "Free slots at observation",
          "text": "Subtract artworks still occupying slots at observation."
        },
        {
          "label": "All current work ready after (hours)",
          "text": "Take latest supplied ready time."
        }
      ],
      "example_questions": [
        "Use the Artist drying rack occupancy calculator.",
        "Help me calculate artist drying rack occupancy."
      ],
      "retrieval_phrases": [
        "Artist drying rack occupancy",
        "artist drying rack occupancy"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,5,3",
            "b": 5,
            "c": 3
          },
          "outputs": [
            {
              "label": "Free rack slots now",
              "value": 2
            },
            {
              "label": "Artwork rows ready by observation",
              "value": "1, 3"
            },
            {
              "label": "Free slots at observation",
              "value": 4
            },
            {
              "label": "All current work ready after (hours)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2870",
      "name": "Artist commission installment plan",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Payment shares must total 100%; dates are ordered offsets and all materials are paid at day zero. Exposure compares material spend with the first payment.",
      "url": "/calculators/artist-commission-installment-plan/",
      "version": "baaa72273b2995d977b25ffcdece14626246e483af98f5c5af704c3f5086b6c2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Commission fee (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Upfront material spend (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Milestone payment shares (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Milestone dates (days from start)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Payments at entered milestone days (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Initial material cash exposure (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Final payment day",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Payment shares must total 100%; dates are ordered offsets and all materials are paid at day zero. Exposure compares material spend with the first payment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Payments at entered milestone days (currency)",
          "text": "Multiply total fee by each agreed share."
        },
        {
          "label": "Initial material cash exposure (currency)",
          "text": "Subtract a day-zero first payment from upfront materials; otherwise all materials are exposed."
        },
        {
          "label": "Final payment day",
          "text": "Use the last entered milestone date."
        }
      ],
      "example_questions": [
        "Use the Artist commission installment plan calculator.",
        "Help me calculate artist commission installment plan."
      ],
      "retrieval_phrases": [
        "Artist commission installment plan",
        "artist commission installment plan"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 400,
            "c": "30,40,30",
            "d": "0,10,20"
          },
          "outputs": [
            {
              "label": "Payments at entered milestone days (currency)",
              "value": "300, 400, 300"
            },
            {
              "label": "Initial material cash exposure (currency)",
              "value": 100
            },
            {
              "label": "Final payment day",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2871",
      "name": "Artist residency budget",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Fixed travel, studio and materials costs plus daily housing. Support is confirmed funding in the same currency; no tax or grant eligibility assumptions.",
      "url": "/calculators/artist-residency-budget/",
      "version": "109ae4baca1bfbf88fc64e43f5b445b2da74e38e5f144bdedcf60ff86272cfc8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Travel expense (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Housing per day (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Residency duration (days)",
          "type": "number",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Studio charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Materials budget (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Confirmed grants and support (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total residency cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Funding gap (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Funding surplus (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed travel, studio and materials costs plus daily housing. Support is confirmed funding in the same currency; no tax or grant eligibility assumptions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total residency cost (currency)",
          "text": "Add fixed expenses and housing cost over the residency."
        },
        {
          "label": "Funding gap (currency)",
          "text": "Subtract support from total cost, floored at zero."
        },
        {
          "label": "Funding surplus (currency)",
          "text": "Report support above total cost."
        }
      ],
      "example_questions": [
        "Use the Artist residency budget calculator.",
        "Help me calculate artist residency budget."
      ],
      "retrieval_phrases": [
        "Artist residency budget",
        "artist residency budget"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 500,
            "b": 40,
            "c": 10,
            "d": 200,
            "e": 300,
            "f": 1000
          },
          "outputs": [
            {
              "label": "Total residency cost (currency)",
              "value": 1400
            },
            {
              "label": "Funding gap (currency)",
              "value": 400
            },
            {
              "label": "Funding surplus (currency)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2872",
      "name": "Artist studio rent cost allocation",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Shares are proportional to area multiplied by usage days and agreed weight. This is one negotiated allocation model; no tenancy or tax rule is inferred.",
      "url": "/calculators/artist-studio-rent-cost-allocation/",
      "version": "8c16610824acd2271f2976030cd51fe9cc84e5d99f11e3ad64f79284b7a4d889",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Shared studio period rent (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Occupied area per participant (square metres)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Usage days per participant (days)",
          "type": "array",
          "required": true,
          "unit": "days",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Agreed allocation weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weighted area-days by participant",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Allocated rent shares (currency)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Share percentages (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Shares are proportional to area multiplied by usage days and agreed weight. This is one negotiated allocation model; no tenancy or tax rule is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weighted area-days by participant",
          "text": "Multiply each participant area, usage days and agreed weight."
        },
        {
          "label": "Allocated rent shares (currency)",
          "text": "Distribute rent in proportion to weighted area-days."
        },
        {
          "label": "Share percentages (%)",
          "text": "Divide each weighted area-days amount by the total."
        }
      ],
      "example_questions": [
        "Use the Artist studio rent cost allocation calculator.",
        "Help me calculate artist studio rent cost allocation."
      ],
      "retrieval_phrases": [
        "Artist studio rent cost allocation",
        "artist studio rent cost allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": "10,20",
            "c": "20,10",
            "d": "1,2"
          },
          "outputs": [
            {
              "label": "Weighted area-days by participant",
              "value": "200, 400"
            },
            {
              "label": "Allocated rent shares (currency)",
              "value": "333.333333, 666.666667"
            },
            {
              "label": "Share percentages (%)",
              "value": "33.333333, 66.666667"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2874",
      "name": "Artist portfolio image batching",
      "category": "Visual arts and painting practice",
      "status": "available",
      "purpose": "Preserves aspect ratio without upscaling; dimensions round downward to positive integer pixels. Byte size uses your measured average, so upload count is an aggregate lower bound, not a file-packing guarantee.",
      "url": "/calculators/artist-portfolio-image-batching/",
      "version": "cba05e6d9d732e577697d19338f5a927073c0edfa69d884a675724afb66ee953",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Portfolio image widths (pixels)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Portfolio image heights (pixels)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Maximum export long edge (pixels)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Estimated bytes per exported pixel",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Upload batch byte limit (bytes)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Export dimensions by image (pixels)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated export bytes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Minimum byte-capacity upload batches",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Preserves aspect ratio without upscaling; dimensions round downward to positive integer pixels. Byte size uses your measured average, so upload count is an aggregate lower bound, not a file-packing guarantee."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Export dimensions by image (pixels)",
          "text": "Scale each image so its longest edge fits the limit."
        },
        {
          "label": "Estimated export bytes",
          "text": "Multiply exported pixel counts by estimated bytes per pixel."
        },
        {
          "label": "Minimum byte-capacity upload batches",
          "text": "Divide aggregate estimated bytes by batch capacity and round up."
        }
      ],
      "example_questions": [
        "Use the Artist portfolio image batching calculator.",
        "Help me calculate artist portfolio image batching."
      ],
      "retrieval_phrases": [
        "Artist portfolio image batching",
        "artist portfolio image batching"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4000,2000",
            "b": "3000,1000",
            "c": 1000,
            "d": 0.5,
            "e": 500000
          },
          "outputs": [
            {
              "label": "Export dimensions by image (pixels)",
              "value": "1000×750, 1000×500"
            },
            {
              "label": "Estimated export bytes",
              "value": 625000
            },
            {
              "label": "Minimum byte-capacity upload batches",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2901",
      "name": "Jewelry ring blank length",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Approximate neutral-axis blank for uniform rectangular stock. Metal movement during forming and finishing can change the final size; joint allowance is supplied separately.",
      "url": "/calculators/jewelry-ring-blank-length/",
      "version": "6cc428574ff9c36058e9f6211b97711efa86bbef8a5517fb31621bf2ef7ba3cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target ring inside diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Ring stock thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Additional joint finishing allowance (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Neutral-axis circumference (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Blank length including allowance (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Approximate neutral-axis blank for uniform rectangular stock. Metal movement during forming and finishing can change the final size; joint allowance is supplied separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Neutral-axis circumference (mm)",
          "text": "Add stock thickness to inside diameter and multiply by pi."
        },
        {
          "label": "Blank length including allowance (mm)",
          "text": "Add supplied joint allowance to neutral-axis circumference."
        }
      ],
      "example_questions": [
        "Use the Jewelry ring blank length calculator.",
        "Help me calculate jewelry ring blank length."
      ],
      "retrieval_phrases": [
        "Jewelry ring blank length",
        "jewelry ring blank length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 18,
            "b": 2,
            "c": 1
          },
          "outputs": [
            {
              "label": "Neutral-axis circumference (mm)",
              "value": 62.83185307179586
            },
            {
              "label": "Blank length including allowance (mm)",
              "value": 63.83185307179586
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2903",
      "name": "Jewelry ring resizing metal amount",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Uniform rectangular section and unchanged cross-section; signed results indicate added or removed stock. Solder, stretching, finishing loss and feasibility are not modeled.",
      "url": "/calculators/jewelry-ring-resizing-metal-amount/",
      "version": "c71554cfa4238ee0ebcc2b0a01c2f20bbebb3a3c3978bef9813dce13ecd46685",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Current ring circumference (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target ring circumference (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Rectangular section width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Rectangular section thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Supplied metal density (g/cubic cm)",
          "type": "number",
          "required": true,
          "unit": "g/cubic cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Signed stock length change (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Signed metal volume change (cubic mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Signed metal mass change (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform rectangular section and unchanged cross-section; signed results indicate added or removed stock. Solder, stretching, finishing loss and feasibility are not modeled."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Signed stock length change (mm)",
          "text": "Subtract current circumference from target."
        },
        {
          "label": "Signed metal volume change (cubic mm)",
          "text": "Multiply length change by cross-sectional area."
        },
        {
          "label": "Signed metal mass change (g)",
          "text": "Convert cubic mm to cubic cm and multiply density."
        }
      ],
      "example_questions": [
        "Use the Jewelry ring resizing metal amount calculator.",
        "Help me calculate jewelry ring resizing metal amount."
      ],
      "retrieval_phrases": [
        "Jewelry ring resizing metal amount",
        "jewelry ring resizing metal amount"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 55,
            "c": 4,
            "d": 2,
            "e": 10
          },
          "outputs": [
            {
              "label": "Signed stock length change (mm)",
              "value": 5
            },
            {
              "label": "Signed metal volume change (cubic mm)",
              "value": 40
            },
            {
              "label": "Signed metal mass change (g)",
              "value": 0.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2904",
      "name": "Jewelry wire mass by gauge",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Circular wire with uniform measured diameter; no gauge conversion is inferred. Density and price are user-supplied, and coatings/voids are excluded.",
      "url": "/calculators/jewelry-wire-mass-by-gauge/",
      "version": "d4ec530ef36ccd8f7401ee7bb46baf81cf419c0da1f03c101030f4c25a14b3c5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured wire diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Wire stock length (metres)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplied material density (g/cubic cm)",
          "type": "number",
          "required": true,
          "unit": "g/cubic cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Supplied price per gram (currency/g)",
          "type": "number",
          "required": true,
          "unit": "currency/g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Wire volume (cubic cm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Wire mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Material cost (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Circular wire with uniform measured diameter; no gauge conversion is inferred. Density and price are user-supplied, and coatings/voids are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Wire volume (cubic cm)",
          "text": "Multiply circular cross-section by length; mm² times metres equals cm³."
        },
        {
          "label": "Wire mass (g)",
          "text": "Multiply volume by density."
        },
        {
          "label": "Material cost (currency)",
          "text": "Multiply mass by supplied price."
        }
      ],
      "example_questions": [
        "Use the Jewelry wire mass by gauge calculator.",
        "Help me calculate jewelry wire mass by gauge."
      ],
      "retrieval_phrases": [
        "Jewelry wire mass by gauge",
        "jewelry wire mass by gauge"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 1,
            "c": 10,
            "d": 2
          },
          "outputs": [
            {
              "label": "Wire volume (cubic cm)",
              "value": 3.141592653589793
            },
            {
              "label": "Wire mass (g)",
              "value": 31.41592653589793
            },
            {
              "label": "Material cost (currency)",
              "value": 62.83185307179586
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2906",
      "name": "Jewelry jump ring aspect ratio",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Aspect ratio is inside diameter divided by actual wire diameter, not a gauge number. This describes geometry and does not certify strength or suitability for a weave.",
      "url": "/calculators/jewelry-jump-ring-aspect-ratio/",
      "version": "47adb09201e49d4c57a6a84b2077579fc88568580a45b717f27566fcd92c736c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Jump-ring inside diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Actual wire diameter (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Jump-ring aspect ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Outside diameter (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Aspect ratio is inside diameter divided by actual wire diameter, not a gauge number. This describes geometry and does not certify strength or suitability for a weave."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Jump-ring aspect ratio",
          "text": "Divide clear inside diameter by wire diameter."
        },
        {
          "label": "Outside diameter (mm)",
          "text": "Add a wire diameter on both sides of the inside diameter."
        }
      ],
      "example_questions": [
        "Use the Jewelry jump ring aspect ratio calculator.",
        "Help me calculate jewelry jump ring aspect ratio."
      ],
      "retrieval_phrases": [
        "Jewelry jump ring aspect ratio",
        "jewelry jump ring aspect ratio"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 6,
            "b": 1.5
          },
          "outputs": [
            {
              "label": "Jump-ring aspect ratio",
              "value": 4
            },
            {
              "label": "Outside diameter (mm)",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2908",
      "name": "Jewelry bead strand length",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Identical beads with one spacer between adjacent beads, no spacer at ends. Returns the largest whole-bead arrangement that fits the target.",
      "url": "/calculators/jewelry-bead-strand-length/",
      "version": "b85ca69ba4534fdc9959936c9f8a7b2a98401290c6feb23c150063f20aef9763",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target strand length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Uniform bead width along strand (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Spacer width between beads (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Clasp and end findings combined length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Beads that fit (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Spacers required (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Unused strand allowance (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Identical beads with one spacer between adjacent beads, no spacer at ends. Returns the largest whole-bead arrangement that fits the target."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Beads that fit (count)",
          "text": "Fit bead-plus-spacer pitches, correcting for the absent final spacer."
        },
        {
          "label": "Spacers required (count)",
          "text": "Use one fewer spacer than beads, with zero minimum."
        },
        {
          "label": "Unused strand allowance (mm)",
          "text": "Subtract the clasp, beads and internal spacers from target length."
        }
      ],
      "example_questions": [
        "Use the Jewelry bead strand length calculator.",
        "Help me calculate jewelry bead strand length."
      ],
      "retrieval_phrases": [
        "Jewelry bead strand length",
        "jewelry bead strand length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 8,
            "c": 2,
            "d": 20
          },
          "outputs": [
            {
              "label": "Beads that fit (count)",
              "value": 18
            },
            {
              "label": "Spacers required (count)",
              "value": 17
            },
            {
              "label": "Unused strand allowance (mm)",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2911",
      "name": "Jewelry gemstone parcel weight",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Unit weights are measured or supplied averages within each group. A metric carat is exactly 0.2 grams; no value or authenticity assessment.",
      "url": "/calculators/jewelry-gemstone-parcel-weight/",
      "version": "911c4bd74e452518a6e36fa57c506de1ce2ea8a07e237cbcb3210975e846ac25",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Gemstone counts by parcel group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured unit gemstone weight (carats)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Parcel carats by group",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total parcel weight (carats)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total parcel mass (grams)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Unit weights are measured or supplied averages within each group. A metric carat is exactly 0.2 grams; no value or authenticity assessment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Parcel carats by group",
          "text": "Multiply stone counts by measured unit carats."
        },
        {
          "label": "Total parcel weight (carats)",
          "text": "Sum group carat weights."
        },
        {
          "label": "Total parcel mass (grams)",
          "text": "Convert carats to grams at 0.2 grams per carat."
        }
      ],
      "example_questions": [
        "Use the Jewelry gemstone parcel weight calculator.",
        "Help me calculate jewelry gemstone parcel weight."
      ],
      "retrieval_phrases": [
        "Jewelry gemstone parcel weight",
        "jewelry gemstone parcel weight"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,3",
            "b": "0.5,2"
          },
          "outputs": [
            {
              "label": "Parcel carats by group",
              "value": "1, 6"
            },
            {
              "label": "Total parcel weight (carats)",
              "value": 7
            },
            {
              "label": "Total parcel mass (grams)",
              "value": 1.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2914",
      "name": "Jewelry prong position geometry",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Circular outline only, evenly spaced prong center points at stone radius plus chosen offset. Coordinates are geometric layout; no setting adequacy, retention or fabrication instructions.",
      "url": "/calculators/jewelry-prong-position-geometry/",
      "version": "666b7fd2c30611ffdf1f8c427a2fcfc39c6c94bd6f852adf691d6bfca075a5d1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Round stone outline radius (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Chosen radial prong offset (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Equally spaced prongs (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "First prong angle (degrees)",
          "type": "number",
          "required": true,
          "unit": "deg",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Prong center radius (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Prong x-coordinates (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Prong y-coordinates (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Circular outline only, evenly spaced prong center points at stone radius plus chosen offset. Coordinates are geometric layout; no setting adequacy, retention or fabrication instructions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Prong center radius (mm)",
          "text": "Add chosen radial offset to stone radius."
        },
        {
          "label": "Prong x-coordinates (mm)",
          "text": "Use radius times cosine at equally spaced angles."
        },
        {
          "label": "Prong y-coordinates (mm)",
          "text": "Use radius times sine at the same angles."
        }
      ],
      "example_questions": [
        "Use the Jewelry prong position geometry calculator.",
        "Help me calculate jewelry prong position geometry."
      ],
      "retrieval_phrases": [
        "Jewelry prong position geometry",
        "jewelry prong position geometry"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 1,
            "c": 4,
            "d": 0
          },
          "outputs": [
            {
              "label": "Prong center radius (mm)",
              "value": 6
            },
            {
              "label": "Prong x-coordinates (mm)",
              "value": "6, 0, -6, 0"
            },
            {
              "label": "Prong y-coordinates (mm)",
              "value": "0, 6, 0, -6"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2915",
      "name": "Jewelry precious metal alloy blend",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Two-source mass balance with no processing loss. Assays describe the same constituent; this sizes material only and gives no heating, melting or alloy-compatibility instructions.",
      "url": "/calculators/jewelry-precious-metal-alloy-blend/",
      "version": "d072a975676c880e1f942e7e4a8096dd6e6f8611af6173c94f36a08707aa591b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "First metal mass (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "First metal assay (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Second metal assay (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Target blend assay (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Second metal mass required (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total blend mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Constituent mass in blend (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Two-source mass balance with no processing loss. Assays describe the same constituent; this sizes material only and gives no heating, melting or alloy-compatibility instructions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Second metal mass required (g)",
          "text": "Solve constituent mass balance for the second source."
        },
        {
          "label": "Total blend mass (g)",
          "text": "Add first and second source masses."
        },
        {
          "label": "Constituent mass in blend (g)",
          "text": "Add the constituent mass from each source."
        }
      ],
      "example_questions": [
        "Use the Jewelry precious metal alloy blend calculator.",
        "Help me calculate jewelry precious metal alloy blend."
      ],
      "retrieval_phrases": [
        "Jewelry precious metal alloy blend",
        "jewelry precious metal alloy blend"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 50,
            "c": 100,
            "d": 75
          },
          "outputs": [
            {
              "label": "Second metal mass required (g)",
              "value": 10
            },
            {
              "label": "Total blend mass (g)",
              "value": 20
            },
            {
              "label": "Constituent mass in blend (g)",
              "value": 15
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2916",
      "name": "Jewelry scrap metal recovery value",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Scenario arithmetic using your assay, price and deduction quote. It provides no valuation, tax treatment or recommendation to transact.",
      "url": "/calculators/jewelry-scrap-metal-recovery-value/",
      "version": "725c1da4e126bab0654abe0cc17778b00b7bea9a8801908bb02360a96cd4a446",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Scrap mass (grams)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Supplied recoverable-metal assay (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Entered metal price (currency/gram)",
          "type": "number",
          "required": true,
          "unit": "currency/gram",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Refiner percentage deduction (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fixed refining charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Assayed metal content (grams)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Gross contained-metal value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Net quoted recovery value (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Scenario arithmetic using your assay, price and deduction quote. It provides no valuation, tax treatment or recommendation to transact."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Assayed metal content (grams)",
          "text": "Multiply scrap mass by supplied assay."
        },
        {
          "label": "Gross contained-metal value (currency)",
          "text": "Multiply contained metal by entered price."
        },
        {
          "label": "Net quoted recovery value (currency)",
          "text": "Apply percentage deduction and subtract fixed charge."
        }
      ],
      "example_questions": [
        "Use the Jewelry scrap metal recovery value calculator.",
        "Help me calculate jewelry scrap metal recovery value."
      ],
      "retrieval_phrases": [
        "Jewelry scrap metal recovery value",
        "jewelry scrap metal recovery value"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 80,
            "c": 2,
            "d": 10,
            "e": 5
          },
          "outputs": [
            {
              "label": "Assayed metal content (grams)",
              "value": 80
            },
            {
              "label": "Gross contained-metal value (currency)",
              "value": 160
            },
            {
              "label": "Net quoted recovery value (currency)",
              "value": 139
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2917",
      "name": "Jewelry solder purchase inventory",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Uses measured consumption and supplied solder types only; no soldering temperatures, alloy selection or safety instructions are provided.",
      "url": "/calculators/jewelry-solder-purchase-inventory/",
      "version": "6235769a6d16f097abb0e466421a4daaa7c304562af8162b4ec27e0ffc0c890a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Joint counts by solder type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured solder consumption per joint (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Available solder by type (g)",
          "type": "array",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required solder by type (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Purchase shortfall by type (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Stock remaining by type (g)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses measured consumption and supplied solder types only; no soldering temperatures, alloy selection or safety instructions are provided."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required solder by type (g)",
          "text": "Multiply joint count by measured consumption."
        },
        {
          "label": "Purchase shortfall by type (g)",
          "text": "Subtract available stock from requirements and floor at zero."
        },
        {
          "label": "Stock remaining by type (g)",
          "text": "Subtract usage from available stock and floor at zero."
        }
      ],
      "example_questions": [
        "Use the Jewelry solder purchase inventory calculator.",
        "Help me calculate jewelry solder purchase inventory."
      ],
      "retrieval_phrases": [
        "Jewelry solder purchase inventory",
        "jewelry solder purchase inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "0.1,0.2",
            "c": "0.5,5"
          },
          "outputs": [
            {
              "label": "Required solder by type (g)",
              "value": "1, 4"
            },
            {
              "label": "Purchase shortfall by type (g)",
              "value": "0.5, 0"
            },
            {
              "label": "Stock remaining by type (g)",
              "value": "0, 1"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2919",
      "name": "Jewelry casting shrinkage fit",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Uniform isotropic linear shrinkage measured from your process. This predicts dimensions only; it gives no process settings or casting instructions.",
      "url": "/calculators/jewelry-casting-shrinkage-fit/",
      "version": "aca55f10c862a15659c25367ccb49206a4a17f704b0c0a7076deb910a1fd15fe",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Wax master dimensions (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured linear process shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected cast dimensions (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Master enlargement factor for a target size",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uniform isotropic linear shrinkage measured from your process. This predicts dimensions only; it gives no process settings or casting instructions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected cast dimensions (mm)",
          "text": "Reduce each master dimension by the measured shrinkage fraction."
        },
        {
          "label": "Master enlargement factor for a target size",
          "text": "Invert the retained linear fraction."
        }
      ],
      "example_questions": [
        "Use the Jewelry casting shrinkage fit calculator.",
        "Help me calculate jewelry casting shrinkage fit."
      ],
      "retrieval_phrases": [
        "Jewelry casting shrinkage fit",
        "jewelry casting shrinkage fit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30",
            "b": 5
          },
          "outputs": [
            {
              "label": "Expected cast dimensions (mm)",
              "value": "9.5, 19, 28.5"
            },
            {
              "label": "Master enlargement factor for a target size",
              "value": 1.0526315789473684
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2920",
      "name": "Jewelry hallmark fee allocation",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "All charges are supplied quotes; no hallmarking eligibility, legal requirement or jurisdiction is inferred.",
      "url": "/calculators/jewelry-hallmark-fee-allocation/",
      "version": "5b0ea6fe8055f30ab3e8d7977f54758792ca741e5c4d9011a2a34a4b54b8e217",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Pieces in hallmark batch (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Supplied fixed batch fee (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplied assay fee per piece (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplied stamping fee per piece (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Shipping and handling for batch (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total batch charge (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Allocated cost per piece (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "All charges are supplied quotes; no hallmarking eligibility, legal requirement or jurisdiction is inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total batch charge (currency)",
          "text": "Add fixed charge, all per-piece charges and shipping."
        },
        {
          "label": "Allocated cost per piece (currency)",
          "text": "Divide complete batch cost equally among pieces."
        }
      ],
      "example_questions": [
        "Use the Jewelry hallmark fee allocation calculator.",
        "Help me calculate jewelry hallmark fee allocation."
      ],
      "retrieval_phrases": [
        "Jewelry hallmark fee allocation",
        "jewelry hallmark fee allocation"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 30,
            "c": 2,
            "d": 1,
            "e": 10
          },
          "outputs": [
            {
              "label": "Total batch charge (currency)",
              "value": 100
            },
            {
              "label": "Allocated cost per piece (currency)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2921",
      "name": "Jewelry gemstone setting labour",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Workload only, based on your measured setting times and quoted rate. No setting design, strength or adequacy is assessed.",
      "url": "/calculators/jewelry-gemstone-setting-labour/",
      "version": "1321b3a151a3517601e0a7a63a94590487ecebfd35b8483551959c6ec82526f8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Stone-setting counts by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured minutes per setting by type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Available bench hours per day",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Quoted labour rate (currency/hour)",
          "type": "number",
          "required": true,
          "unit": "currency/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total setting labour (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Bench days required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Labour quote (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Workload only, based on your measured setting times and quoted rate. No setting design, strength or adequacy is assessed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total setting labour (hours)",
          "text": "Multiply each setting count by minutes, sum and convert to hours."
        },
        {
          "label": "Bench days required",
          "text": "Divide total minutes by daily bench capacity and round up."
        },
        {
          "label": "Labour quote (currency)",
          "text": "Multiply total hours by quoted rate."
        }
      ],
      "example_questions": [
        "Use the Jewelry gemstone setting labour calculator.",
        "Help me calculate jewelry gemstone setting labour."
      ],
      "retrieval_phrases": [
        "Jewelry gemstone setting labour",
        "jewelry gemstone setting labour"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,5",
            "b": "6,12",
            "c": 2,
            "d": 30
          },
          "outputs": [
            {
              "label": "Total setting labour (hours)",
              "value": 2
            },
            {
              "label": "Bench days required",
              "value": 1
            },
            {
              "label": "Labour quote (currency)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2922",
      "name": "Jewelry polishing loss audit",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Recovered mass must be attributable to this batch and comparable in material composition. Records only an observed mass balance, not a recovery-process prescription.",
      "url": "/calculators/jewelry-polishing-loss-audit/",
      "version": "e841aa291304ce41f1ef925984a01082b1b458706566745855080066b5487de9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Mass before polishing (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Mass after polishing (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recovered matching metal dust (g)",
          "type": "number",
          "required": true,
          "unit": "g",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Observed mass removed (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unrecovered mass (g)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Piece mass loss (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Recovered share of removed mass (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Recovered mass must be attributable to this batch and comparable in material composition. Records only an observed mass balance, not a recovery-process prescription."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Observed mass removed (g)",
          "text": "Subtract final piece mass from initial mass."
        },
        {
          "label": "Unrecovered mass (g)",
          "text": "Subtract recovered material from removed mass."
        },
        {
          "label": "Piece mass loss (%)",
          "text": "Divide removed mass by initial mass."
        },
        {
          "label": "Recovered share of removed mass (%)",
          "text": "Divide recovered mass by removed mass, using zero when none was removed."
        }
      ],
      "example_questions": [
        "Use the Jewelry polishing loss audit calculator.",
        "Help me calculate jewelry polishing loss audit."
      ],
      "retrieval_phrases": [
        "Jewelry polishing loss audit",
        "jewelry polishing loss audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 95,
            "c": 3
          },
          "outputs": [
            {
              "label": "Observed mass removed (g)",
              "value": 5
            },
            {
              "label": "Unrecovered mass (g)",
              "value": 2
            },
            {
              "label": "Piece mass loss (%)",
              "value": 5
            },
            {
              "label": "Recovered share of removed mass (%)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2923",
      "name": "Jewelry repair quote worksheet",
      "category": "Jewelry and small metal crafts",
      "status": "available",
      "purpose": "Markup applies to parts plus labour; fixed service charge is added afterward. Taxes, warranty and repair feasibility are outside the quote.",
      "url": "/calculators/jewelry-repair-quote-worksheet/",
      "version": "12a27b0a47404c75a98a4f2fee888e2e67dfab25f79675e08287c4ee4446f5a8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Repair parts cost (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labour stage times (minutes)",
          "type": "array",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Labour rate (currency/hour)",
          "type": "number",
          "required": true,
          "unit": "currency/hour",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Fixed service charge (currency)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Markup on parts and labour (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Labour subtotal (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Markup amount (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total repair quote (currency)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Markup applies to parts plus labour; fixed service charge is added afterward. Taxes, warranty and repair feasibility are outside the quote."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Labour subtotal (currency)",
          "text": "Multiply total labour hours by rate."
        },
        {
          "label": "Markup amount (currency)",
          "text": "Apply supplied markup to parts and labour."
        },
        {
          "label": "Total repair quote (currency)",
          "text": "Add marked-up parts and labour plus service charge."
        }
      ],
      "example_questions": [
        "Use the Jewelry repair quote worksheet calculator.",
        "Help me calculate jewelry repair quote worksheet."
      ],
      "retrieval_phrases": [
        "Jewelry repair quote worksheet",
        "jewelry repair quote worksheet"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": "15,30",
            "c": 40,
            "d": 10,
            "e": 25
          },
          "outputs": [
            {
              "label": "Labour subtotal (currency)",
              "value": 30
            },
            {
              "label": "Markup amount (currency)",
              "value": 12.5
            },
            {
              "label": "Total repair quote (currency)",
              "value": 72.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Qualified review for equipment settings, tolerances or load implications. A geometric fit is not approval of physical safety.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2926",
      "name": "Leather belt blank length",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Fit length is measured from the buckle fold line to the selected center hole. Cut coordinates start at the buckle end of the flat blank; hardware suitability is external.",
      "url": "/calculators/leather-belt-blank-length/",
      "version": "3340486f4d32e6e1da0f6afa10e2971b1db7be9d423ab76d61d8e4c5a62516f5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Belt fit length to center hole (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Buckle fold-back allowance (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Tail beyond center hole (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Hole pitch (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Holes on each side of center (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Belt blank length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Hole positions from blank end (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Finished adjustment range (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fit length is measured from the buckle fold line to the selected center hole. Cut coordinates start at the buckle end of the flat blank; hardware suitability is external."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Belt blank length (mm)",
          "text": "Add fit, buckle fold-back and tail."
        },
        {
          "label": "Hole positions from blank end (mm)",
          "text": "Place equally spaced holes around the center position."
        },
        {
          "label": "Finished adjustment range (mm)",
          "text": "Multiply total hole intervals by pitch."
        }
      ],
      "example_questions": [
        "Use the Leather belt blank length calculator.",
        "Help me calculate leather belt blank length."
      ],
      "retrieval_phrases": [
        "Leather belt blank length",
        "leather belt blank length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 900,
            "b": 60,
            "c": 150,
            "d": 25,
            "e": 2
          },
          "outputs": [
            {
              "label": "Belt blank length (mm)",
              "value": 1110
            },
            {
              "label": "Hole positions from blank end (mm)",
              "value": "910, 935, 960, 985, 1010"
            },
            {
              "label": "Finished adjustment range (mm)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2927",
      "name": "Leather belt hole spacing",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Anchor first hole at the smallest desired fit and add equal pitches without exceeding largest fit. Reports any upper-range remainder.",
      "url": "/calculators/leather-belt-hole-spacing/",
      "version": "726323394e64db8978058f2c1db64033fc6e11cfa6937d75bb899ce320198a05",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Smallest desired belt fit (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Largest desired belt fit (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Chosen hole pitch (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hole count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Hole fit positions (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Uncovered upper fit remainder (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Anchor first hole at the smallest desired fit and add equal pitches without exceeding largest fit. Reports any upper-range remainder."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hole count",
          "text": "Count complete pitch intervals plus the anchor hole."
        },
        {
          "label": "Hole fit positions (mm)",
          "text": "Add successive pitch multiples to the anchor fit."
        },
        {
          "label": "Uncovered upper fit remainder (mm)",
          "text": "Subtract the last achievable hole fit from the requested upper fit."
        }
      ],
      "example_questions": [
        "Use the Leather belt hole spacing calculator.",
        "Help me calculate leather belt hole spacing."
      ],
      "retrieval_phrases": [
        "Leather belt hole spacing",
        "leather belt hole spacing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 800,
            "b": 900,
            "c": 25
          },
          "outputs": [
            {
              "label": "Hole count",
              "value": 5
            },
            {
              "label": "Hole fit positions (mm)",
              "value": "800, 825, 850, 875, 900"
            },
            {
              "label": "Uncovered upper fit remainder (mm)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2928",
      "name": "Leather wallet layer stack",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Counts represent the thickest closed cross-section, not the unfolded wallet. Compression is an observed uniform fraction; hardware and contents are excluded.",
      "url": "/calculators/leather-wallet-layer-stack/",
      "version": "dd722680feba3cb5f8ac0749422f3fada9ca9cd55c24e6a0f6e54150d7cd9653",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Leather layer calipers (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Layer repetitions at thickest fold",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Additional lining and adhesive total (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Measured compression (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Uncompressed closed thickness (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Estimated compressed thickness (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Counts represent the thickest closed cross-section, not the unfolded wallet. Compression is an observed uniform fraction; hardware and contents are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Uncompressed closed thickness (mm)",
          "text": "Multiply layer calipers by repeats and add lining/adhesive."
        },
        {
          "label": "Estimated compressed thickness (mm)",
          "text": "Apply supplied compression fraction."
        }
      ],
      "example_questions": [
        "Use the Leather wallet layer stack calculator.",
        "Help me calculate leather wallet layer stack."
      ],
      "retrieval_phrases": [
        "Leather wallet layer stack",
        "leather wallet layer stack"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,0.5",
            "b": "2,1,2",
            "c": 0.5,
            "d": 10
          },
          "outputs": [
            {
              "label": "Uncompressed closed thickness (mm)",
              "value": 5.5
            },
            {
              "label": "Estimated compressed thickness (mm)",
              "value": 4.95
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2929",
      "name": "Leather gusset strip development",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Full four-sided gusset around a rounded rectangle; follows the entered panel outline. Seam-end overlap adds to length, while long-edge seam allowances add only to width.",
      "url": "/calculators/leather-gusset-strip-development/",
      "version": "70e33d05afa15613ed84c454b8a1d3b36e7e052cee16b318829af31e63cdd8f4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rounded panel outer width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Rounded panel outer height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Panel corner radius (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Gusset seam-end overlap (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Finished gusset depth (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Seam allowance along each strip edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Panel perimeter (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Gusset cut length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Gusset cut width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Full four-sided gusset around a rounded rectangle; follows the entered panel outline. Seam-end overlap adds to length, while long-edge seam allowances add only to width."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Panel perimeter (mm)",
          "text": "Replace the four sharp corners with four quarter-circle arcs."
        },
        {
          "label": "Gusset cut length (mm)",
          "text": "Add seam-end overlap to perimeter."
        },
        {
          "label": "Gusset cut width (mm)",
          "text": "Add seam allowance along both long edges."
        }
      ],
      "example_questions": [
        "Use the Leather gusset strip development calculator.",
        "Help me calculate leather gusset strip development."
      ],
      "retrieval_phrases": [
        "Leather gusset strip development",
        "leather gusset strip development"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 150,
            "c": 10,
            "d": 10,
            "e": 30,
            "f": 5
          },
          "outputs": [
            {
              "label": "Panel perimeter (mm)",
              "value": 482.8318530717959
            },
            {
              "label": "Gusset cut length (mm)",
              "value": 492.8318530717959
            },
            {
              "label": "Gusset cut width (mm)",
              "value": 40
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2930",
      "name": "Leather bag seam stitch count",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Each independent seam has a hole at the start offset, then whole-pitch holes without exceeding the end offset. The final unused segment can exceed the requested end offset.",
      "url": "/calculators/leather-bag-seam-stitch-count/",
      "version": "8c449565dfa4d71e9f70259e910c70e6ae73a03abf2b51a1837fb06d763d5a3a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Seam lengths (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Stitch pitch (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Start offset (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "End offset (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Hole counts by seam",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Final hole positions from seam starts (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total stitching holes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each independent seam has a hole at the start offset, then whole-pitch holes without exceeding the end offset. The final unused segment can exceed the requested end offset."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Hole counts by seam",
          "text": "Fit complete pitches between end offsets and include the first hole."
        },
        {
          "label": "Final hole positions from seam starts (mm)",
          "text": "Add complete stitch pitches to the initial offset."
        },
        {
          "label": "Total stitching holes",
          "text": "Sum holes across independent seams."
        }
      ],
      "example_questions": [
        "Use the Leather bag seam stitch count calculator.",
        "Help me calculate leather bag seam stitch count."
      ],
      "retrieval_phrases": [
        "Leather bag seam stitch count",
        "leather bag seam stitch count"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,80",
            "b": 5,
            "c": 5,
            "d": 5
          },
          "outputs": [
            {
              "label": "Hole counts by seam",
              "value": "19, 15"
            },
            {
              "label": "Final hole positions from seam starts (mm)",
              "value": "95, 75"
            },
            {
              "label": "Total stitching holes",
              "value": 34
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2931",
      "name": "Leather saddle-stitch thread length",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "One separate thread per seam with two free needle ends. The measured multiplier must come from your leather thickness and stitch method.",
      "url": "/calculators/leather-saddle-stitch-thread-length/",
      "version": "c5f5df8383da9614961b09eac086e0f6a6e1f96b36d9c6365b00dff7159119c2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Saddle-stitched seam lengths (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured thread use per seam length (multiple)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Needle-end allowance per end (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Thread cut lengths by seam (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total thread stock (metres)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One separate thread per seam with two free needle ends. The measured multiplier must come from your leather thickness and stitch method."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Thread cut lengths by seam (mm)",
          "text": "Multiply seam length by measured use factor and add both needle ends."
        },
        {
          "label": "Total thread stock (metres)",
          "text": "Sum separate cuts and convert millimetres to metres."
        }
      ],
      "example_questions": [
        "Use the Leather saddle-stitch thread length calculator.",
        "Help me calculate leather saddle-stitch thread length."
      ],
      "retrieval_phrases": [
        "Leather saddle-stitch thread length",
        "leather saddle stitch thread length"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": 4,
            "c": 50
          },
          "outputs": [
            {
              "label": "Thread cut lengths by seam (mm)",
              "value": "500, 900"
            },
            {
              "label": "Total thread stock (metres)",
              "value": 1.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2933",
      "name": "Leather strap taper cutting",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Straight centered linear taper within a rectangular blank; this computes geometry only, without grain, stretch or load-bearing suitability.",
      "url": "/calculators/leather-strap-taper-cutting/",
      "version": "c4199fb6bd7620c2b4fa8ebb1a92be471d9b5da45b9b5c87b5da1360837cdf31",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Strap starting width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Strap ending width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Taper length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Stock blank width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Left inset at taper start (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Left inset at taper end (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Finished taper area (square mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Offcut area (square mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Straight centered linear taper within a rectangular blank; this computes geometry only, without grain, stretch or load-bearing suitability."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Left inset at taper start (mm)",
          "text": "Center starting width within blank."
        },
        {
          "label": "Left inset at taper end (mm)",
          "text": "Center ending width within blank."
        },
        {
          "label": "Finished taper area (square mm)",
          "text": "Use the trapezoid area formula."
        },
        {
          "label": "Offcut area (square mm)",
          "text": "Subtract trapezoid area from rectangular blank."
        }
      ],
      "example_questions": [
        "Use the Leather strap taper cutting calculator.",
        "Help me calculate leather strap taper cutting."
      ],
      "retrieval_phrases": [
        "Leather strap taper cutting",
        "leather strap taper cutting"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 20,
            "c": 100,
            "d": 40
          },
          "outputs": [
            {
              "label": "Left inset at taper start (mm)",
              "value": 5
            },
            {
              "label": "Left inset at taper end (mm)",
              "value": 10
            },
            {
              "label": "Finished taper area (square mm)",
              "value": 2500
            },
            {
              "label": "Offcut area (square mm)",
              "value": 1500
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2935",
      "name": "Leather edge paint consumption",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Exposed rectangular edge area is length times thickness. Coverage comes from your application test; rounded edges and absorbed product can alter consumption.",
      "url": "/calculators/leather-edge-paint-consumption/",
      "version": "1a799a337c722f0d67cfa36295b2d52c5418f63d7d83bbbfb3a40c6ef5c2816c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Leather exposed edge lengths (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Corresponding leather thicknesses (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured spread coverage (square mm/mL)",
          "type": "number",
          "required": true,
          "unit": "square mm/mL",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Edge-paint coats (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Exposed edge area (square mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Paint per coat (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total edge paint (mL)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Exposed rectangular edge area is length times thickness. Coverage comes from your application test; rounded edges and absorbed product can alter consumption."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Exposed edge area (square mm)",
          "text": "Multiply each edge length by its thickness and sum."
        },
        {
          "label": "Paint per coat (mL)",
          "text": "Divide edge area by tested coverage."
        },
        {
          "label": "Total edge paint (mL)",
          "text": "Multiply per-coat quantity by coats."
        }
      ],
      "example_questions": [
        "Use the Leather edge paint consumption calculator.",
        "Help me calculate leather edge paint consumption."
      ],
      "retrieval_phrases": [
        "Leather edge paint consumption",
        "leather edge paint consumption"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1000,2000",
            "b": "2,3",
            "c": 1000,
            "d": 2
          },
          "outputs": [
            {
              "label": "Exposed edge area (square mm)",
              "value": 8000
            },
            {
              "label": "Paint per coat (mL)",
              "value": 8
            },
            {
              "label": "Total edge paint (mL)",
              "value": 16
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2937",
      "name": "Leather rivet grip check",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Compare the uncompressed layer sum with supplier grip ranges, inclusive at both ends. Hardware strength, setting method and suitability require supplier guidance.",
      "url": "/calculators/leather-rivet-grip-check/",
      "version": "41759d63b60c5d971170c4501d891e69356b551ad95ea91afb20a301e1cfa605",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Leather layer thicknesses (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Rivet minimum grip by candidate (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Rivet maximum grip by candidate (mm)",
          "type": "array",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Layer stack thickness (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Compatible rivet candidate rows",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Compatible candidate count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compare the uncompressed layer sum with supplier grip ranges, inclusive at both ends. Hardware strength, setting method and suitability require supplier guidance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Layer stack thickness (mm)",
          "text": "Add all layers under the rivet."
        },
        {
          "label": "Compatible rivet candidate rows",
          "text": "Select grip ranges containing the stack thickness."
        },
        {
          "label": "Compatible candidate count",
          "text": "Count inclusive range matches."
        }
      ],
      "example_questions": [
        "Use the Leather rivet grip check calculator.",
        "Help me calculate leather rivet grip check."
      ],
      "retrieval_phrases": [
        "Leather rivet grip check",
        "leather rivet grip check"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,1",
            "b": "2,4,5",
            "c": "3,5,6"
          },
          "outputs": [
            {
              "label": "Layer stack thickness (mm)",
              "value": 4
            },
            {
              "label": "Compatible rivet candidate rows",
              "value": "2"
            },
            {
              "label": "Compatible candidate count",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2939",
      "name": "Leather zipper gusset fit",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Symmetric two-panel zipper gusset. The available tape attachment width on each side must accommodate your seam allowance; this is a cutting worksheet only.",
      "url": "/calculators/leather-zipper-gusset-fit/",
      "version": "6a4913ecf5a4885de1b50d8297e365cae848a68b9a39edb59d6357eec2f7e417",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Zipper tape total width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired visible zipper opening width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Panel seam allowance (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Finished opening length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "End allowance at each end (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Tape attachment width each side (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Each gusset panel cut width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Each gusset panel cut length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Symmetric two-panel zipper gusset. The available tape attachment width on each side must accommodate your seam allowance; this is a cutting worksheet only."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Tape attachment width each side (mm)",
          "text": "Subtract visible opening width and divide remaining tape equally."
        },
        {
          "label": "Each gusset panel cut width (mm)",
          "text": "Add panel seam allowance to tape attachment width."
        },
        {
          "label": "Each gusset panel cut length (mm)",
          "text": "Add allowance at both opening ends."
        }
      ],
      "example_questions": [
        "Use the Leather zipper gusset fit calculator.",
        "Help me calculate leather zipper gusset fit."
      ],
      "retrieval_phrases": [
        "Leather zipper gusset fit",
        "leather zipper gusset fit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 10,
            "c": 5,
            "d": 200,
            "e": 10
          },
          "outputs": [
            {
              "label": "Tape attachment width each side (mm)",
              "value": 10
            },
            {
              "label": "Each gusset panel cut width (mm)",
              "value": 15
            },
            {
              "label": "Each gusset panel cut length (mm)",
              "value": 220
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2940",
      "name": "Leather watch strap segment lengths",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Subtract watch and buckle contributions before splitting strap loop length. Long strap adds the supplied overlap; end-fold fabrication allowances are excluded.",
      "url": "/calculators/leather-watch-strap-segment-lengths/",
      "version": "949bf190dab8a0babacf06146d9b446ce1c36f7b4f8762eb4a877d2c7989bfdf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Target wrist loop circumference (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Watch case span along wrist (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Buckle contribution to loop (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Extra long-strap overlap (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Short-strap share of net loop (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Short strap effective length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Long strap effective length plus overlap (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total effective leather length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Subtract watch and buckle contributions before splitting strap loop length. Long strap adds the supplied overlap; end-fold fabrication allowances are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Short strap effective length (mm)",
          "text": "Apply short-strap share to circumference remaining after watch and buckle."
        },
        {
          "label": "Long strap effective length plus overlap (mm)",
          "text": "Use remaining share and add overlap."
        },
        {
          "label": "Total effective leather length (mm)",
          "text": "Add both strap segments."
        }
      ],
      "example_questions": [
        "Use the Leather watch strap segment lengths calculator.",
        "Help me calculate leather watch strap segment lengths."
      ],
      "retrieval_phrases": [
        "Leather watch strap segment lengths",
        "leather watch strap segment lengths"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 180,
            "b": 40,
            "c": 10,
            "d": 30,
            "e": 40
          },
          "outputs": [
            {
              "label": "Short strap effective length (mm)",
              "value": 52
            },
            {
              "label": "Long strap effective length plus overlap (mm)",
              "value": 108
            },
            {
              "label": "Total effective leather length (mm)",
              "value": 160
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2941",
      "name": "Leather repair patch overlap",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Supported damage outline is rectangular and patch is axis-aligned; overlap is chosen by you. No assessment of repair durability or grain compatibility.",
      "url": "/calculators/leather-repair-patch-overlap/",
      "version": "904f14f7819033e0a717d362124050dad8f33333856189dcf9ae056125f03681",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rectangular damage width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Rectangular damage height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Chosen patch overlap on each side (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable hide width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Usable hide height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Patch cut width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Patch cut height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Patch area (square mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Fits supplied hide rectangle",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supported damage outline is rectangular and patch is axis-aligned; overlap is chosen by you. No assessment of repair durability or grain compatibility."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Patch cut width (mm)",
          "text": "Extend both sides by overlap."
        },
        {
          "label": "Patch cut height (mm)",
          "text": "Extend top and bottom by overlap."
        },
        {
          "label": "Patch area (square mm)",
          "text": "Multiply cut dimensions."
        },
        {
          "label": "Fits supplied hide rectangle",
          "text": "Compare patch dimensions with usable hide."
        }
      ],
      "example_questions": [
        "Use the Leather repair patch overlap calculator.",
        "Help me calculate leather repair patch overlap."
      ],
      "retrieval_phrases": [
        "Leather repair patch overlap",
        "leather repair patch overlap"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": 30,
            "c": 10,
            "d": 100,
            "e": 80
          },
          "outputs": [
            {
              "label": "Patch cut width (mm)",
              "value": 60
            },
            {
              "label": "Patch cut height (mm)",
              "value": 50
            },
            {
              "label": "Patch area (square mm)",
              "value": 3000
            },
            {
              "label": "Fits supplied hide rectangle",
              "value": "Yes"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2942",
      "name": "Bookbinding sewing station layout",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Stations are evenly spaced including both margin endpoints. This lays out positions only; sewing method and structural suitability remain external.",
      "url": "/calculators/bookbinding-sewing-station-layout/",
      "version": "49c3f87dd514cebf22ad2e452533585179c59af7aa25ff5af7779c8000b1cca6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Textblock height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sewing stations (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 2
        },
        {
          "key": "c",
          "label": "Head margin (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Tail margin (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Station spacing (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Station positions from head (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Stations are evenly spaced including both margin endpoints. This lays out positions only; sewing method and structural suitability remain external."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Station spacing (mm)",
          "text": "Divide usable height by intervals between stations."
        },
        {
          "label": "Station positions from head (mm)",
          "text": "Start at head margin and add equal station intervals."
        }
      ],
      "example_questions": [
        "Use the Bookbinding sewing station layout calculator.",
        "Help me calculate bookbinding sewing station layout."
      ],
      "retrieval_phrases": [
        "Bookbinding sewing station layout",
        "bookbinding sewing station layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 200,
            "b": 5,
            "c": 20,
            "d": 20
          },
          "outputs": [
            {
              "label": "Station spacing (mm)",
              "value": 40
            },
            {
              "label": "Station positions from head (mm)",
              "value": "20, 60, 100, 140, 180"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2943",
      "name": "Bookbinding sewing thread inventory",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Uses a measured thread consumption factor per signature-spine height. The method factor is supplied and is not a recommendation for sewing technique.",
      "url": "/calculators/bookbinding-sewing-thread-inventory/",
      "version": "e40826045d5814fe9ccf433ca5d10c4329285fdc9f3045511e64a0a8ecea6611",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Signatures to sew (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Textblock spine height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured method thread factor (multiple)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Additional starting and finishing thread total (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Working sewing thread (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Thread cut total (metres)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a measured thread consumption factor per signature-spine height. The method factor is supplied and is not a recommendation for sewing technique."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Working sewing thread (mm)",
          "text": "Multiply signature count, spine height and measured factor."
        },
        {
          "label": "Thread cut total (metres)",
          "text": "Add starting/finishing allowance and convert mm to metres."
        }
      ],
      "example_questions": [
        "Use the Bookbinding sewing thread inventory calculator.",
        "Help me calculate bookbinding sewing thread inventory."
      ],
      "retrieval_phrases": [
        "Bookbinding sewing thread inventory",
        "bookbinding sewing thread inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 200,
            "c": 1.5,
            "d": 100
          },
          "outputs": [
            {
              "label": "Working sewing thread (mm)",
              "value": 3000
            },
            {
              "label": "Thread cut total (metres)",
              "value": 3.1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2944",
      "name": "Bookbinding board cut dimensions",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Case-binding board worksheet: board width is textblock width minus spine inset plus fore-edge square; spine strip width includes two board thicknesses. Joint gap belongs in case assembly, not board dimensions.",
      "url": "/calculators/bookbinding-board-cut-dimensions/",
      "version": "77fd16d62eb88714437078594d1fdb448d746d352c9f1c6be03bf4c63137e694",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Textblock width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Textblock height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Fore-edge and head-tail square (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Board inset from textblock spine edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Textblock spine thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Board thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Each cover board width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Each cover board height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Spine strip width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Case-binding board worksheet: board width is textblock width minus spine inset plus fore-edge square; spine strip width includes two board thicknesses. Joint gap belongs in case assembly, not board dimensions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Each cover board width (mm)",
          "text": "Subtract spine inset and add fore-edge square."
        },
        {
          "label": "Each cover board height (mm)",
          "text": "Add head and tail squares."
        },
        {
          "label": "Spine strip width (mm)",
          "text": "Add both cover board thicknesses to textblock spine thickness."
        }
      ],
      "example_questions": [
        "Use the Bookbinding board cut dimensions calculator.",
        "Help me calculate bookbinding board cut dimensions."
      ],
      "retrieval_phrases": [
        "Bookbinding board cut dimensions",
        "bookbinding board cut dimensions"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 140,
            "b": 200,
            "c": 3,
            "d": 2,
            "e": 20,
            "f": 2
          },
          "outputs": [
            {
              "label": "Each cover board width (mm)",
              "value": 141
            },
            {
              "label": "Each cover board height (mm)",
              "value": 206
            },
            {
              "label": "Spine strip width (mm)",
              "value": 24
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2945",
      "name": "Bookbinding cloth turn-in allowance",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Flat layout of two equal boards and one spine strip with two joints. Cloth turn-ins surround the entire assembly; grain and decorative pattern allowance are external.",
      "url": "/calculators/bookbinding-cloth-turn-in-allowance/",
      "version": "91acb764fdc4c89feabe7e40625a63504c7a8997b88adc9d48f92ba0351f0342",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Cover board width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cover board height (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Spine strip width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Joint gap on each side of spine (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cloth turn-in on each outside edge (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Case assembly width before turn-ins (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Cloth cut width (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cloth cut height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Cloth blank area (square mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Flat layout of two equal boards and one spine strip with two joints. Cloth turn-ins surround the entire assembly; grain and decorative pattern allowance are external."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Case assembly width before turn-ins (mm)",
          "text": "Add two boards, spine and two joints."
        },
        {
          "label": "Cloth cut width (mm)",
          "text": "Add left and right turn-ins."
        },
        {
          "label": "Cloth cut height (mm)",
          "text": "Add top and bottom turn-ins."
        },
        {
          "label": "Cloth blank area (square mm)",
          "text": "Multiply cloth cut dimensions."
        }
      ],
      "example_questions": [
        "Use the Bookbinding cloth turn-in allowance calculator.",
        "Help me calculate bookbinding cloth turn-in allowance."
      ],
      "retrieval_phrases": [
        "Bookbinding cloth turn-in allowance",
        "bookbinding cloth turn in allowance"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 140,
            "b": 200,
            "c": 20,
            "d": 6,
            "e": 15
          },
          "outputs": [
            {
              "label": "Case assembly width before turn-ins (mm)",
              "value": 312
            },
            {
              "label": "Cloth cut width (mm)",
              "value": 342
            },
            {
              "label": "Cloth cut height (mm)",
              "value": 230
            },
            {
              "label": "Cloth blank area (square mm)",
              "value": 78660
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2946",
      "name": "Bookbinding paper folding thickness",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Idealized perfect folds double layer count each time; air, fold curvature and practical folding limits are excluded. At most nine folds keeps generated layer count bounded.",
      "url": "/calculators/bookbinding-paper-folding-thickness/",
      "version": "4655ac59ee798b5e233e80dc7fff0f2e29ef33507cb1b9e63f514b3632a11db5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Paper sheet caliper (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Successive folds (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Folded sheets stacked (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Observed stack compression (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Layers per folded sheet",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Ideal uncompressed stack (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Compressed stack estimate (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Idealized perfect folds double layer count each time; air, fold curvature and practical folding limits are excluded. At most nine folds keeps generated layer count bounded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Layers per folded sheet",
          "text": "Double layer count for each fold."
        },
        {
          "label": "Ideal uncompressed stack (mm)",
          "text": "Multiply caliper, layers and sheet count."
        },
        {
          "label": "Compressed stack estimate (mm)",
          "text": "Apply your measured compression fraction."
        }
      ],
      "example_questions": [
        "Use the Bookbinding paper folding thickness calculator.",
        "Help me calculate bookbinding paper folding thickness."
      ],
      "retrieval_phrases": [
        "Bookbinding paper folding thickness",
        "bookbinding paper folding thickness"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.1,
            "b": 3,
            "c": 10,
            "d": 20
          },
          "outputs": [
            {
              "label": "Layers per folded sheet",
              "value": 8
            },
            {
              "label": "Ideal uncompressed stack (mm)",
              "value": 8
            },
            {
              "label": "Compressed stack estimate (mm)",
              "value": 6.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2947",
      "name": "Bookbinding endband thread estimate",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "One endband with two alternating colour allocations. Total stitches round up and first-colour stitches round to nearest integer; both colour threads include their own allowance.",
      "url": "/calculators/bookbinding-endband-thread-estimate/",
      "version": "fd45f7ee1a3eca7e2fdda3bf5b4567c7fb349ba5aac9a9b7f6a836e1f2491464",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Spine width (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Endband stitch pitch (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured thread use per stitch (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "First colour stitch share (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Starting-finishing allowance per colour (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Endband stitch count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "First-colour thread (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Second-colour thread (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One endband with two alternating colour allocations. Total stitches round up and first-colour stitches round to nearest integer; both colour threads include their own allowance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Endband stitch count",
          "text": "Round spine width divided by stitch pitch upward."
        },
        {
          "label": "First-colour thread (mm)",
          "text": "Allocate first-colour stitches and add its allowance."
        },
        {
          "label": "Second-colour thread (mm)",
          "text": "Use the remaining stitches and add second-colour allowance."
        }
      ],
      "example_questions": [
        "Use the Bookbinding endband thread estimate calculator.",
        "Help me calculate bookbinding endband thread estimate."
      ],
      "retrieval_phrases": [
        "Bookbinding endband thread estimate",
        "bookbinding endband thread estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 30,
            "b": 2,
            "c": 10,
            "d": 60,
            "e": 20
          },
          "outputs": [
            {
              "label": "Endband stitch count",
              "value": 15
            },
            {
              "label": "First-colour thread (mm)",
              "value": 110
            },
            {
              "label": "Second-colour thread (mm)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2948",
      "name": "Bookbinding adhesive coverage",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "Uses your tested spread amount and handling loss; no adhesive selection or archival compatibility claim. Loss is a fraction of prepared adhesive.",
      "url": "/calculators/bookbinding-adhesive-coverage/",
      "version": "f4f91cf94395dfe9caf3e513510ca612fe071963ce469bbdf16eaa274d4212f4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Bookbinding adhesive areas (square cm)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Tested wet adhesive spread (grams/square cm)",
          "type": "number",
          "required": true,
          "unit": "grams/square cm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Measured adhesive handling loss (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Adhesive reaching surfaces (grams)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Adhesive to prepare (grams)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Expected handling loss (grams)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses your tested spread amount and handling loss; no adhesive selection or archival compatibility claim. Loss is a fraction of prepared adhesive."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Adhesive reaching surfaces (grams)",
          "text": "Multiply total area by measured wet spread."
        },
        {
          "label": "Adhesive to prepare (grams)",
          "text": "Divide net surface requirement by retained fraction."
        },
        {
          "label": "Expected handling loss (grams)",
          "text": "Subtract surface requirement from prepared quantity."
        }
      ],
      "example_questions": [
        "Use the Bookbinding adhesive coverage calculator.",
        "Help me calculate bookbinding adhesive coverage."
      ],
      "retrieval_phrases": [
        "Bookbinding adhesive coverage",
        "bookbinding adhesive coverage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,200",
            "b": 0.02,
            "c": 10
          },
          "outputs": [
            {
              "label": "Adhesive reaching surfaces (grams)",
              "value": 6
            },
            {
              "label": "Adhesive to prepare (grams)",
              "value": 6.666666666666666
            },
            {
              "label": "Expected handling loss (grams)",
              "value": 0.6666666666666661
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2949",
      "name": "Bookbinding book press batch fit",
      "category": "Leatherwork and bookbinding",
      "status": "available",
      "purpose": "One board below and above the stack, plus one board between books. All books have equal thickness and fit the platen footprint; pressure suitability is not assessed.",
      "url": "/calculators/bookbinding-book-press-batch-fit/",
      "version": "8d2a6cb4bd9d626b918d2c3427052796927aec25b51a15455d262b26e5597262",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Closed book thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Pressing board thickness (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Clear press opening (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Books awaiting pressing (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Books fitting one press batch",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Press batches required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Full batch stack height (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One board below and above the stack, plus one board between books. All books have equal thickness and fit the platen footprint; pressure suitability is not assessed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Books fitting one press batch",
          "text": "Fit book-plus-intermediate-board units after reserving one outer board."
        },
        {
          "label": "Press batches required",
          "text": "Divide waiting books by stack capacity and round up."
        },
        {
          "label": "Full batch stack height (mm)",
          "text": "Add all books and one more board than books."
        }
      ],
      "example_questions": [
        "Use the Bookbinding book press batch fit calculator.",
        "Help me calculate bookbinding book press batch fit."
      ],
      "retrieval_phrases": [
        "Bookbinding book press batch fit",
        "bookbinding book press batch fit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 5,
            "c": 100,
            "d": 10
          },
          "outputs": [
            {
              "label": "Books fitting one press batch",
              "value": 3
            },
            {
              "label": "Press batches required",
              "value": 4
            },
            {
              "label": "Full batch stack height (mm)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Method and workflow review, independent reference examples, responsive browser and keyboard checks.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2977",
      "name": "Responsive tap reach distribution",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Tests supplied control center points against one rectangular user-chosen reach zone, inclusively. No universal reachability, disability or ergonomic inference is made.",
      "url": "/calculators/responsive-tap-reach-distribution/",
      "version": "4417cd0417a156c0f7e3e23c5b73c03c5f2b6f1cdf4186fc2036368a8f46ceaf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Control center x-coordinates (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Control center y-coordinates (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Viewport width (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Viewport height (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Chosen reach-zone left edge (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Chosen reach-zone top edge (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Chosen reach-zone right edge (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "h",
          "label": "Chosen reach-zone bottom edge (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Control rows inside chosen zone",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Control rows outside chosen zone",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Share inside chosen zone (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Tests supplied control center points against one rectangular user-chosen reach zone, inclusively. No universal reachability, disability or ergonomic inference is made."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Control rows inside chosen zone",
          "text": "Check both coordinates against the selected rectangle."
        },
        {
          "label": "Control rows outside chosen zone",
          "text": "List points outside any zone edge."
        },
        {
          "label": "Share inside chosen zone (%)",
          "text": "Divide included control centers by all supplied controls."
        }
      ],
      "example_questions": [
        "Use the Responsive tap reach distribution calculator.",
        "Help me calculate responsive tap reach distribution."
      ],
      "retrieval_phrases": [
        "Responsive tap reach distribution",
        "responsive tap reach distribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,80,150",
            "b": "20,80,150",
            "c": 200,
            "d": 200,
            "e": 0,
            "f": 0,
            "g": 100,
            "h": 100
          },
          "outputs": [
            {
              "label": "Control rows inside chosen zone",
              "value": "1, 2"
            },
            {
              "label": "Control rows outside chosen zone",
              "value": "3"
            },
            {
              "label": "Share inside chosen zone (%)",
              "value": 66.66666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2978",
      "name": "Keyboard focus route audit",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "IDs are user-assigned positive integers, not DOM inspection. Required IDs must be unique; repeated observed IDs are reported as revisits, and unknown IDs flag inventory gaps.",
      "url": "/calculators/keyboard-focus-route-audit/",
      "version": "37b8e35a1371b593edad38562e8b39c79151a158fb0e0b0be4395f603cad07b0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required interactive element IDs (positive integers)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observed keyboard focus traversal IDs",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required controls absent from keyboard route",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Observed IDs absent from inventory",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Repeated focus entries (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "IDs are user-assigned positive integers, not DOM inspection. Required IDs must be unique; repeated observed IDs are reported as revisits, and unknown IDs flag inventory gaps."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required controls absent from keyboard route",
          "text": "Find required IDs never observed in keyboard traversal."
        },
        {
          "label": "Observed IDs absent from inventory",
          "text": "Identify first occurrences of unlisted control IDs."
        },
        {
          "label": "Repeated focus entries (count)",
          "text": "Count repeated traversal IDs after their first occurrence."
        }
      ],
      "example_questions": [
        "Use the Keyboard focus route audit calculator.",
        "Help me calculate keyboard focus route audit."
      ],
      "retrieval_phrases": [
        "Keyboard focus route audit",
        "keyboard focus route audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3,4",
            "b": "1,3,4"
          },
          "outputs": [
            {
              "label": "Required controls absent from keyboard route",
              "value": "2"
            },
            {
              "label": "Observed IDs absent from inventory",
              "value": ""
            },
            {
              "label": "Repeated focus entries (count)",
              "value": 0
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2979",
      "name": "Form completion workload",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Conditional path membership is explicitly supplied; one pass through each included field. Times are observed task estimates, not a universal accessibility target.",
      "url": "/calculators/form-completion-workload/",
      "version": "df855fc85016a13a46f6d18519f0e982304578cec1bc207fe0fe19493a85f8dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured field-entry times (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Fields included in selected conditional path (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Navigation and submission time for path (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Included field count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Field-entry workload (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total path completion time (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Conditional path membership is explicitly supplied; one pass through each included field. Times are observed task estimates, not a universal accessibility target."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Included field count",
          "text": "Count fields marked as included."
        },
        {
          "label": "Field-entry workload (seconds)",
          "text": "Sum entry times only for fields on the selected path."
        },
        {
          "label": "Total path completion time (seconds)",
          "text": "Add path navigation and submission time."
        }
      ],
      "example_questions": [
        "Use the Form completion workload calculator.",
        "Help me calculate form completion workload."
      ],
      "retrieval_phrases": [
        "Form completion workload",
        "form completion workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30,40",
            "b": "1,1,0,1",
            "c": 15
          },
          "outputs": [
            {
              "label": "Included field count",
              "value": 3
            },
            {
              "label": "Field-entry workload (seconds)",
              "value": 70
            },
            {
              "label": "Total path completion time (seconds)",
              "value": 85
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2980",
      "name": "Form error recovery burden",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Events must be separate observed recovery episodes. Corrected fields may recur across events; counts are event workload, not unique fields.",
      "url": "/calculators/form-error-recovery-burden/",
      "version": "17a2e999fd01c6b228667f32b1b48c0d551be39ea06c8c523aa04a57f08991b1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Observed form-error recovery durations (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Corrected fields for each recovery event (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Additional interaction steps per recovery event",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Total error-recovery time (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Mean time per recovery event (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Recovery time per corrected field (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Total additional interaction steps",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Events must be separate observed recovery episodes. Corrected fields may recur across events; counts are event workload, not unique fields."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Total error-recovery time (seconds)",
          "text": "Add recorded recovery durations."
        },
        {
          "label": "Mean time per recovery event (seconds)",
          "text": "Divide total duration by event count."
        },
        {
          "label": "Recovery time per corrected field (seconds)",
          "text": "Divide total duration by corrected-field events."
        },
        {
          "label": "Total additional interaction steps",
          "text": "Add extra steps across recovery events."
        }
      ],
      "example_questions": [
        "Use the Form error recovery burden calculator.",
        "Help me calculate form error recovery burden."
      ],
      "retrieval_phrases": [
        "Form error recovery burden",
        "form error recovery burden"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "20,40,60",
            "b": "1,2,3",
            "c": "2,3,4"
          },
          "outputs": [
            {
              "label": "Total error-recovery time (seconds)",
              "value": 120
            },
            {
              "label": "Mean time per recovery event (seconds)",
              "value": 40
            },
            {
              "label": "Recovery time per corrected field (seconds)",
              "value": 20
            },
            {
              "label": "Total additional interaction steps",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2981",
      "name": "Form label coverage audit",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Inventory flags are provided by a human or external audit. The worksheet counts missing associations; it cannot judge whether names or instructions are appropriate.",
      "url": "/calculators/form-label-coverage-audit/",
      "version": "c1249e8db4149a3c657750125e8f94274fb0b106d20397d492072b6e937ad19a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Control accessible-name present (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Control requires instructions (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Instruction reference resolves (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Control rows missing accessible names",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Control rows missing required instruction association",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Controls with both recorded checks satisfied (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Inventory flags are provided by a human or external audit. The worksheet counts missing associations; it cannot judge whether names or instructions are appropriate."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Control rows missing accessible names",
          "text": "List controls whose name-present flag is zero."
        },
        {
          "label": "Control rows missing required instruction association",
          "text": "List controls requiring instructions without a resolving reference."
        },
        {
          "label": "Controls with both recorded checks satisfied (%)",
          "text": "Count named controls with any required instruction association."
        }
      ],
      "example_questions": [
        "Use the Form label coverage audit calculator.",
        "Help me calculate form label coverage audit."
      ],
      "retrieval_phrases": [
        "Form label coverage audit",
        "form label coverage audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,0,1",
            "b": "1,1,0",
            "c": "0,1,0"
          },
          "outputs": [
            {
              "label": "Control rows missing accessible names",
              "value": "2"
            },
            {
              "label": "Control rows missing required instruction association",
              "value": "1"
            },
            {
              "label": "Controls with both recorded checks satisfied (%)",
              "value": 33.333333333333336
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2982",
      "name": "Screen-reader heading structure audit",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Flags upward heading-level jumps and missing/multiple main landmarks from supplied inventory. Returning to a lower level is allowed; this is a structural review aid, not WCAG certification.",
      "url": "/calculators/screen-reader-heading-structure-audit/",
      "version": "5f8295cc9a2512fa36fb5e1f1beb24b1ad85de20824b12c4bc10e56db712d32e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Heading levels in document order (1 through 6)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Present main landmarks (count)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Heading rows skipping a deeper level",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Level-one heading count",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Main-landmark inventory status",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Flags upward heading-level jumps and missing/multiple main landmarks from supplied inventory. Returning to a lower level is allowed; this is a structural review aid, not WCAG certification."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Heading rows skipping a deeper level",
          "text": "Flag a heading more than one level deeper than the preceding heading."
        },
        {
          "label": "Level-one heading count",
          "text": "Count supplied h1 headings."
        },
        {
          "label": "Main-landmark inventory status",
          "text": "Compare main landmark count with one."
        }
      ],
      "example_questions": [
        "Use the Screen-reader heading structure audit calculator.",
        "Help me calculate screen-reader heading structure audit."
      ],
      "retrieval_phrases": [
        "Screen-reader heading structure audit",
        "screen reader heading structure audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,4,2,3",
            "b": 1
          },
          "outputs": [
            {
              "label": "Heading rows skipping a deeper level",
              "value": "3"
            },
            {
              "label": "Level-one heading count",
              "value": 1
            },
            {
              "label": "Main-landmark inventory status",
              "value": "One main landmark recorded"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2983",
      "name": "Accessible table header coverage",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Each row is one data cell after expanding any spans. Required associations are supplied by the table author; resolving IDs alone do not establish semantic correctness.",
      "url": "/calculators/accessible-table-header-coverage/",
      "version": "0ac15ea1e0e10c797f8522f60b75182275706713c1bfd59fa9185425135e89c7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required header associations per data cell (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Verified resolving header associations per cell (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Data-cell rows missing required associations",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total missing associations",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Data cells with complete recorded associations (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each row is one data cell after expanding any spans. Required associations are supplied by the table author; resolving IDs alone do not establish semantic correctness."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Data-cell rows missing required associations",
          "text": "Compare verified association counts against required counts."
        },
        {
          "label": "Total missing associations",
          "text": "Add deficits per cell."
        },
        {
          "label": "Data cells with complete recorded associations (%)",
          "text": "Divide fully associated cells by all supplied data cells."
        }
      ],
      "example_questions": [
        "Use the Accessible table header coverage calculator.",
        "Help me calculate accessible table header coverage."
      ],
      "retrieval_phrases": [
        "Accessible table header coverage",
        "accessible table header coverage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,2,1",
            "b": "2,1,0"
          },
          "outputs": [
            {
              "label": "Data-cell rows missing required associations",
              "value": "2, 3"
            },
            {
              "label": "Total missing associations",
              "value": 2
            },
            {
              "label": "Data cells with complete recorded associations (%)",
              "value": 33.333333333333336
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2984",
      "name": "Caption reading speed audit",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Word counts are supplied using a consistent counting convention. Threshold is your editorial choice; reading speed alone cannot establish caption accessibility.",
      "url": "/calculators/caption-reading-speed-audit/",
      "version": "8eb6b3c6ca0ff91419cebd30827d830d2c794c49e434466a944be577345c0680",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Caption word counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Caption display durations (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "User-chosen review threshold (words/minute)",
          "type": "number",
          "required": true,
          "unit": "words/minute",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Reading rates by caption (words/minute)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Caption rows over chosen threshold",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Duration-weighted overall reading rate (words/minute)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Word counts are supplied using a consistent counting convention. Threshold is your editorial choice; reading speed alone cannot establish caption accessibility."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Reading rates by caption (words/minute)",
          "text": "Divide each word count by display seconds and multiply by 60."
        },
        {
          "label": "Caption rows over chosen threshold",
          "text": "Select captions exceeding the supplied rate."
        },
        {
          "label": "Duration-weighted overall reading rate (words/minute)",
          "text": "Divide total words by total display time."
        }
      ],
      "example_questions": [
        "Use the Caption reading speed audit calculator.",
        "Help me calculate caption reading speed audit."
      ],
      "retrieval_phrases": [
        "Caption reading speed audit",
        "caption reading speed audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "6,10,8",
            "b": "3,4,4",
            "c": 140
          },
          "outputs": [
            {
              "label": "Reading rates by caption (words/minute)",
              "value": "120, 150, 120"
            },
            {
              "label": "Caption rows over chosen threshold",
              "value": "2"
            },
            {
              "label": "Duration-weighted overall reading rate (words/minute)",
              "value": 130.9090909090909
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2986",
      "name": "Caption timing overlap audit",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Caption starts must be ordered; adjacent caption intervals are compared. Speech segments are already matched to captions by the user.",
      "url": "/calculators/caption-timing-overlap-audit/",
      "version": "576a211ba55f7fed54ae262f33ac8278938f9e0ecd5220e9112cdf85b79fcdb4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Caption start timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Caption end timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Matching speech start timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Adjacent caption gaps, negative for overlap (seconds)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Caption start minus speech start (seconds)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Overlapping adjacent pairs (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Caption starts must be ordered; adjacent caption intervals are compared. Speech segments are already matched to captions by the user."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Adjacent caption gaps, negative for overlap (seconds)",
          "text": "Subtract preceding caption end from next caption start."
        },
        {
          "label": "Caption start minus speech start (seconds)",
          "text": "Subtract matched speech start from caption start; positive is delayed."
        },
        {
          "label": "Overlapping adjacent pairs (count)",
          "text": "Count negative gaps between adjacent captions."
        }
      ],
      "example_questions": [
        "Use the Caption timing overlap audit calculator.",
        "Help me calculate caption timing overlap audit."
      ],
      "retrieval_phrases": [
        "Caption timing overlap audit",
        "caption timing overlap audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,3,7",
            "b": "4,6,9",
            "c": "0,3.5,7"
          },
          "outputs": [
            {
              "label": "Adjacent caption gaps, negative for overlap (seconds)",
              "value": "-1, 1"
            },
            {
              "label": "Caption start minus speech start (seconds)",
              "value": "0, -0.5, 0"
            },
            {
              "label": "Overlapping adjacent pairs (count)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2987",
      "name": "Audio transcript completeness",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Reference segments are nonoverlapping; covered seconds are already unioned within each segment. Presence is measured, not transcript accuracy or equivalent meaning.",
      "url": "/calculators/audio-transcript-completeness/",
      "version": "c64d9230783af75301bfe7f85834533ebdfe4fba00bff4c4f297f3825c9e18af",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Reference audio segment durations (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Verified transcript-covered duration per segment (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Uncovered duration by segment (seconds)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Duration coverage (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Incomplete segment row numbers",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reference segments are nonoverlapping; covered seconds are already unioned within each segment. Presence is measured, not transcript accuracy or equivalent meaning."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Uncovered duration by segment (seconds)",
          "text": "Subtract verified transcript coverage from reference duration."
        },
        {
          "label": "Duration coverage (%)",
          "text": "Divide covered seconds by all reference seconds."
        },
        {
          "label": "Incomplete segment row numbers",
          "text": "Identify segments with uncovered duration."
        }
      ],
      "example_questions": [
        "Use the Audio transcript completeness calculator.",
        "Help me calculate audio transcript completeness."
      ],
      "retrieval_phrases": [
        "Audio transcript completeness",
        "audio transcript completeness"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30",
            "b": "10,15,0"
          },
          "outputs": [
            {
              "label": "Uncovered duration by segment (seconds)",
              "value": "0, 5, 30"
            },
            {
              "label": "Duration coverage (%)",
              "value": 41.666666666666664
            },
            {
              "label": "Incomplete segment row numbers",
              "value": "2, 3"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2988",
      "name": "Accessible media alternative inventory",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Add the bit values for each required/available alternative. Requirements are supplied for each asset; existence does not establish content quality or conformance.",
      "url": "/calculators/accessible-media-alternative-inventory/",
      "version": "30ee2152682d165d3df9be4235f7bfa85c44a547f51477078ba2227686dd255d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required media alternatives bitmask (captions=1, transcript=2, description=4)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Available media alternatives bitmask (same codes)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Missing alternative bitmask per media row",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Media rows with missing alternatives",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Assets with all recorded alternatives (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Add the bit values for each required/available alternative. Requirements are supplied for each asset; existence does not establish content quality or conformance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Missing alternative bitmask per media row",
          "text": "Remove available bits from each required alternatives mask."
        },
        {
          "label": "Media rows with missing alternatives",
          "text": "Select assets with at least one missing required bit."
        },
        {
          "label": "Assets with all recorded alternatives (%)",
          "text": "Divide complete recorded inventories by all assets."
        }
      ],
      "example_questions": [
        "Use the Accessible media alternative inventory calculator.",
        "Help me calculate accessible media alternative inventory."
      ],
      "retrieval_phrases": [
        "Accessible media alternative inventory",
        "accessible media alternative inventory"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,5,2",
            "b": "1,5,0"
          },
          "outputs": [
            {
              "label": "Missing alternative bitmask per media row",
              "value": "2, 0, 2"
            },
            {
              "label": "Media rows with missing alternatives",
              "value": "1, 3"
            },
            {
              "label": "Assets with all recorded alternatives (%)",
              "value": 33.333333333333336
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2989",
      "name": "Motion preference coverage audit",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Positive integer IDs represent a supplied component inventory. Verification quality and the appropriateness of reduced-motion behavior are external.",
      "url": "/calculators/motion-preference-coverage-audit/",
      "version": "fcbf86bc7958ac7f166c66f872a7d3604ac0445f3f526e153db60eff14610002",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Animated component IDs",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "IDs with verified reduced-motion variants",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Animated component IDs missing a verified variant",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Verified preference coverage (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Variant IDs without an animated inventory entry",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Positive integer IDs represent a supplied component inventory. Verification quality and the appropriateness of reduced-motion behavior are external."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Animated component IDs missing a verified variant",
          "text": "Find animated component IDs absent from the verified-variant inventory."
        },
        {
          "label": "Verified preference coverage (%)",
          "text": "Divide covered animated components by all animated components."
        },
        {
          "label": "Variant IDs without an animated inventory entry",
          "text": "Find orphan variant records."
        }
      ],
      "example_questions": [
        "Use the Motion preference coverage audit calculator.",
        "Help me calculate motion preference coverage audit."
      ],
      "retrieval_phrases": [
        "Motion preference coverage audit",
        "motion preference coverage audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3",
            "b": "1,3"
          },
          "outputs": [
            {
              "label": "Animated component IDs missing a verified variant",
              "value": "2"
            },
            {
              "label": "Verified preference coverage (%)",
              "value": 66.66666666666667
            },
            {
              "label": "Variant IDs without an animated inventory entry",
              "value": ""
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2991",
      "name": "Text zoom overflow audit",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Each row is an observed zoom condition. Content beyond bounds is reported as overflow; whether scrolling/clipping is allowed requires contextual review.",
      "url": "/calculators/text-zoom-overflow-audit/",
      "version": "a36cb75449626aae361bed3a132c039796f97b77de21cb4a32535555e3006479",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Measured container widths at zoom observations (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Measured content widths at zoom observations (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Measured container heights at zoom observations (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Measured content heights at zoom observations (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Horizontal overflow by observation (CSS pixels)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Vertical overflow by observation (CSS pixels)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Observation rows with any overflow",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each row is an observed zoom condition. Content beyond bounds is reported as overflow; whether scrolling/clipping is allowed requires contextual review."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Horizontal overflow by observation (CSS pixels)",
          "text": "Subtract container width from content width and floor at zero."
        },
        {
          "label": "Vertical overflow by observation (CSS pixels)",
          "text": "Subtract container height from content height and floor at zero."
        },
        {
          "label": "Observation rows with any overflow",
          "text": "List observations exceeding either measured bound."
        }
      ],
      "example_questions": [
        "Use the Text zoom overflow audit calculator.",
        "Help me calculate text zoom overflow audit."
      ],
      "retrieval_phrases": [
        "Text zoom overflow audit",
        "text zoom overflow audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "300,200",
            "b": "280,250",
            "c": "200,200",
            "d": "220,180"
          },
          "outputs": [
            {
              "label": "Horizontal overflow by observation (CSS pixels)",
              "value": "0, 50"
            },
            {
              "label": "Vertical overflow by observation (CSS pixels)",
              "value": "20, 0"
            },
            {
              "label": "Observation rows with any overflow",
              "value": "1, 2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2993",
      "name": "Reading line-length distribution",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Line lengths are measured using one consistent character-counting convention. Preferred range is supplied; this does not infer language, font readability or conformance.",
      "url": "/calculators/reading-line-length-distribution/",
      "version": "cda22652aab6fefb846249fe5ba3a7d3ee9d72c231ddc151e03c3c5ccedb201b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Rendered text line lengths (characters)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Preferred minimum characters per line",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Preferred maximum characters per line",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Below-range line rows",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Above-range line rows",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Mean rendered line length (characters)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Lines within preferred range (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Line lengths are measured using one consistent character-counting convention. Preferred range is supplied; this does not infer language, font readability or conformance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Below-range line rows",
          "text": "Select lines shorter than supplied minimum."
        },
        {
          "label": "Above-range line rows",
          "text": "Select lines longer than supplied maximum."
        },
        {
          "label": "Mean rendered line length (characters)",
          "text": "Average measured character counts."
        },
        {
          "label": "Lines within preferred range (%)",
          "text": "Count lines meeting both inclusive bounds."
        }
      ],
      "example_questions": [
        "Use the Reading line-length distribution calculator.",
        "Help me calculate reading line-length distribution."
      ],
      "retrieval_phrases": [
        "Reading line-length distribution",
        "reading line length distribution"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "40,60,90",
            "b": 45,
            "c": 80
          },
          "outputs": [
            {
              "label": "Below-range line rows",
              "value": "1"
            },
            {
              "label": "Above-range line rows",
              "value": "3"
            },
            {
              "label": "Mean rendered line length (characters)",
              "value": 63.333333333333336
            },
            {
              "label": "Lines within preferred range (%)",
              "value": 33.333333333333336
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2994",
      "name": "Usability navigation path efficiency",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Efficiency is shortest valid actions divided by observed actions for successful tasks only. Failed tasks remain in success rate but are excluded from path-efficiency mean.",
      "url": "/calculators/usability-navigation-path-efficiency/",
      "version": "61a17a77b6137a04395055dd3b71ec590e1d5c22b4291af2b101429856d3a499",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Observed action counts by task",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Shortest valid successful path counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Task success flags (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Excess actions by task",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Successful-task path efficiencies (%)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Mean successful path efficiency (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Observed task success (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Efficiency is shortest valid actions divided by observed actions for successful tasks only. Failed tasks remain in success rate but are excluded from path-efficiency mean."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Excess actions by task",
          "text": "Subtract shortest valid path length from observed actions."
        },
        {
          "label": "Successful-task path efficiencies (%)",
          "text": "Compute ratios for successes and label failures as excluded."
        },
        {
          "label": "Mean successful path efficiency (%)",
          "text": "Average path efficiencies over successes."
        },
        {
          "label": "Observed task success (%)",
          "text": "Divide successes by observed tasks."
        }
      ],
      "example_questions": [
        "Use the Usability navigation path efficiency calculator.",
        "Help me calculate usability navigation path efficiency."
      ],
      "retrieval_phrases": [
        "Usability navigation path efficiency",
        "usability navigation path efficiency"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,8,10",
            "b": "4,4,5",
            "c": "1,0,1"
          },
          "outputs": [
            {
              "label": "Excess actions by task",
              "value": "1, 4, 5"
            },
            {
              "label": "Successful-task path efficiencies (%)",
              "value": "80, Excluded, 50"
            },
            {
              "label": "Mean successful path efficiency (%)",
              "value": 65
            },
            {
              "label": "Observed task success (%)",
              "value": 66.66666666666667
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2995",
      "name": "Accessible document metadata coverage",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Metadata status is supplied for each document. Presence alone does not establish an accessible title, correct language, valid tags or document conformance.",
      "url": "/calculators/accessible-document-metadata-coverage/",
      "version": "9e5f712b894a6ecfd574864c6d1ecff3153b176c4d2c8e9d3769971c2a5dbdd6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Document title present (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Document language set (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Document tagging verified (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Documents missing titles (row numbers)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Documents missing language (row numbers)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Documents without verified tagging (row numbers)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Documents passing all three recorded checks (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Metadata status is supplied for each document. Presence alone does not establish an accessible title, correct language, valid tags or document conformance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Documents missing titles (row numbers)",
          "text": "List documents with absent titles."
        },
        {
          "label": "Documents missing language (row numbers)",
          "text": "List documents lacking language metadata."
        },
        {
          "label": "Documents without verified tagging (row numbers)",
          "text": "List documents without verified tags."
        },
        {
          "label": "Documents passing all three recorded checks (%)",
          "text": "Count rows with all three positive flags."
        }
      ],
      "example_questions": [
        "Use the Accessible document metadata coverage calculator.",
        "Help me calculate accessible document metadata coverage."
      ],
      "retrieval_phrases": [
        "Accessible document metadata coverage",
        "accessible document metadata coverage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,0,1",
            "b": "1,1,0",
            "c": "1,0,0"
          },
          "outputs": [
            {
              "label": "Documents missing titles (row numbers)",
              "value": "2"
            },
            {
              "label": "Documents missing language (row numbers)",
              "value": "3"
            },
            {
              "label": "Documents without verified tagging (row numbers)",
              "value": "2, 3"
            },
            {
              "label": "Documents passing all three recorded checks (%)",
              "value": 33.333333333333336
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2996",
      "name": "Accessible PDF reading-order audit",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Unique positive integer IDs represent meaningful content units. Reports supplied order differences only; it does not parse PDF tags or determine the intended semantics.",
      "url": "/calculators/accessible-pdf-reading-order-audit/",
      "version": "450250019054bbb44d4c77b09e3a228aca0e8099cbdc05aa9b38004c5ca8c97b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Expected reading order element IDs",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Observed PDF reading order element IDs",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected IDs omitted from observed order",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Unexpected observed IDs",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Pairwise order inversions (count)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Unique positive integer IDs represent meaningful content units. Reports supplied order differences only; it does not parse PDF tags or determine the intended semantics."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected IDs omitted from observed order",
          "text": "Find expected elements absent from the observed sequence."
        },
        {
          "label": "Unexpected observed IDs",
          "text": "Find observed elements absent from the expected sequence."
        },
        {
          "label": "Pairwise order inversions (count)",
          "text": "Count observed pairs reversed relative to their expected order."
        }
      ],
      "example_questions": [
        "Use the Accessible PDF reading-order audit calculator.",
        "Help me calculate accessible pdf reading-order audit."
      ],
      "retrieval_phrases": [
        "Accessible PDF reading-order audit",
        "accessible pdf reading order audit"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3,4",
            "b": "1,3,2"
          },
          "outputs": [
            {
              "label": "Expected IDs omitted from observed order",
              "value": "4"
            },
            {
              "label": "Unexpected observed IDs",
              "value": ""
            },
            {
              "label": "Pairwise order inversions (count)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2998",
      "name": "Usability time-on-task comparison",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Descriptive means include successful trials only; groups need not have equal sample sizes. No statistical significance or causal inference is reported.",
      "url": "/calculators/usability-time-on-task-comparison/",
      "version": "2adccee438ae755b39e512e60d61e1aca9c69df9b61f40db89a6a9ce6da5aa54",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Group A task durations (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Group A completion flags (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Group B task durations (seconds)",
          "type": "array",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Group B completion flags (0 or 1)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Group A mean successful time (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Group B mean successful time (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Group B minus group A mean (seconds)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Successful trial sample sizes",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Descriptive means include successful trials only; groups need not have equal sample sizes. No statistical significance or causal inference is reported."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Group A mean successful time (seconds)",
          "text": "Average durations where group A completion flag is one."
        },
        {
          "label": "Group B mean successful time (seconds)",
          "text": "Average durations where group B completion flag is one."
        },
        {
          "label": "Group B minus group A mean (seconds)",
          "text": "Subtract the successful-trial group means."
        },
        {
          "label": "Successful trial sample sizes",
          "text": "Report included count for each group."
        }
      ],
      "example_questions": [
        "Use the Usability time-on-task comparison calculator.",
        "Help me calculate usability time-on-task comparison."
      ],
      "retrieval_phrases": [
        "Usability time-on-task comparison",
        "usability time on task comparison"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30",
            "b": "1,1,0",
            "c": "15,25",
            "d": "1,1"
          },
          "outputs": [
            {
              "label": "Group A mean successful time (seconds)",
              "value": 15
            },
            {
              "label": "Group B mean successful time (seconds)",
              "value": 20
            },
            {
              "label": "Group B minus group A mean (seconds)",
              "value": 5
            },
            {
              "label": "Successful trial sample sizes",
              "value": "2, 2"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-2999",
      "name": "Usability error severity workload",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Priority score is occurrence count times chosen severity weight divided by estimated effort. Weights are subjective; this does not replace impact assessment.",
      "url": "/calculators/usability-error-severity-workload/",
      "version": "2651c92264bf3d8530b25f6436e8ddec570edf10e33656505422539a164f8cd1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Observed issue frequency counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "User-assessed severity weights",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Estimated repair effort (hours)",
          "type": "array",
          "required": true,
          "unit": "h",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weighted issue burden by row",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Priority scores per repair hour",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Priority order (issue row numbers)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Total repair effort (hours)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Priority score is occurrence count times chosen severity weight divided by estimated effort. Weights are subjective; this does not replace impact assessment."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weighted issue burden by row",
          "text": "Multiply occurrences by chosen severity weight."
        },
        {
          "label": "Priority scores per repair hour",
          "text": "Divide weighted burden by effort."
        },
        {
          "label": "Priority order (issue row numbers)",
          "text": "Sort descending score, keeping earlier row first for ties."
        },
        {
          "label": "Total repair effort (hours)",
          "text": "Sum estimated repair hours."
        }
      ],
      "example_questions": [
        "Use the Usability error severity workload calculator.",
        "Help me calculate usability error severity workload."
      ],
      "retrieval_phrases": [
        "Usability error severity workload",
        "usability error severity workload"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,2,1",
            "b": "1,3,4",
            "c": "2,3,4"
          },
          "outputs": [
            {
              "label": "Weighted issue burden by row",
              "value": "4, 6, 4"
            },
            {
              "label": "Priority scores per repair hour",
              "value": "2, 2, 1"
            },
            {
              "label": "Priority order (issue row numbers)",
              "value": "1, 2, 3"
            },
            {
              "label": "Total repair effort (hours)",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-3000",
      "name": "Design-system accessibility regression coverage",
      "category": "Accessibility and product usability measurements",
      "status": "available",
      "purpose": "Each row identifies one supplied component-state combination. Checks are counted once within rows; required inventory and test correctness are external.",
      "url": "/calculators/design-system-accessibility-regression-coverage/",
      "version": "df22da25e971c2868a640b9fdea55a65bcc38fa3221b50242458bfcbb5c93957",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Required regression checks per component-state (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Executed checks per component-state (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Failing checks per component-state (counts)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Uncovered check counts by state",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Component-state rows with failing checks",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Required checks executed (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Required checks passing (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each row identifies one supplied component-state combination. Checks are counted once within rows; required inventory and test correctness are external."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Uncovered check counts by state",
          "text": "Subtract executed checks from required checks."
        },
        {
          "label": "Component-state rows with failing checks",
          "text": "List rows with one or more failures."
        },
        {
          "label": "Required checks executed (%)",
          "text": "Divide executed checks by all required checks."
        },
        {
          "label": "Required checks passing (%)",
          "text": "Divide executed nonfailing checks by all required checks, including uncovered checks in denominator."
        }
      ],
      "example_questions": [
        "Use the Design-system accessibility regression coverage calculator.",
        "Help me calculate design-system accessibility regression coverage."
      ],
      "retrieval_phrases": [
        "Design-system accessibility regression coverage",
        "design system accessibility regression coverage"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "3,2,4",
            "b": "3,1,4",
            "c": "0,1,2"
          },
          "outputs": [
            {
              "label": "Uncovered check counts by state",
              "value": "0, 1, 0"
            },
            {
              "label": "Component-state rows with failing checks",
              "value": "2, 3"
            },
            {
              "label": "Required checks executed (%)",
              "value": 88.88888888888889
            },
            {
              "label": "Required checks passing (%)",
              "value": 55.55555555555556
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Technical review, performance bounds, privacy-aware local processing and independent reference traces.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-576",
      "name": "Musical note frequency",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "12-tone equal temperament only; reference_hz is the frequency of MIDI note 69 (A4). Valid MIDI range is 0-127.",
      "url": "/calculators/musical-note-frequency/",
      "version": "2f5a9304d266089fe0d6d195d6d77d3957e9257cda1e20f04cba9c31dd5fdcf9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "midi",
          "label": "MIDI note number (0-127)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "reference_hz",
          "label": "Reference frequency for MIDI 69 (Hz)",
          "type": "number",
          "required": true,
          "unit": "Hz",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Frequency (Hz)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Ratio to reference A4",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "12-tone equal temperament only; reference_hz is the frequency of MIDI note 69 (A4). Valid MIDI range is 0-127."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Frequency (Hz)",
          "text": "frequency_hz (Hz): reference_hz multiplied by 2^((midi-69)/12), i.e. one equal-tempered semitone step is a factor of 2^(1/12)."
        },
        {
          "label": "Ratio to reference A4",
          "text": "ratio_to_a4 (dimensionless): 2^((midi-69)/12), the frequency ratio relative to the reference note MIDI 69."
        }
      ],
      "example_questions": [
        "Use the Musical note frequency calculator.",
        "Help me calculate musical note frequency."
      ],
      "retrieval_phrases": [
        "Musical note frequency",
        "musical note frequency"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "midi": 69,
            "reference_hz": 440
          },
          "outputs": [
            {
              "label": "Frequency (Hz)",
              "value": 440
            },
            {
              "label": "Ratio to reference A4",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-578",
      "name": "Musical interval cents",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Signed interval: positive when to_hz is above from_hz, negative when below. Nearest semitone uses round-half-toward-positive-infinity.",
      "url": "/calculators/musical-interval-cents/",
      "version": "dd01f739b3e3aa3fc7ce0ed4431c7d6e287b6ce315ffd0b9ad8fa1507f7b2560",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "from_hz",
          "label": "From frequency (Hz)",
          "type": "number",
          "required": true,
          "unit": "Hz",
          "unit_status": "labelled_source"
        },
        {
          "key": "to_hz",
          "label": "To frequency (Hz)",
          "type": "number",
          "required": true,
          "unit": "Hz",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Frequency ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Interval (cents)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Nearest interval (semitones)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Signed interval: positive when to_hz is above from_hz, negative when below. Nearest semitone uses round-half-toward-positive-infinity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Frequency ratio",
          "text": "ratio (dimensionless): to_hz divided by from_hz."
        },
        {
          "label": "Interval (cents)",
          "text": "cents (cents): 1200 * log2(ratio); one octave is 1200 cents, so the value is signed by the direction of the interval."
        },
        {
          "label": "Nearest interval (semitones)",
          "text": "nearest_semitones (semitones): cents/100 rounded to the nearest integer, with halves rounded toward positive infinity."
        }
      ],
      "example_questions": [
        "Use the Musical interval cents calculator.",
        "Help me calculate musical interval cents."
      ],
      "retrieval_phrases": [
        "Musical interval cents",
        "musical interval cents"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "from_hz": 440,
            "to_hz": 660
          },
          "outputs": [
            {
              "label": "Frequency ratio",
              "value": 1.5
            },
            {
              "label": "Interval (cents)",
              "value": 701.9550008653874
            },
            {
              "label": "Nearest interval (semitones)",
              "value": 7
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-579",
      "name": "Tempo practice progression",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Stages run start, start+step, ... with the target included exactly once even when the final increment is partial. At most 1000 stages; larger schedules are rejected before allocation.",
      "url": "/calculators/tempo-practice-progression/",
      "version": "16215e51590de0420af710e8e5bdfc7ffd62c1c407890c0fc7633d954bc4b045",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "start_bpm",
          "label": "Start tempo (BPM)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "target_bpm",
          "label": "Target tempo (BPM, >= start)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "step_bpm",
          "label": "Step per stage (BPM)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "repetitions",
          "label": "Repetitions per stage",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "beats_per_repetition",
          "label": "Beats per repetition",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Practice tempo ladder (BPM)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total practice time (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Stages run start, start+step, ... with the target included exactly once even when the final increment is partial. At most 1000 stages; larger schedules are rejected before allocation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Practice tempo ladder (BPM)",
          "text": "tempos (BPM array): start plus k*step for k = 0,1,... while below target, then target appended exactly once (partial final increment allowed)."
        },
        {
          "label": "Total practice time (s)",
          "text": "total_seconds (seconds): for each stage tempo, repetitions * beats_per_repetition * 60/tempo, summed over all stages."
        }
      ],
      "example_questions": [
        "Use the Tempo practice progression calculator.",
        "Help me calculate tempo practice progression."
      ],
      "retrieval_phrases": [
        "Tempo practice progression",
        "tempo practice progression"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "start_bpm": 60,
            "target_bpm": 100,
            "step_bpm": 10,
            "repetitions": 2,
            "beats_per_repetition": 8
          },
          "outputs": [
            {
              "label": "Practice tempo ladder (BPM)",
              "value": "60, 70, 80, 90, 100"
            },
            {
              "label": "Total practice time (s)",
              "value": 61.98095238095238
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-580",
      "name": "Song duration from bars",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Three non-empty equal-length numeric arrays with at most 1000 entries; bars >= 0, beats_per_bar and bpm > 0. Each BPM describes the explicitly entered beats per bar, so compound meter needs no implicit conversion.",
      "url": "/calculators/song-duration-from-bars/",
      "version": "67eada7eb020a05243328b69ceff85921ffe442b94b84c5e85c6f9c0e61a37f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "bars",
          "label": "Bars per section (comma-separated)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "beats_per_bar",
          "label": "Beats per bar per section (comma-separated)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "bpm",
          "label": "Tempo per section (BPM, comma-separated)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Section durations (s)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total duration (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Three non-empty equal-length numeric arrays with at most 1000 entries; bars >= 0, beats_per_bar and bpm > 0. Each BPM describes the explicitly entered beats per bar, so compound meter needs no implicit conversion."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Section durations (s)",
          "text": "section_seconds (seconds array): for each section i, bars[i] * beats_per_bar[i] * 60 / bpm[i]."
        },
        {
          "label": "Total duration (s)",
          "text": "total_seconds (seconds): the sum of section_seconds."
        }
      ],
      "example_questions": [
        "Use the Song duration from bars calculator.",
        "Help me calculate song duration from bars."
      ],
      "retrieval_phrases": [
        "Song duration from bars",
        "song duration from bars"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "bars": "8,16,8",
            "beats_per_bar": "4,4,3",
            "bpm": "120,120,90"
          },
          "outputs": [
            {
              "label": "Section durations (s)",
              "value": "16, 32, 16"
            },
            {
              "label": "Total duration (s)",
              "value": 64
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-581",
      "name": "Beat subdivision duration",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "events_per_beat is an explicit equal subdivision or tuplet count relative to the BPM beat unit; it need not be an integer.",
      "url": "/calculators/beat-subdivision-duration/",
      "version": "607603c40ed85ad07c38fa80f401ca4cda83c7959adae29f0b9a8678cd8f7424",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "bpm",
          "label": "Beat tempo (BPM)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "events_per_beat",
          "label": "Events per beat (subdivision or tuplet)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Subdivision duration (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Events per minute",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "events_per_beat is an explicit equal subdivision or tuplet count relative to the BPM beat unit; it need not be an integer."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Subdivision duration (ms)",
          "text": "duration_ms (milliseconds): 60000 / (bpm * events_per_beat), the spacing between consecutive events."
        },
        {
          "label": "Events per minute",
          "text": "events_per_minute (events per minute): bpm * events_per_beat."
        }
      ],
      "example_questions": [
        "Use the Beat subdivision duration calculator.",
        "Help me calculate beat subdivision duration."
      ],
      "retrieval_phrases": [
        "Beat subdivision duration",
        "beat subdivision duration"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "bpm": 120,
            "events_per_beat": 3
          },
          "outputs": [
            {
              "label": "Subdivision duration (ms)",
              "value": 166.66666666666666
            },
            {
              "label": "Events per minute",
              "value": 360
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-582",
      "name": "Polyrhythm alignment",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "left and right are positive integers up to 1000. Positions start at zero and exclude the end of the cycle. Shared points are derived exactly from the integer rhythm counts (multiples of cycle/gcd(left,right)).",
      "url": "/calculators/polyrhythm-alignment/",
      "version": "f23d89055d10aca6892fecbb43dade3bbbbca0ff899f5a98cc43a8be580f58fc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "left",
          "label": "Left rhythm event count (1-1000)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "right",
          "label": "Right rhythm event count (1-1000)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "cycle_seconds",
          "label": "Cycle length (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Left rhythm positions (s)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Right rhythm positions (s)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Shared event positions (s)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "left and right are positive integers up to 1000. Positions start at zero and exclude the end of the cycle. Shared points are derived exactly from the integer rhythm counts (multiples of cycle/gcd(left,right))."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Left rhythm positions (s)",
          "text": "left_seconds (seconds array): i * cycle_seconds / left for i = 0..left-1."
        },
        {
          "label": "Right rhythm positions (s)",
          "text": "right_seconds (seconds array): j * cycle_seconds / right for j = 0..right-1."
        },
        {
          "label": "Shared event positions (s)",
          "text": "shared_seconds (seconds array): k * cycle_seconds / gcd(left,right) for k = 0..gcd(left,right)-1, the positions where both rhythms coincide."
        }
      ],
      "example_questions": [
        "Use the Polyrhythm alignment calculator.",
        "Help me calculate polyrhythm alignment."
      ],
      "retrieval_phrases": [
        "Polyrhythm alignment",
        "polyrhythm alignment"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "left": 3,
            "right": 4,
            "cycle_seconds": 2
          },
          "outputs": [
            {
              "label": "Left rhythm positions (s)",
              "value": "0, 0.666667, 1.333333"
            },
            {
              "label": "Right rhythm positions (s)",
              "value": "0, 0.5, 1, 1.5"
            },
            {
              "label": "Shared event positions (s)",
              "value": "0"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-583",
      "name": "Swing timing planner",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "One long-short pair occupies exactly one BPM beat; the long:short ratio need not be normalized (2:1 is triplet swing, 3:1 is a heavier swing).",
      "url": "/calculators/swing-timing-planner/",
      "version": "2032f5f5db95cdb9a807c07ad05a30c96033018d8e8a533bd48223f3687e8111",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "bpm",
          "label": "Beat tempo (BPM)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "long_parts",
          "label": "Long part (ratio numerator)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "short_parts",
          "label": "Short part (ratio denominator)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Long duration (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Short duration (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Second event offset (ms)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One long-short pair occupies exactly one BPM beat; the long:short ratio need not be normalized (2:1 is triplet swing, 3:1 is a heavier swing)."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Long duration (ms)",
          "text": "long_ms (milliseconds): (60000/bpm) * long_parts/(long_parts+short_parts), the first event duration."
        },
        {
          "label": "Short duration (ms)",
          "text": "short_ms (milliseconds): (60000/bpm) * short_parts/(long_parts+short_parts), the second event duration."
        },
        {
          "label": "Second event offset (ms)",
          "text": "second_event_ms (milliseconds): onset time of the short event, equal to long_ms after the pair start at 0."
        }
      ],
      "example_questions": [
        "Use the Swing timing planner calculator.",
        "Help me calculate swing timing planner."
      ],
      "retrieval_phrases": [
        "Swing timing planner",
        "swing timing planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "bpm": 120,
            "long_parts": 2,
            "short_parts": 1
          },
          "outputs": [
            {
              "label": "Long duration (ms)",
              "value": 333.3333333333333
            },
            {
              "label": "Short duration (ms)",
              "value": 166.66666666666666
            },
            {
              "label": "Second event offset (ms)",
              "value": 333.3333333333333
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-584",
      "name": "Tap tempo estimator",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Raw tap intervals: 3-1000 strictly increasing finite timestamps; all consecutive intervals are used with no outlier removal. The min/max range is descriptive, not statistical confidence.",
      "url": "/calculators/tap-tempo-estimator/",
      "version": "5fbe65e550206a9b412d335fc57847946da080694af6ff3aeb7e843b331a88eb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "timestamps",
          "label": "Tap timestamps in seconds (comma-separated, increasing)",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Median tap tempo (BPM)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Shortest interval (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Longest interval (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Raw tap intervals: 3-1000 strictly increasing finite timestamps; all consecutive intervals are used with no outlier removal. The min/max range is descriptive, not statistical confidence."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Median tap tempo (BPM)",
          "text": "median_bpm (BPM): each consecutive interval dt gives 60/dt; the median of those BPM values (mean of the two middle values for an even count)."
        },
        {
          "label": "Shortest interval (s)",
          "text": "min_interval_seconds (seconds): smallest consecutive tap interval."
        },
        {
          "label": "Longest interval (s)",
          "text": "max_interval_seconds (seconds): largest consecutive tap interval."
        }
      ],
      "example_questions": [
        "Use the Tap tempo estimator calculator.",
        "Help me calculate tap tempo estimator."
      ],
      "retrieval_phrases": [
        "Tap tempo estimator",
        "tap tempo estimator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "timestamps": "0,0.5,1,1.5"
          },
          "outputs": [
            {
              "label": "Median tap tempo (BPM)",
              "value": 120
            },
            {
              "label": "Shortest interval (s)",
              "value": 0.5
            },
            {
              "label": "Longest interval (s)",
              "value": 0.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-589",
      "name": "Fret position calculator",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "12-tone equal temperament, ideal fret geometry only (no compensation, camber, string stiffness or action). Distances are measured from the nut for frets 1 through frets, excluding the nut.",
      "url": "/calculators/fret-position-calculator/",
      "version": "403cca17cdc8af1686b3ab244064d35d215abf743d522e4f1a6c4adec4660d65",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "scale_mm",
          "label": "Scale length (mm)",
          "type": "number",
          "required": true,
          "unit": "mm",
          "unit_status": "labelled_source"
        },
        {
          "key": "frets",
          "label": "Number of frets (1-48)",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Nut-to-fret distances (mm)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Remaining string length (mm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "12-tone equal temperament, ideal fret geometry only (no compensation, camber, string stiffness or action). Distances are measured from the nut for frets 1 through frets, excluding the nut."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Nut-to-fret distances (mm)",
          "text": "nut_distances_mm (millimeters array): for fret n = 1..frets, scale_mm * (1 - 2^(-n/12))."
        },
        {
          "label": "Remaining string length (mm)",
          "text": "last_fret_remaining_mm (millimeters): scale_mm - nut_distances_mm[last] = scale_mm * 2^(-frets/12), the distance from the last fret to the bridge."
        }
      ],
      "example_questions": [
        "Use the Fret position calculator calculator.",
        "Help me calculate fret position calculator."
      ],
      "retrieval_phrases": [
        "Fret position calculator",
        "fret position calculator"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "scale_mm": 650,
            "frets": 22
          },
          "outputs": [
            {
              "label": "Nut-to-fret distances (mm)",
              "value": "36.481697, 70.915833, 103.41733, 134.094658, 163.0502, 190.380592, 216.177047, 240.525659, 263.507688, 285.199834, 305.674494, 325, 343.240848, 360.457917, 376.708665, 392.047329, 406.5251, 420.190296, 433.088524, 445.262829, 456.753844, 467.599917"
            },
            {
              "label": "Remaining string length (mm)",
              "value": 182.40008285027312
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-590",
      "name": "String tension estimate",
      "category": "Music and sound production",
      "status": "available",
      "purpose": "Ideal uniform flexible string under tension (Mersenne's law); not a safety or instrument setup recommendation.",
      "url": "/calculators/string-tension-estimate/",
      "version": "1819c93cf7a095eb27288e54bcfad64282b09edc79e78e718b39a01b7e00d16d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "length_m",
          "label": "Vibrating length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "frequency_hz",
          "label": "Target frequency (Hz)",
          "type": "number",
          "required": true,
          "unit": "Hz",
          "unit_status": "labelled_source"
        },
        {
          "key": "linear_density_kg_m",
          "label": "Linear density (kg/m)",
          "type": "number",
          "required": true,
          "unit": "kg/m",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ideal tension (N)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal uniform flexible string under tension (Mersenne's law); not a safety or instrument setup recommendation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ideal tension (N)",
          "text": "tension_newtons (newtons): from f = (1/(2L)) * sqrt(T/mu), solve T = 4 * mu * L^2 * f^2 with L = length_m, f = frequency_hz, mu = linear_density_kg_m."
        }
      ],
      "example_questions": [
        "Use the String tension estimate calculator.",
        "Help me calculate string tension estimate."
      ],
      "retrieval_phrases": [
        "String tension estimate",
        "string tension estimate"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "length_m": 0.65,
            "frequency_hz": 440,
            "linear_density_kg_m": 0.0005
          },
          "outputs": [
            {
              "label": "Ideal tension (N)",
              "value": 163.59200000000004
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Verified acoustic conventions, independent math references and browser checks; ideal-model assumptions remain explicit.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-604",
      "name": "Invitation response projection",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Applies your response-rate estimates to each group. Scenario adjustments are percentage points and are capped to 0–100%. Results are expectations, not guaranteed headcounts.",
      "url": "/calculators/invitation-response-projection/",
      "version": "3ff966bc9d082fac9a4e63dc2fdea31ea68f881a4da07839fc7e1cbbf6fc502a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Invitations by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Expected response rates (%)",
          "type": "array",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Low-scenario rate adjustment (percentage points)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "High-scenario rate adjustment (percentage points)",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected attendance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Low scenario",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "High scenario",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Applies your response-rate estimates to each group. Scenario adjustments are percentage points and are capped to 0–100%. Results are expectations, not guaranteed headcounts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected attendance",
          "text": "Sum invitations × expected response fraction by group."
        },
        {
          "label": "Low scenario",
          "text": "Repeat after adding the low adjustment to every rate, capped to 0–100%."
        },
        {
          "label": "High scenario",
          "text": "Repeat after adding the high adjustment to every rate, capped to 0–100%."
        }
      ],
      "example_questions": [
        "Use the Invitation response projection calculator.",
        "Help me calculate invitation response projection."
      ],
      "retrieval_phrases": [
        "Invitation response projection",
        "invitation response projection"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": "80,60",
            "c": -10,
            "d": 10
          },
          "outputs": [
            {
              "label": "Expected attendance",
              "value": 110
            },
            {
              "label": "Low scenario",
              "value": 95
            },
            {
              "label": "High scenario",
              "value": 125
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-605",
      "name": "Event registration lane planner",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "A deterministic interval model with constant processing time and all arrivals available at each interval start. It does not model random queues, breaks or lane downtime.",
      "url": "/calculators/event-registration-lane-planner/",
      "version": "3a975c9ea1af8c5e183f475213d4544af6cb87a290ea3c8719c6056e9145d306",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Arrivals by interval",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Interval length (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured processing time per guest (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Open lanes",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Capacity per interval",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Maximum projected backlog",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Final projected backlog",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Backlog by interval",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A deterministic interval model with constant processing time and all arrivals available at each interval start. It does not model random queues, breaks or lane downtime."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Capacity per interval",
          "text": "Lanes × interval seconds ÷ measured seconds per guest."
        },
        {
          "label": "Maximum projected backlog",
          "text": "Largest backlog reached while applying interval arrivals and capacity in order."
        },
        {
          "label": "Final projected backlog",
          "text": "Backlog remaining after the final interval."
        },
        {
          "label": "Backlog by interval",
          "text": "For each interval: max(0, previous backlog + arrivals − interval capacity)."
        }
      ],
      "example_questions": [
        "Use the Event registration lane planner calculator.",
        "Help me calculate event registration lane planner."
      ],
      "retrieval_phrases": [
        "Event registration lane planner",
        "event registration lane planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,80,40",
            "b": 30,
            "c": 45,
            "d": 3
          },
          "outputs": [
            {
              "label": "Capacity per interval",
              "value": 120
            },
            {
              "label": "Maximum projected backlog",
              "value": 0
            },
            {
              "label": "Final projected backlog",
              "value": 0
            },
            {
              "label": "Backlog by interval",
              "value": "0, 0, 0"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-606",
      "name": "Event check-in staffing",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Rounds staffing up independently for each interval using your measured average handling time and utilization target. It does not predict random queueing or breaks.",
      "url": "/calculators/event-check-in-staffing/",
      "version": "c14d439ab54ee57792dbf6e0c8e17384c9f0afd3157d54a5b013a3a07b5d6891",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Forecast arrivals by interval",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Interval length (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured handling time (seconds)",
          "type": "number",
          "required": true,
          "unit": "s",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Target staff utilization (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Staff by interval",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Peak staff",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Scheduled staff-hours",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rounds staffing up independently for each interval using your measured average handling time and utilization target. It does not predict random queueing or breaks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Staff by interval",
          "text": "For each interval, round up arrivals × handling seconds ÷ interval seconds ÷ utilization fraction."
        },
        {
          "label": "Peak staff",
          "text": "Maximum of the interval staffing counts."
        },
        {
          "label": "Scheduled staff-hours",
          "text": "Sum interval staff counts × interval hours."
        }
      ],
      "example_questions": [
        "Use the Event check-in staffing calculator.",
        "Help me calculate event check-in staffing."
      ],
      "retrieval_phrases": [
        "Event check-in staffing",
        "event check in staffing"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,150,80",
            "b": 30,
            "c": 60,
            "d": 80
          },
          "outputs": [
            {
              "label": "Staff by interval",
              "value": "5, 7, 4"
            },
            {
              "label": "Peak staff",
              "value": 7
            },
            {
              "label": "Scheduled staff-hours",
              "value": 8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-609",
      "name": "Wedding photography timeline",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Adds a fixed setup, a per-person photo allowance and the matching transition allowance for each group. It is a planning estimate, not a promise of shot duration.",
      "url": "/calculators/wedding-photography-timeline/",
      "version": "e1e9a768089b4b6996af9ff29237996bd944517e14ef5e74d64bde595e94cddc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "People in each group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Setup minutes per group",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Photo minutes per person",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Travel/transition minutes by group",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "e",
          "label": "Available session minutes",
          "type": "number",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Minutes by group",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Required session minutes",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Available buffer (minutes)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds a fixed setup, a per-person photo allowance and the matching transition allowance for each group. It is a planning estimate, not a promise of shot duration."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Minutes by group",
          "text": "For each group: setup minutes + people × photo minutes per person + transition minutes."
        },
        {
          "label": "Required session minutes",
          "text": "Sum all group minutes."
        },
        {
          "label": "Available buffer (minutes)",
          "text": "Available session minutes minus required minutes; a negative value indicates overrun."
        }
      ],
      "example_questions": [
        "Use the Wedding photography timeline calculator.",
        "Help me calculate wedding photography timeline."
      ],
      "retrieval_phrases": [
        "Wedding photography timeline",
        "wedding photography timeline"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "5,8,4",
            "b": 3,
            "c": 1,
            "d": "0,5,0",
            "e": 45
          },
          "outputs": [
            {
              "label": "Minutes by group",
              "value": "8, 16, 7"
            },
            {
              "label": "Required session minutes",
              "value": 31
            },
            {
              "label": "Available buffer (minutes)",
              "value": 14
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-612",
      "name": "Party drink quantity planner",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Uses only your serving assumptions. It does not recommend alcohol consumption, account for age or driving, or replace water and non-alcoholic planning.",
      "url": "/calculators/party-drink-quantity-planner/",
      "version": "15af8c4f95d50b7b1fcbfdfae4c2004f55cdc2defaba254b3ff523024261ce5f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Guests",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Servings per guest by drink type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Servings per package by drink type",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "d",
          "label": "Spare allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Planned servings by drink",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Packages by drink",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Total planned servings",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses only your serving assumptions. It does not recommend alcohol consumption, account for age or driving, or replace water and non-alcoholic planning."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Planned servings by drink",
          "text": "For each drink: round up guests × servings per guest × (1 + spare percentage/100)."
        },
        {
          "label": "Packages by drink",
          "text": "For each drink: round up planned servings ÷ servings per package."
        },
        {
          "label": "Total planned servings",
          "text": "Add planned servings across drink types."
        }
      ],
      "example_questions": [
        "Use the Party drink quantity planner calculator.",
        "Help me calculate party drink quantity planner."
      ],
      "retrieval_phrases": [
        "Party drink quantity planner",
        "party drink quantity planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 40,
            "b": "2,1,0.5",
            "c": "6,8,4",
            "d": 10
          },
          "outputs": [
            {
              "label": "Planned servings by drink",
              "value": "88, 44, 22"
            },
            {
              "label": "Packages by drink",
              "value": "15, 6, 6"
            },
            {
              "label": "Total planned servings",
              "value": 154
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-614",
      "name": "Cake tier serving planner",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Area-only estimate for round tiers of equal relevant height. Real cutting patterns, supports, tier height and unusable centre portions can reduce yield.",
      "url": "/calculators/cake-tier-serving-planner/",
      "version": "e21651327bc8fa1c15655e44920a10cdcaf8b2fb085e8e915507882e091df7a1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Round tier diameters (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Serving width (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Serving depth (cm)",
          "type": "number",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Cutting loss allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Estimated portions by tier",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Total estimated portions",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Area-only estimate for round tiers of equal relevant height. Real cutting patterns, supports, tier height and unusable centre portions can reduce yield."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Estimated portions by tier",
          "text": "For each tier, round down π × (diameter/2)² × (1−loss percentage/100) ÷ serving footprint."
        },
        {
          "label": "Total estimated portions",
          "text": "Add whole portions across tiers."
        }
      ],
      "example_questions": [
        "Use the Cake tier serving planner calculator.",
        "Help me calculate cake tier serving planner."
      ],
      "retrieval_phrases": [
        "Cake tier serving planner",
        "cake tier serving planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "30,20,10",
            "b": 2.5,
            "c": 5,
            "d": 10
          },
          "outputs": [
            {
              "label": "Estimated portions by tier",
              "value": "50, 22, 5"
            },
            {
              "label": "Total estimated portions",
              "value": 77
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-616",
      "name": "Balloon helium volume",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Models each inflated balloon as a sphere, then adds your fill/loss allowance. Manufacturer usable volume and real balloon shapes should replace nominal assumptions.",
      "url": "/calculators/balloon-helium-volume/",
      "version": "3dc1d4528b52ccb81ad5246624198d4bd5f40874e06465f767e0e91db64f135e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Spherical balloon diameters (cm)",
          "type": "array",
          "required": true,
          "unit": "cm",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Balloon counts",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "c",
          "label": "Usable helium per cylinder (m³)",
          "type": "number",
          "required": true,
          "unit": "m3",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Fill allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Adjusted helium volume (m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Adjusted helium volume (L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Cylinders required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Models each inflated balloon as a sphere, then adds your fill/loss allowance. Manufacturer usable volume and real balloon shapes should replace nominal assumptions."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Adjusted helium volume (m³)",
          "text": "For each size: count × 4/3 × π × (diameter/200)³ cubic metres."
        },
        {
          "label": "Adjusted helium volume (L)",
          "text": "Sum volumes and multiply by (1 + allowance percentage/100)."
        },
        {
          "label": "Cylinders required",
          "text": "Round up adjusted volume ÷ usable cylinder volume."
        }
      ],
      "example_questions": [
        "Use the Balloon helium volume calculator.",
        "Help me calculate balloon helium volume."
      ],
      "retrieval_phrases": [
        "Balloon helium volume",
        "balloon helium volume"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "28,45",
            "b": "30,5",
            "c": 1.8,
            "d": 10
          },
          "outputs": [
            {
              "label": "Adjusted helium volume (m³)",
              "value": 0.6417244919689898
            },
            {
              "label": "Adjusted helium volume (L)",
              "value": 641.7244919689898
            },
            {
              "label": "Cylinders required",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-617",
      "name": "Event lighting string layout",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Adds a percentage allowance to straight spans plus one lead, then adds a purchasing spare. This is length planning only; electrical loading, outdoor rating and safe support need separate checks.",
      "url": "/calculators/event-lighting-string-layout/",
      "version": "f1cbafa6b6cfd30e6c0ada0d317c8c181885b5b502ac97c422e2ae05a4739831",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Anchor-to-anchor spans (m)",
          "type": "array",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Sag allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unlit lead length (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable length per string (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Spare allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Installed route length (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Purchase length with spare (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Strings required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds a percentage allowance to straight spans plus one lead, then adds a purchasing spare. This is length planning only; electrical loading, outdoor rating and safe support need separate checks."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Installed route length (m)",
          "text": "Sum spans × (1 + sag percentage/100), then add one unlit lead."
        },
        {
          "label": "Purchase length with spare (m)",
          "text": "Multiply route length by (1 + spare percentage/100)."
        },
        {
          "label": "Strings required",
          "text": "Round up purchase length ÷ usable length per string."
        }
      ],
      "example_questions": [
        "Use the Event lighting string layout calculator.",
        "Help me calculate event lighting string layout."
      ],
      "retrieval_phrases": [
        "Event lighting string layout",
        "event lighting string layout"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "8,10,8",
            "b": 8,
            "c": 5,
            "d": 15,
            "e": 5
          },
          "outputs": [
            {
              "label": "Installed route length (m)",
              "value": 33.08
            },
            {
              "label": "Purchase length with spare (m)",
              "value": 34.734
            },
            {
              "label": "Strings required",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-619",
      "name": "Guest transport shuttle schedule",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Assumes every vehicle can complete a fixed number of identical round trips within each window and starts ready at the window opening. Loading, traffic, breaks and wheelchair capacity need separate allowances.",
      "url": "/calculators/guest-transport-shuttle-schedule/",
      "version": "11e8f16f8d4d1864f725d54180d25d20cd5a4ca0e21119b245727c53cf72b004",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Guests by departure window",
          "type": "array",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source"
        },
        {
          "key": "b",
          "label": "Vehicle passenger capacity",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Round-trip cycle time (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Departure window length (minutes)",
          "type": "number",
          "required": true,
          "unit": "min",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Trips required by window",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Vehicles required by window",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Peak vehicles required",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_4",
          "label": "Trip slots per vehicle",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes every vehicle can complete a fixed number of identical round trips within each window and starts ready at the window opening. Loading, traffic, breaks and wheelchair capacity need separate allowances."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Trips required by window",
          "text": "For each window, round up guests ÷ passenger capacity."
        },
        {
          "label": "Vehicles required by window",
          "text": "For each window, round up trips required ÷ trip slots per vehicle."
        },
        {
          "label": "Peak vehicles required",
          "text": "Largest vehicle count among the departure windows."
        },
        {
          "label": "Trip slots per vehicle",
          "text": "Round up window minutes ÷ round-trip cycle minutes."
        }
      ],
      "example_questions": [
        "Use the Guest transport shuttle schedule calculator.",
        "Help me calculate guest transport shuttle schedule."
      ],
      "retrieval_phrases": [
        "Guest transport shuttle schedule",
        "guest transport shuttle schedule"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "100,50",
            "b": 20,
            "c": 30,
            "d": 60
          },
          "outputs": [
            {
              "label": "Trips required by window",
              "value": "5, 3"
            },
            {
              "label": "Vehicles required by window",
              "value": "3, 2"
            },
            {
              "label": "Peak vehicles required",
              "value": 3
            },
            {
              "label": "Trip slots per vehicle",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    },
    {
      "id": "CC-620",
      "name": "Event parking space planner",
      "category": "Events and group planning",
      "status": "available",
      "purpose": "Conceptual double-loaded aisle module: each vehicle is allocated one bay plus half the aisle depth, then your circulation allowance. It does not certify lawful capacity or accessible-space compliance.",
      "url": "/calculators/event-parking-space-planner/",
      "version": "69b7a8a58f28b511ec3da4596b22925beff2f20a6c68a8cd8b8ed9ef8be33aac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": true,
      "contract_status": "labelled_form_adapter",
      "inputs": [
        {
          "key": "a",
          "label": "Vehicles",
          "type": "integer",
          "required": true,
          "unit": "as-labelled",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bay width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Bay depth (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Shared aisle width (m)",
          "type": "number",
          "required": true,
          "unit": "m",
          "unit_status": "labelled_source",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional circulation allowance (%)",
          "type": "number",
          "required": true,
          "unit": "percent",
          "unit_status": "labelled_source",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Module area per vehicle (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Base parking module area (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Conceptual area with circulation (m²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Conceptual double-loaded aisle module: each vehicle is allocated one bay plus half the aisle depth, then your circulation allowance. It does not certify lawful capacity or accessible-space compliance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and original calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Module area per vehicle (m²)",
          "text": "Area per vehicle = bay width × (bay depth + aisle width/2)."
        },
        {
          "label": "Base parking module area (m²)",
          "text": "Base area = vehicles × area per vehicle."
        },
        {
          "label": "Conceptual area with circulation (m²)",
          "text": "Conceptual area = base area × (1 + circulation percentage/100)."
        }
      ],
      "example_questions": [
        "Use the Event parking space planner calculator.",
        "Help me calculate event parking space planner."
      ],
      "retrieval_phrases": [
        "Event parking space planner",
        "event parking space planner"
      ],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 2.5,
            "c": 5,
            "d": 6,
            "e": 15
          },
          "outputs": [
            {
              "label": "Module area per vehicle (m²)",
              "value": 20
            },
            {
              "label": "Base parking module area (m²)",
              "value": 2000
            },
            {
              "label": "Conceptual area with circulation (m²)",
              "value": 2300
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Check event assumptions and discrete packing; geometry tools do not certify lawful venue capacity.",
        "evidence_url": "/quality-report.json"
      },
      "adapter_kind": "catalogue",
      "unit_policy": "Copy values in the units and format printed on the input labels. No conversions or guessed units.",
      "special": null,
      "finder_supported": true
    }
  ]
}
