{
  "schema_version": "1.0.0",
  "registry_version": "c43da5662050e1c0fb3476171aa4ba7e23aaad5486cb9ee29cbd07c226d47b0b",
  "counts": {
    "planned": 1890,
    "available": 1010,
    "review_hold": 100,
    "executable": 50
  },
  "execution_policy": {
    "scope": "50-tool execution adapter; optional GPT-6 Luna question interpretation",
    "missing_inputs": "ask; never substitute example defaults",
    "unit_conversion": "none; require explicit matching units",
    "chaining": "not enabled; empty tool_dependencies do not imply compatible units",
    "unqualified_tools": "discoverable in registry; execution denied"
  },
  "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "b74f81c86a21b5f2c82f39fc25b13bfcb9b967d90db87d1519ab43db995d8212",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original percentage",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New percentage",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "4d4b9c2871127842adf1428fd005ddf065149f4ebe15de9277d27e64ec03956a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Individual item totals (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Shared charges (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Tip (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "50490ca384ffc5778f6544d0680a22943c5d2b36bf974fcee9111b857a16c72c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total to allocate",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6760dea08f38184d525737c0e97f7d44de7a94da23f30877f9cfc55b5e885f6e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Positive integer ratio terms",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a506851532819d9d6c62ec7c6ca2a3deb80c14edd6dd4c082ded8e669b745562",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Ratio terms",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Total quantity",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "544467935b22aeb67ae66f0f2d5ba782d5a3ecbcab3a0356571f27abc8de2847",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First numerator",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "First denominator",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Second numerator",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Second denominator",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Operation (+, -, *, /)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4fa7d0ebcb2bb6eed3ffae2c056743541fa951e06fa98b4a9a36eb3ca6f43c9b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Whole part",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Numerator",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Denominator",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "88ad3b24cdd2273442e8fe22653a610a1b2edeebcd4192b655d7ef17000b5f84",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Finite decimal",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9486ced0692e4d396c33f80cc96d13c2cd3711f5355af5a25ef92dcf6c329ec7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "00d5e74806d0c51e71f78c4d2e3913f3954961588eabd72a345c8dacc12cd325",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "One name per line",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7d3e9d8fc2a498b16aab1fe52b57516e656d216c2fbe9260fd69c8e5ff85305d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Expression",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1b1c8f9b6d82216e24246fff44454d4f1886d5bd3437ab29e393eb4f781be17e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cash paid (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "033e89d5c330b5247a1b88d594e4c84c0b77edf33592981a47b80016156f0119",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Amounts paid (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Amounts owed (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "d1bdbb63d9a797003326ab90ce7d45a4e6e20d76de23f4ac0dfa79a1d74a1f31",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting balance (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly deposit (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Annual rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "548dc9b19ff5d4199657f358ae5f7be7f118b20a927d90516918924991b68598",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Payment per period (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rate per period (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Number of payments",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "a9db4e3d4b3313dee4fbbe462234003505debcc69f0756f3f4ef53702d821c31",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Income (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Category percentages",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "bdb7fb069501a0b1a38ac62b631cf1c35f5eb08dbba249bfe357935a798efab0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cash (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly income (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly expenses (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d31fc88fbfd79f245b71b17e6f68cc110180d97af58d2c5d841b82bb373cd695",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal return (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Inflation (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "421ad4c287ea294d46807690d8cc3afb4a530b430e4f4f8d24a8f3e0fb3e15bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Holding value (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Assumed annual yield (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Payments per year",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9d0cfa42852743f748eb49917efd7c0d2ec1ae11e796d9d9a8fc5c71c1e8a783",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Portfolio total (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target weights (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3933247e17e59512ac49f05d08d68cc13a5a4392d7274422732d4839e159c9c4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Source amount",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Exchange rate (target per source)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fee (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Fixed fee in source currency",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "92992308e7097bea2d50e757e290ef54acad48ed5c4a4304b409d83254350478",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Foreign price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Exchange rate (home per foreign)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Delivery in home currency",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other entered charges",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Local price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9ea678ea625484808de696f31919215d3d85a2fd1368229310cb7455128d4033",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current annual study cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cost growth (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Years until start",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Years of study",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Already saved (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "523a0347e4d12d440254f98ff9c5f70c0b4fd17c93fc720dc86c74bec4338595",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting fund (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Initial annual withdrawal (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual return (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Annual withdrawal inflation (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Horizon years",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "534222ad7c43fac6ee1ef173af4c56dc22baa94228c36c4f8b1ac31d48dbd5dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Original term (months)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Extra monthly payment (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f90a203946ac3167010f1a8249db6f3cd32771dced7f925be6c75d15a05743ce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Affordable monthly payment (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Nominal annual rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Term in months",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fe12de9d36430a29c9500005f2547e25d0378d2054cc197d8aef52b2eff9090c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Existing balance (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Old annual rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Old months remaining",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "New rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "New term months",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Refinance fees (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3b5687a636d25b1999ab3c5261e96d0c26dd02c02e9f39cf3f8d80ebd5515fbd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual flat rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual reducing-balance rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Term in years",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "683c5716533a35b66841e127c0ceda86ffaeb3aba2178afc9531be2313d2a983",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual nominal rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Months",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Final balloon (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1ae9d6223feec0dc7fc8f912448ae8d543992caa4b7106b79d04e89d26f7dd94",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Principal (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Years",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "190cc179133d2df98a0b595510c3715dce99b4ddffa26839a08990b0338e1e2a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Card balance (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual nominal rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly payment (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "New monthly spending (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b939a0e2483dc96422d371920ddfe48e45eadb82cf610a7877d255e38de712e4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Balances (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Annual rates (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Minimum monthly payments (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Extra monthly budget (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "400c14eb5cda6426aaae0fab87ed34906b9b3bf8144c5c91ca94cf7777e417af",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Balances (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Annual rates (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Minimum monthly payments (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Extra monthly budget (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "1eabe80ea7aa63dd850f92ebf396ac11d59ada0c21df71a374ef5b928f76eae5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Loan (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Standard rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reduced rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Months",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Points cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3395ca9d443f8b88861485f0eb8e4e9ddf928e4271d24cd211c7094eaa361d89",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly rent (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly ownership cash costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Upfront ownership costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Years",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Expected equity recovered (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0f650c923c1592d08be4ed6b9a097de90de7bc89df57aad81ba20e47b16af16f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Property price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Annual rent (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "27781b0aef2a3bd7d3b7752f11acc234698840f9ac1b9047f414f4990e255ee9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total property cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Annual rent (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual operating costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7df8afe61d5ce749a5164f0ec3685d41507982a352d6111052eb53d96e063963",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly rent (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly operating costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly loan payments (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "87bc58372cdcc3b9b14a69c238f2be2aa451c21992a98b6bacf6b7670b2802c3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual net operating income (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Property value (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e856975bd8b26472382d786985773d628a44cbb8114bf77689d6fe10160eeebb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual pre-tax cash flow (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Cash invested (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "12d593b6f56b187102f3619ca0f7618664a6d793bf86740e6dff0688672ee151",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly rent (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Occupied months",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Extra vacancy costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bc4341faf69368cb9c77ef6bc53faa42a198100fbd347be3e5f651bcad91c3ca",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Deposit (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Entered closing fees and taxes (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4e5b2a0d26a295e9a48ced6a782741ebdbcbbd96c27cf1c895bc7abe41836a50",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Property value (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Secured loan balances (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a1be921fe47915e2f7e7989288264faf948616fe5099732a86e7e925dde55eb3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Lease upfront (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Lease monthly (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Months",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Finance upfront (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Finance monthly (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Net equity at end (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "98c6899fbc7970fd9612513984287a3d6d697fd9667d52189b6f37d12b005374",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Outstanding balance (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Accrued interest (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Settlement charges (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "846c90ba79bb3d61a8d1a9e065c059502d52b44fbb41288987404af390ec9a75",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target margin (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "7880b4e2db100db9a67dc4713a8a30a675fb5d8b040b57abee5c685f35d9c577",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unit price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit variable cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Units sold",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3c4a1747b8ee8c8c87781c7e476940de735f9f6ed83b89609b0ab5315a2b7f28",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Standard price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Discounted price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unit cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Original units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "9194bfc32b9b2e137bfb4933f44d76e9b7ceb44f8e2296a2cb99763cd72fbe2c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual income target (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Available hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Billable share (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1d5cfbe2e45fb2fa6c7e1bfafecc68845e3bcc00dfbbbd55e9ca73d5dfebc0db",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Project fee (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labour hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hourly cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f2732f63d3344f29c2b4e9116c6bd9a5dd743812ff9cd3cafc4e7fab5e61b505",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual pay (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual benefits and employer costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Productive annual hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8b093112fd2bcd3368bfbbad9ce1cddbc5f64a4bc7803f56039ece63e7a2b9a8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Headcount",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual pay each (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Extra employer cost (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "18faf151ca09813b93ffb0466faa7a9098248ab5020b15b0c5ddf54b17c9c54b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual cost of goods sold (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Average inventory at cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "af3f0ed1e7f70a389aa03713a5b4cb8f67f691e3fa04ba69f60eb2aebde14719",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Average daily demand",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Lead time (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Safety stock",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "64020f13a5c61239904699e3d9af40ce9c7d837784502a3cf0057a4c2ad92109",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual unit demand",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cost per order (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual holding cost per unit (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "aaa841220bf1132c54079822f42c67a802b1155bbb0e0da0eb1cffbe3fe087e5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Daily demand standard deviation",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Lead time (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Service z-score",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c02181352d3a200ce8f3a0da1b898ca509539ff8f4686c519a2b61d0b91b8e20",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Units on hand",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected daily sales",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c04521784e86b1ab926a9365edbfecd5f4e1552b683a9ff99672b7ffa058a09d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Actual output",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Available capacity",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2333b3b668447bff636c25ce90f3279c67226ba03b7b17538795cadb907a5c25",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Output units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labour hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d2046f998cc3fd6aebb06efaef2bbdd0e2e6e9ea1a36e2882da1873c592944e5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Planned minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Run minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Ideal cycle (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Good units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9caa7d19f7d650cc1ff3af6242b30bfd7c843ce12008982c696ad07ba1c8dc90",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current assets (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current liabilities (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "70483adf9fd41b3807eb0b236466fc9135d9aec059176fa6997d0e950278ebfb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Inventory days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Receivable days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Payable days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "00e33a2c631319bc2898e54443c1b3a860d0ba77187a942b9daac303fa24b362",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unpaid balance (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Entered annual charge rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overdue days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Fixed charge (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ae9272af0a5940713f3c0b149347f92074d3e0bb9fb9dbbca1197562f3e9632b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unit prices (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Unit costs (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Mix weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Fixed costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2fa4f8c91986a9be5650cfea57c500a591cc2f3592c1450c99caeedf853d6794",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Internal fixed cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Internal unit cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplier fixed fee (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplier unit cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "2e9932d326fd97feadf02580a329bd897740d3637447c5464d46cdf496950955",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Acquisition spend (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New customers",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "25a26a79a6ef61d791016b46cce8c9e6d61adebc020e18812db73f045c26fc9a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Order value (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Purchases per year",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Gross margin (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retention years",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "07e2ed9894fe1d16b7cba19b15fe69935e30d5883fe155d064c653b7ee64a401",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Lifetime contribution (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Acquisition cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "004ddc9aaa69c4e9c4c7c8820a4c4c6f05400f93440c20238d2be7d7c19a9d6a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Acquisition cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Monthly customer contribution (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ff44d872609ce11823135433b65ae4f2ec15ebcfd2f0b45e3e7be37dcfa9bb4d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Revenue (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Orders",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fd5db908fb9f9958da97e49c3798621b9c371a1dcd54f84faf07ae16287feb45",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Created carts",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Completed orders",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e04f81abd606d34f57a36d988f378d33f211cb34f821d73bd0e45befb49a9ab8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting traffic",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Stage conversion rates (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Order value (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1ae9b2d1674e41ac574232b2b7c0e74ebcb492371664da404c58d0473dacea41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Delivered emails",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Unique opens",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unique clicks",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Bounces",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dc6d685bf9308ba907329e766de637a3361cb57b699185ab8b4491dfa2402fa2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting customers",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Customers lost",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e6477ed55ff6df3f59373a90eb7e65892a209604edd1b65a4498b39b0c87f226",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting recurring revenue (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Expansion (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Contraction (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Churned revenue (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "cc4b28b9f18327da136dd6d92d3981c567742f70d6f627b9555046fca96300f5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Subscriber counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Monthly plan prices (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3851ea45471f9f86956b728693ebdcc698a2a676b42aa155e722413dc852835b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Revenue (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visitors",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8dece143d5def6e784b4ba15e04721429f6aa217b63a96f2adbb28f48dcf84d4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Revenue target (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Order value (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Conversion rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Cost per click (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "18c73fb309752935d4aae58b0339a8bb3d7505316ef0930c3ba39e069511eb86",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Visits",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Outbound click rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Retailer conversion (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Basket value (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Commission (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "94b87ed0769d79d7fe7dd00877014acc44ff81dc53d40dfa0ee1a22e77f54e45",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unit sale price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Percentage fee (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total fixed fees (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Refunds (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Shipping costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "616f8cebcb6b15b3204ec0317ecd0fe438a6754297c4740cad86e7a1326153d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Transaction amounts (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Percentage fee (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fixed fee per transaction (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2bf6106245227766fbbeae4f3b141bd36337548365d26ae63ed0f76cb12d035d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gross margin (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Shipping cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Desired retained contribution (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c1a91c5770bf8c2a3ab9bd47b43af02ac11a211b104a7ee6730c403c9b30cb9b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total budget (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Spent (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Total campaign days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Elapsed days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "be476c976c0d3cf34ba99458606ca4b509b5f5469d53259f01a657401e34131a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Start date (YYYY-MM-DD)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "End date (YYYY-MM-DD)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0aa4805105fa9c6023ebbf4ef215014c43ad65ec22a25b9ae985f51f8a5939d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Start date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Months to add",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Days to add",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "52e9c37895de8a5baee30ae123cee460d16b73ca8d2e3825c91b3f7ae1a5a094",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Start date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "End date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Holidays, comma-separated or none",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "86435801ad39ab2a547ae4a0166fb1a237009feed3f24e009fad7f4022250c12",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Start date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Working days to add",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Holidays, comma-separated or none",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a90bb63fea9876449766eacfa46eb32c6aa8198376db1f62b23f1563b3bca615",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Date of birth",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Reference date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6be947e0d02399ccd1880fa83aaaf77de1b3696a7b2c577ba6fda7f9d9e23d59",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Start time (HH:MM)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "End time (HH:MM)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b3bfe8e1feeb1d11647d33fef6a963c363fa7c78179b67377803004fff11c48f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Durations in minutes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a975d5c6f455ca28cfe0826f5cf7b6140112ed20e04ae955ea113650b44ee3f4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Decimal hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c32f876fb2218990103c13c351dcf470aaf53ff8b789d7834050c222efc1fa07",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Daily start,end,break-minutes (one day per line)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "967ef3f6cae3cc9e7c901dbba9df5e18b7d23d2bc1cbaa7f3418ca8b1080b7a4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hourly rate (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overtime starts after hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Overtime multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "13f8167a45161a2f5af7639a2e8970e7b3e62bd199ffd77871996b1b3d853397",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Shift intervals in HH:MM-HH:MM, one per line",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "18122844f2b2548d82d797bf6b8cba750fd9068caa205593766419d7ea30aea2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Meeting date (UTC day)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "IANA time zone A",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "IANA time zone B",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Start work hour",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "End work hour",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d5bbb76c397a20d55eb3755537e0b30ce66041f1e155185c1c843dc6892e0b0e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "From timestamp with offset",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target timestamp with offset",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c75b305ac2a6922f29c7482b6f1f43a758598afc792d4cf29bb7fcc7bb08e41a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Interval in days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Occurrences",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "60942ca0e386682dd03673fa41eaeb5f2b6d6038a19a733414cc1b6add33040b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "86a21f7066b27c981b5d70abb777d87cf3a5daae2583c519285399921a045d84",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "From date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Deadline date",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Leave and holidays, comma-separated or none",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "329c3d42ee4e7fba252692f3a1d266fad7dedbd9b4d1220a74daccfe3f11232d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting leave (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Accrual per month (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Months accrued",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Leave taken (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2ecd970df9a2226e1a1dbaf331255f16561406adfb147d057c0a4e3f84102569",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Task effort (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "People",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Productive hours per person per day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e8164e3943a4bc06e1a85d643fbc9e77cfd304e340e9be342d6c24195b48ba33",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Optimistic duration",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Most likely duration",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pessimistic duration",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "285b1f21042dd0c77d49cc6871025366bd9c6ff5d4b4ee3606d171e76baefa09",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tasks: ID,duration,dependencies separated by spaces (one per line)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bbbd30859c37aa342bc304dd434ab948c92123484f0d12b9020cdc1d3b29db96",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Focus blocks",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Focus minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Short break minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Long break minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Blocks per long break",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "614033b0712f16ec550d33f80a27d8816ccd364181d81e9da49f463e4203e102",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Word count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Reading words per minute",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3ada61e614cd7f5e9808666fb9c057588e2187be323f2b9d16c4438b71abf5ae",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Word count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Speaking words per minute",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Pause minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "678d32dca0556fb27326c8aca094429ab8c492be34dba77928db2f9166be8322",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Word count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Typing words per minute",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Correction allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "262062f6d134e705508811b946fa73ed7c6b171ee4157d1adc985b0a490a55a1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Remaining work (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Working days left",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Daily hours per person",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "People",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "eab0d9d7dd9b1ea2e49e296ad7ed68e9c78d6f7afa7ffd4c2d6c2cb1d69e0982",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Wall run (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Wall height (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Roll width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Roll length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Pattern repeat (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1d14097ee4bcc77a0a6051331ea42e5d448b24e44328b04203e903de62e76e6b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Slab length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "38564ff022d3d8894a125f5c3c3aaa7cbd16e6ccea77c7c46258e47559f72fbb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tile width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tile height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Joint width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Joint depth (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Grout density (kg/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "3de68ceaceba48dca9d10e0b04bf16a6ec0f82ea001257e9b3742d2fbdbdefca",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Room perimeter (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Door openings (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Stock length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a0fcf56b394ef22267f30c774b4acdabf831dc530db51eb9a136d197769763af",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Room length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Excluded run (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Stock length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2d6318fc775ae07b43de980f27748bd48d15d8f7dc741967b2eb818abd941c7b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Roof plane width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Plane slope length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Effective sheet cover width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Effective cover length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "95c9be6f03a1b523b46d48a7cfd00da4a877e76613d0e253e3c159425838d0ac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gutter runs (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Stock length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c8f6121e46c5d4af63fd2ae1650b37192399264f2ba3507138705650d7f21e0f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Pack coverage (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Layers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4528bd83e2145099988ac94d46fa389670a8922d22d50d53d86ff7c2b85eca91",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Wall area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Openings (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sheet area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bb55717790c3ec4bfd1c3c392a921efec576774aba08108ee0d9394d67d4b3c7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Net wall area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Brick face width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Face height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Joint (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d0cb19302e6c22f5873dc0c9fa71abea75e3d21d0870bb79dd5460ea44cde534",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Brick count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Mortar allowance per brick (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Batch yield (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9dce22e9b2648c59c418120f9ffcd847ef8d074332ac0b3d9ed3ba0d91526b30",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fence length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Panel width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Post width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "981165f1ab614e09e0d48cc912aec141346fae22d366da8ee34fa74dfed97fda",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Deck area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Board cover width including gap (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Stock length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "07cde40966183ff13306887bac9ada9c324f16e40eb443ec749c94f40455b132",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total rise (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Riser count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tread depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2558b145ffcfb0bcf37f3265f78c9b2b7e418744e48651bf60c3a6ee1d754435",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rise (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Horizontal run (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c6c08204e7d70479106fcf6a08fc1abb95312187a1ed7e54b8cdcd114c64ae3c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rise",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Horizontal run",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "cd1c12d655d245e27bdb2e5fa090af01e91d35456ef711bcb93d7e482c60b1f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Horizontal projected roof area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Pitch (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2b598a8785d1a24c0256f05a120ace56efcc182db17da4c3b4082e8b2f1eeb79",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Joint length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Depth (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Cartridge volume (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4be76fcfa95f348e5bc23038e2f110cc5900e5f793182f124c9d8c592e64fb3a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radiator width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Height (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Surface multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Coats",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Coverage (m²/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "8aeffd2150682818c271fbf2ac859103451c62d38f5cc755e82e90098ec2f8a1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bulk density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a28cb5502b7e3983e99246a49b4ba04e12d4dae133999d7931a50edff8a79178",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bag size (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c82b445ca145fd9321309149f0e73744ac28fe4a632ce5a1de3b699407a81b95",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target volume (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Blend ratio parts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2e57b54617b128bf3010325db20906551c9f9828967fdefc42211f4c732a9e82",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bulk density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ded63a05818a41813cf29e4019a016f5363801afaac4e95913facb0afce42833",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bed length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fill depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Number of beds",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b834038fcfb34785349c288b8bfffcf76670a96056beecfc2b80633bf68b3ffd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bed length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Plant spacing (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "54743d3a72b9614d7db6927326c495156bd6695ec82fe5402d0e8ef580817569",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Supplier seed rate (g/m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pack mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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"
      }
    },
    {
      "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": "973d491dafc753df934a2b7bd44047f8e1e65ba06cae11c385baa6abd0fd195f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Patio area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Slab width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Slab length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e05266315712b253ee9a886674f4c6b09c6c588fa89293edb9848d02237e40ac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Compacted depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Loose-volume allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Loose density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3a74b4165bb05f5d38e63e769cce3e862e3fe76b70b16222e3143d69f10a66b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Border length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "221b467be5683238130f2b1f56fc56434b1dd70967e9c8675588508226d31519",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Plot length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Row spacing (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Tree spacing (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Edge setback (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ff58f46f8bc13d059a62458c57ed9039731f40d6d6af1ac9ba06f27eb2da7801",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target water depth (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Measured flow (L/min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7bf2f9fc422187ff61c5f2f6d7de51753569aa297ec2848dd79bc8912b0fca5a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Emitter count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Flow per emitter (L/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Run time (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0479083be33991bab9835f365da881f04294cc7a4836ff6df1de06a475d8272f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Roof collection area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rainfall (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Collection efficiency (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "40f752d7114cf64eed64a370e96245ccfc6fb8f05485776ed2f3c56c57f6f6d2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tank capacity (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting water (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Inflow (L/min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3e2e303ee5781c97fdfa8a4a6bb1987aecfbd3b9562c0c9fd314de855426e7c7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pond length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average depth (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8ebdd2d3251a5fb6136ba10a7ec89b06f9d2db501aea6bb7ac8ca49b25ee9f14",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pond length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Maximum depth (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Edge allowance per side (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ae73b8c4ed5b6471bf19d114db7ec93db60a1ade4148135860bef2eff6e8ac59",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Segment lengths (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Segment widths (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "53a5d2a8d21c7c6babe064363fa48e3cd2df37f746f881f783e1e1f4246e4861",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Path length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Stone length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Gap (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "104e1f787379532b38c3ca5a58693352edb5c586a448d302a515f5f86a9fa941",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Wall face area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Block face area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7601a6b90c6062df3ce06e99b1007f5a630ec4f5fec9edc8cb31392e1803b937",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Elevation change (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Horizontal distance (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "cefa57929cf9532739fede7dcbec890ae463c963ec05151329cc0cba3368108f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Internal length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fill height (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "09c68fbb95faec6d79a580e3450225acd6cc29355b67e1abafbe871884d8a670",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Greenhouse length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Eaves height (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Roof rise (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bc7a8b717f29050f562e2890363ec016f42e86698936e72a224614bbd78c613e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Quantity",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Delivery (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Discount (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "30007d421180025b0a0b41f84912d5836270e2200cf56f2e54797ab713ac5e87",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Length",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "69a8828f3b1f1006f1fa4f53963d511e5af1753ab26a02b6b682041733d1434e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2641e904b88d39cb7f979c57fd52b8df2e58d092d985a502c374e7b2398dcf95",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Base",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7dec84dd7bfa4cf72cf3aaeeee0724324b801d4bbb9d85a3bcc073cf46caa3b4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Side A",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Side B",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Side C",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2593fa0c32f2a0058591ff1df184b1731d2f889b69aedc0468c2d01370bfbd3c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Leg A",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Leg B",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f6d49a69ca6b10c83b69c1c34f57886cc51480e951891f5400813eae16c62db0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Parallel side A",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Parallel side B",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0f61547f46944285fe5f58cdaae9e819fd45b5040e23d21452b52d8aeece0677",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Base",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e2685bd5e78da5c98839538d4abf45d40d1328b5da9a207589d5de53e6073556",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Diagonal A",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Diagonal B",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e9c7ba9bf366ea08f1411a7a7e2d4d604102f3b8f6c60294a3774b077aabdfad",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Semi-axis A",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Semi-axis B",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c55675787aa2f074662ec5523dd5c91aac8d6e267af697fd5d5cb76d161087ff",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sides",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Side length",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3a381cfcc45d50c9523ae6945dc21fe645d7737449252fcd7d5ef670b913facd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b05ea484499ef6536967eaa13391cef23bd926846803996ad7773a1a17f9e3e7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "280ad8b8c9cd733188539486f8b18cee2491ab3d98ac69b835a3cc169fddbac9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Outer radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Inner radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "57fd166ca0463b7eafad494c6dc8d1e319427c6289f81204f0dff0038acdfb86",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "781dc763ee687489fcf594006dbd8c9d9ef95a040425a9f6437518ee4a9b8c33",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Central angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "791ee2c00a3983ad4f2657ac3e1999ea4d51d6332d0750d19ff7d3e769daa670",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Length",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Height",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "93d0b0dc0371498a7b8c2871f058cd1d4ff904b1e2894916d734494471c043cb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Height",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "267a7e1368196deaadd9cba6122f4371c74ecac2f9fd308fa66fbb52cccae7a9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "eb7c55487363da84e149c4d856049813f7cf190c070138361dc3d52091d6e2d4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b623e5dea201540b5d35324b3e43db39a9bdc991038f2bc0645b721cac22cea4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "542b4ad1037863731cb668263df07f2efc6fbdc6708613492e6c88a128a8ab80",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bottom radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Top radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Height",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e386a70c0fac7b1b6095f3e557cafd76a8d5e84ddfc92280771d297782606b6a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Base area",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Perpendicular height",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4aa204397b30030e8db163e6b51b81e4ebc52238c48babc85b8acf5e7de73400",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Triangle side A",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Triangle side B",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Triangle side C",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Prism length",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ca50cdb9a983ca1617eb30a10d141b6708fad36faee622ddafff71821009e262",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Radius",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cylindrical section length",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "997606bcd91d859677faa1350b559cf525e03e77b54428b58bc984415b4d89c7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Ordered vertices x,y (one per line)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fdd2352749ecd193863a169fcfa47b5d2bf40f3d07f50626e1ef337adb8d7ee1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficient a",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Coefficient b",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Coefficient c",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "53162e865f5b887e51d08df55243726003d5524bcd9b1d5e32fff427b4ebbb60",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficient a",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Coefficient b",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Right side c",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "59bcc0b022e47790f1dd9f27165072e3536d99cb3236ced693b1a22dcc63bc8b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "x coefficient 1",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "y coefficient 1",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Right side 1",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "x coefficient 2",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "e",
          "label": "y coefficient 2",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "f",
          "label": "Right side 2",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c7f3671c2a931f5911f3e091989661edadc99d44f17e5dd220b17da19446b56a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rows: x coefficient,y coefficient,z coefficient,right side",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "673e38e0d7c187bba438102d1207a55ac67f58f6171a8406807f0067b07ef05d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficients, highest degree first",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "x",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6d7b9827eb427cc475c91d8297f00632774a451d3a691be9679ccd1eedc2c89c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficients, highest degree first",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4cc8dd3c5d404dc88b7f8a1f0bf4d210c807d2369c5d0b28683feed1d6b6ef3d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Coefficients, highest degree first",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Lower bound",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Upper bound",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7e9525d06a1945b3ee6b3320b8e72b541ec80d18840d2d681284cbb008e1787a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Base",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Exponent",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3edaa0ef878a3df771b12aa486fe067dcf708c96dd7cb8f1a507fdbbd1a5edba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Number",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Root degree",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "15356b5e2aa45297651753188f3677888e3e33a1cd980d7b32e3f6df44df7182",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Number",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Base",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "06ca29a75eca0c02bc0da463e2106dfae4b798d4d6591e9bcdd6c7127cc88636",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial amount",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Growth per period (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Periods",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b62d189c2cf637c8f33a07650dcf3ee25f53cd0a54d60612a27a6e987403cae1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Growth per period (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "536532535bb5ac3dd84c3d5db16458fdb0bc293e30f2e6bbf5095285c7fe51e0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial amount",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Half-life",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Elapsed time",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6f229a415d822a30e78790e557b22f58b19b6fe5d5167892505ecd91c6d339bd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First term",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Common difference",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Term count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "14305a977a6fcee6477db8e5ad3356ad32c34e90db0b3ccb863de4900dc70185",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First term",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Common ratio",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Term count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ca18921ff02b0182f35bd3621970dd2b5250ac835336c4dd8c0d0e04cc7b60a9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Integer",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-242",
      "name": "Permutations",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Ordered selections without replacement.",
      "url": "/calculators/permutations/",
      "version": "53a8c33e6780b7936d62d968e33c7b7307c891dc2f28842a0338338c3f63371b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pool size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Selected items",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-243",
      "name": "Combinations",
      "category": "Algebra and number tools",
      "status": "available",
      "purpose": "Unordered selections without replacement.",
      "url": "/calculators/combinations/",
      "version": "67fa3a48efd6f4304a4e73136c5cda1cfc8cff7aa6bf972a1c7900b5b3600c56",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pool size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Selected items",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f31676ed74dfac3501b4f814877c5ba76125f0c8ce3309649d6e2bb3370009b2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Integers",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0942f044f32017d59d0c472813d6d29b0f9dc658ad310da3831266e7cc516493",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Integers",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "94f224cf6bf7dda4747e150ec333fd52a5f1aefcd48bffb1dc5efed5b60b18d5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Integer",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "87d908c954d99770187bef79c898755fc1cb023bca40ae3541b7a04bdecf087b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dividend",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Positive divisor",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ded7836f569b6d1399d778ccb77348787208a9a14ba001acf24ec575ec578b2e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Integer text",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Source base",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Target base",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "08c5c964fdd8b8fb580c6540095ecefaae163ef3a5f89c28a79cef8431aa6f52",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Matrix rows, comma-separated",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "76fb2acff552b21aa2c331b9c117c4c84fc63171ebe8b3e63303d11cface2c3a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First real part",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "First imaginary part",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Second real part",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Second imaginary part",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "e",
          "label": "Operation (+, -, *, /)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-251",
      "name": "Median and quartiles",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Quantiles use linear interpolation at index (n−1)p on the sorted data. Other software conventions can differ.",
      "url": "/calculators/median-and-quartiles/",
      "version": "291a4bb3c1fa8913cb1a5adaae83f82f7922c8631916b5b8ca1abaaee4176172",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dataset",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Median",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Q1",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Q3",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Quantiles use linear interpolation at index (n−1)p on the sorted data. Other software conventions can differ."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Median",
          "text": "quantile(a,.5)"
        },
        {
          "label": "Q1",
          "text": "quantile(a,.25)"
        },
        {
          "label": "Q3",
          "text": "quantile(a,.75)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3,4,5"
          },
          "outputs": [
            {
              "label": "Median",
              "value": 3
            },
            {
              "label": "Q1",
              "value": 2
            },
            {
              "label": "Q3",
              "value": 4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-252",
      "name": "Mode and frequency table",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Reports every value tied for the highest frequency.",
      "url": "/calculators/mode-and-frequency-table/",
      "version": "05404a6c6b4970e2bf7ff8b3dfb34bae6f05bcd86770feb7c8bdda28df6ba915",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dataset",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Modes",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reports every value tied for the highest frequency."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Modes",
          "text": "mode(a)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,2,3"
          },
          "outputs": [
            {
              "label": "Modes",
              "value": "2 (2 times)"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-253",
      "name": "Variance and standard deviation",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Sample variance divides squared deviations by n−1; population variance divides by n.",
      "url": "/calculators/variance-and-standard-deviation/",
      "version": "c1250403f7e9288548e7d4b7d4921644b00d189d3018b8a13e9e49ae27c81a4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dataset",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Sample variance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Sample standard deviation",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Population variance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Sample variance divides squared deviations by n−1; population variance divides by n."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Sample variance",
          "text": "variance(a,true)"
        },
        {
          "label": "Sample standard deviation",
          "text": "sqrt(variance(a,true))"
        },
        {
          "label": "Population variance",
          "text": "variance(a,false)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "2,4,6"
          },
          "outputs": [
            {
              "label": "Sample variance",
              "value": 4
            },
            {
              "label": "Sample standard deviation",
              "value": 2
            },
            {
              "label": "Population variance",
              "value": 2.6666666666666665
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-254",
      "name": "Percentile rank",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Uses the count below the target plus half the tied count, divided by all observations.",
      "url": "/calculators/percentile-rank/",
      "version": "ff411cc4826359f4658314ec8390227135324d31656d7a98012d15e4fbda48ce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dataset",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Target value",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Midrank percentile (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the count below the target plus half the tied count, divided by all observations."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Midrank percentile (%)",
          "text": "100 × (number of entries below b + half the number equal to b) / count(a)."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3,4",
            "b": 3
          },
          "outputs": [
            {
              "label": "Midrank percentile (%)",
              "value": 62.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-255",
      "name": "Percentile value",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Uses linear interpolation at sorted index (n−1)p.",
      "url": "/calculators/percentile-value/",
      "version": "c31d711025a8e942b2fff5e670f9352188d8a09b6db119dbec1531400e3b08da",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dataset",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Percentile (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Percentile value",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses linear interpolation at sorted index (n−1)p."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Percentile value",
          "text": "quantile(a,b ÷ 100)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30,40",
            "b": 50
          },
          "outputs": [
            {
              "label": "Percentile value",
              "value": 25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-256",
      "name": "Z-score",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "A z-score expresses signed distance from the mean in standard deviation units.",
      "url": "/calculators/z-score/",
      "version": "afaae1cc9462de2ff450cea7baf609e79b1d0e792eb8168ce0c283f29b018e1a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Value",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Mean",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Standard deviation",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Z-score",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A z-score expresses signed distance from the mean in standard deviation units."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Z-score",
          "text": "(a-b) ÷ c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 50,
            "c": 10
          },
          "outputs": [
            {
              "label": "Z-score",
              "value": 3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-257",
      "name": "Normal distribution probability",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Assumes a normal distribution. Numerical approximation is used for the cumulative distribution.",
      "url": "/calculators/normal-distribution-probability/",
      "version": "c10887278250310a9eb0c446a4d42e3839be65d45b0f28089225e195f4104713",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mean",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Standard deviation",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Lower bound",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Upper bound",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Interval probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes a normal distribution. Numerical approximation is used for the cumulative distribution."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Interval probability",
          "text": "normalCDF((d-a) ÷ b)-normalCDF((c-a) ÷ b)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0,
            "b": 1,
            "c": -1,
            "d": 1
          },
          "outputs": [
            {
              "label": "Interval probability",
              "value": 0.6826894723352726
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-258",
      "name": "Binomial probability",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Independent Bernoulli trials with the same probability.",
      "url": "/calculators/binomial-probability/",
      "version": "12e310e2516d12d41e30c5b782e5f21f229c999951c86f719dd4d7d093382388",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Trials",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Success probability",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Successes",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Exact-count probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Independent Bernoulli trials with the same probability."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Exact-count probability",
          "text": "(combinations(a,c)) × b^c × (1-b)^(a-c)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 0.5,
            "c": 5
          },
          "outputs": [
            {
              "label": "Exact-count probability",
              "value": 0.24609375
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-259",
      "name": "Poisson probability",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Poisson model with a constant mean event rate and independent events.",
      "url": "/calculators/poisson-probability/",
      "version": "3e3758ec378a7e3b7625eb36cecb8aebbf4cc5a7b31272c74ec8593e4bd6d18b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mean count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Observed count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Exact-count probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Poisson model with a constant mean event rate and independent events."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Exact-count probability",
          "text": "exp(-a) × a^b ÷ (factorial(b))"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 0
          },
          "outputs": [
            {
              "label": "Exact-count probability",
              "value": 0.1353352832366127
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-260",
      "name": "Uniform distribution probability",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "A continuous uniform distribution on the specified finite interval.",
      "url": "/calculators/uniform-distribution-probability/",
      "version": "5297a7514a61b83468793aa266ee221f98865634c4bd101a48d2240ec51d3f52",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distribution minimum",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Distribution maximum",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Query lower",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Query upper",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Interval probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A continuous uniform distribution on the specified finite interval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Interval probability",
          "text": "max(0,min(b,d)-max(a,c)) ÷ (b-a)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0,
            "b": 10,
            "c": 2,
            "d": 5
          },
          "outputs": [
            {
              "label": "Interval probability",
              "value": 0.3
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-261",
      "name": "Expected value",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Probabilities must sum to one. The expected value need not be a possible single outcome.",
      "url": "/calculators/expected-value/",
      "version": "68b351995eac68f8a91b115feadf404d0d07ea518f16972f54a2a964be933210",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Outcomes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Probabilities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Expected value",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Probabilities must sum to one. The expected value need not be a possible single outcome."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Expected value",
          "text": "Multiply each outcome in a by its paired probability in b, then add the products."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0,10",
            "b": "0.8,0.2"
          },
          "outputs": [
            {
              "label": "Expected value",
              "value": 2
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-262",
      "name": "Bayes theorem",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Uses Bayes’ theorem for a hypothesis and its complement.",
      "url": "/calculators/bayes-theorem/",
      "version": "6cd94410bc8cfc82caf03651309e6a54a2cadaa04f949e6b2eacb01a36175112",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Prior probability",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Evidence likelihood given hypothesis",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Evidence likelihood without hypothesis",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Posterior probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses Bayes’ theorem for a hypothesis and its complement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Posterior probability",
          "text": "a × b ÷ (a × b+(1-a) × c)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.1,
            "b": 0.8,
            "c": 0.2
          },
          "outputs": [
            {
              "label": "Posterior probability",
              "value": 0.30769230769230776
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-263",
      "name": "Conditional probability",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "P(A given B) = P(A and B) / P(B).",
      "url": "/calculators/conditional-probability/",
      "version": "cb67c85fe0528863c5052a2ac7242d269351e5a80408a4447b81062e1d3be476",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Joint probability",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Condition probability",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Conditional probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "P(A given B) = P(A and B) / P(B)."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Conditional probability",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.2,
            "b": 0.5
          },
          "outputs": [
            {
              "label": "Conditional probability",
              "value": 0.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-264",
      "name": "Independent event combination",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "The product rules here require independent events.",
      "url": "/calculators/independent-event-combination/",
      "version": "429ea6b6572b9fc9ae179e42ea1820017753d6084d13cb0322ff559265c71613",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Independent event probabilities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "All occur",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "At least one",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The product rules here require independent events."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "All occur",
          "text": "Multiply all probabilities in a."
        },
        {
          "label": "At least one",
          "text": "Subtract from 1 the product of (1−p) for every probability p in a."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "0.5,0.5"
          },
          "outputs": [
            {
              "label": "All occur",
              "value": 0.25
            },
            {
              "label": "At least one",
              "value": 0.75
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-265",
      "name": "Birthday coincidence",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Assumes independent, uniformly distributed birthdays and ignores leap-day differences.",
      "url": "/calculators/birthday-coincidence/",
      "version": "0a97c158f8ab7d64550ceafb0e82652d78bcdb47c9d8f055e4700d20a22cfef5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "People",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Equally likely birthdays",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Shared birthday probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes independent, uniformly distributed birthdays and ignores leap-day differences."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Shared birthday probability",
          "text": "sharedBirthday(a,b)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 23,
            "b": 365
          },
          "outputs": [
            {
              "label": "Shared birthday probability",
              "value": 0.5072972343239854
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-266",
      "name": "Dice sum probability",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Fair independent dice with faces numbered from one. Uses an exact count distribution within supported limits.",
      "url": "/calculators/dice-sum-probability/",
      "version": "591f48d85492876ee017c1f2956a361a0a03dfe1b3b18c92eac2cf53677a9679",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dice",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sides per die",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Target sum",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fair independent dice with faces numbered from one. Uses an exact count distribution within supported limits."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Probability",
          "text": "diceTotalProbability(a,b,c)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 6,
            "c": 7
          },
          "outputs": [
            {
              "label": "Probability",
              "value": 0.16666666666666666
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-267",
      "name": "Coin toss probability",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Each toss is independent with the same entered head probability.",
      "url": "/calculators/coin-toss-probability/",
      "version": "798345fc95d6b6eacb180a10d64827f295a4153f389a61a140552e34981b2450",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tosses",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Head probability",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Required heads",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Probability",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Each toss is independent with the same entered head probability."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Probability",
          "text": "(combinations(a,c)) × b^c × (1-b)^(a-c)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 4,
            "b": 0.5,
            "c": 2
          },
          "outputs": [
            {
              "label": "Probability",
              "value": 0.375
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-268",
      "name": "Sample mean confidence interval",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Normal interval using a known population standard deviation and user-supplied critical z. This is not a t interval for an estimated standard deviation.",
      "url": "/calculators/sample-mean-confidence-interval/",
      "version": "b248eaa9e1874c4745eb7d70cc476dfdd7d52f0b291e87fa7663173ca63ac7fa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sample mean",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Known population standard deviation",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Sample size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Chosen normal critical z",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Lower confidence bound",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Upper confidence bound",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Normal interval using a known population standard deviation and user-supplied critical z. This is not a t interval for an estimated standard deviation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Lower confidence bound",
          "text": "a-d × b ÷ sqrt(c)"
        },
        {
          "label": "Upper confidence bound",
          "text": "a+d × b ÷ sqrt(c)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 100,
            "d": 1.96
          },
          "outputs": [
            {
              "label": "Lower confidence bound",
              "value": 98.04
            },
            {
              "label": "Upper confidence bound",
              "value": 101.96
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-269",
      "name": "Proportion confidence interval",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Wilson score interval for a binomial proportion. Choose the critical z for the desired confidence level.",
      "url": "/calculators/proportion-confidence-interval/",
      "version": "100e4e317d449772e114f4a4af65d8a0d26386db7779fd5546860e4b1aa3c3c3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Successes",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Trials",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Critical z",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Wilson lower bound",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Wilson upper bound",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Wilson score interval for a binomial proportion. Choose the critical z for the desired confidence level."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Wilson lower bound",
          "text": "Set p = a/b, D = 1+c²/b, centre = (p+c²/(2b))/D and half-width = c × sqrt(p(1−p)/b+c²/(4b²))/D. Lower bound = centre − half-width."
        },
        {
          "label": "Wilson upper bound",
          "text": "Using the same centre and half-width, upper bound = centre + half-width."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 100,
            "c": 1.96
          },
          "outputs": [
            {
              "label": "Wilson lower bound",
              "value": 0.40382982859014716
            },
            {
              "label": "Wilson upper bound",
              "value": 0.5961701714098528
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-270",
      "name": "Survey sample size",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Large-population simple-random-sample approximation. No finite-population correction or design effect is included.",
      "url": "/calculators/survey-sample-size/",
      "version": "01f59d28a69b8ddefd485bc95713b856622c1bd5bdbee08213072f577fa6448e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Critical z",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Margin of error (proportion)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Expected proportion",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Required sample size",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Large-population simple-random-sample approximation. No finite-population correction or design effect is included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Required sample size",
          "text": "roundUp(a × a × c × (1-c) ÷ (b × b))"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1.96,
            "b": 0.05,
            "c": 0.5
          },
          "outputs": [
            {
              "label": "Required sample size",
              "value": 385
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-271",
      "name": "Margin of error",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Normal approximation for a simple random sample, ignoring population correction and sampling design.",
      "url": "/calculators/margin-of-error/",
      "version": "81b163ffc886b9b4ea65f7fedaa4bfd6be12d8dba5ce049ef35912819c638600",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sample size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Critical z",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Expected proportion",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Margin of error (percentage points)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Normal approximation for a simple random sample, ignoring population correction and sampling design."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Margin of error (percentage points)",
          "text": "b × sqrt(c × (1-c) ÷ a) × 100"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 1.96,
            "c": 0.5
          },
          "outputs": [
            {
              "label": "Margin of error (percentage points)",
              "value": 9.8
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-272",
      "name": "Pearson correlation",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Measures linear association. Correlation does not establish causation.",
      "url": "/calculators/pearson-correlation/",
      "version": "932ac5924f1075100438794dd1ce2fdb71fd1fa749ee3ffb09797628faf6c1e4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "X observations",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Y observations",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pearson r",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Measures linear association. Correlation does not establish causation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pearson r",
          "text": "Calculate each list’s mean. Let Sxx = sum((x−mean x)^2), Syy = sum((y−mean y)^2), and Sxy = sum((x−mean x) × (y−mean y)) over matched pairs. r = Sxy/sqrt(Sxx × Syy). Both lists must vary."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3",
            "b": "2,4,6"
          },
          "outputs": [
            {
              "label": "Pearson r",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-273",
      "name": "Simple linear regression",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "Ordinary least squares with an intercept. No causal interpretation or prediction interval is provided.",
      "url": "/calculators/simple-linear-regression/",
      "version": "8de1802b8421a5d11c10edc863dfcb0294f9635dd2a82df5cef39f12d84f1c24",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "X observations",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Y observations",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Slope",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Intercept",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "R squared",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ordinary least squares with an intercept. No causal interpretation or prediction interval is provided."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Slope",
          "text": "From matched pairs, calculate Sxx = sum((x−mean x)^2), Syy = sum((y−mean y)^2) and Sxy = sum((x−mean x) × (y−mean y)). Slope = Sxy/Sxx."
        },
        {
          "label": "Intercept",
          "text": "Intercept = mean y − slope × mean x."
        },
        {
          "label": "R squared",
          "text": "R squared = Sxy²/(Sxx × Syy). Both input lists must vary."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "1,2,3",
            "b": "2,4,6"
          },
          "outputs": [
            {
              "label": "Slope",
              "value": 2
            },
            {
              "label": "Intercept",
              "value": 0
            },
            {
              "label": "R squared",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-274",
      "name": "Chi-square goodness of fit",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "This draft reports the statistic only, not a p-value. Expected counts must have the same total; fitted-parameter adjustments are not included.",
      "url": "/calculators/chi-square-goodness-of-fit/",
      "version": "0f51bcc89e14e0e5085e27c09cd361ff91396ae2113b937466d6a9f8b9e38ddd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Observed counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Expected counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Chi-square statistic",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Degrees of freedom",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This draft reports the statistic only, not a p-value. Expected counts must have the same total; fitted-parameter adjustments are not included."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Chi-square statistic",
          "text": "For each paired observed O and expected E count, calculate (O−E)^2/E; add the values."
        },
        {
          "label": "Degrees of freedom",
          "text": "Number of categories minus 1. This does not subtract fitted parameters."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20",
            "b": "15,15"
          },
          "outputs": [
            {
              "label": "Chi-square statistic",
              "value": 3.3333333333333335
            },
            {
              "label": "Degrees of freedom",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-275",
      "name": "Welch two-sample t-test",
      "category": "Statistics and probability",
      "status": "review_hold",
      "purpose": "This draft reports t and Welch–Satterthwaite degrees of freedom, not a p-value or decision. Independent samples are assumed.",
      "url": "/calculators/welch-two-sample-t-test/",
      "version": "d18777e8bdcf1bda090cfcdd2544d98c4d9cde5f0edfb5c32d046669bf8542ed",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Group A mean",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Group A standard deviation",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Group A size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Group B mean",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "e",
          "label": "Group B standard deviation",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Group B size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Welch t",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Degrees of freedom",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This draft reports t and Welch–Satterthwaite degrees of freedom, not a p-value or decision. Independent samples are assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Welch t",
          "text": "(a-d) ÷ sqrt(b × b ÷ c+e × e ÷ f)"
        },
        {
          "label": "Degrees of freedom",
          "text": "(b × b ÷ c+e × e ÷ f)^2 ÷ ((b × b ÷ c)^2 ÷ (c-1)+(e × e ÷ f)^2 ÷ (f-1))"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2,
            "c": 20,
            "d": 8,
            "e": 3,
            "f": 20
          },
          "outputs": [
            {
              "label": "Welch t",
              "value": 2.480694691784169
            },
            {
              "label": "Degrees of freedom",
              "value": 33.103092783505154
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Statistics review; documented distribution and estimator; trusted reference comparisons; small-sample and invalid-domain cases.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-276",
      "name": "Average speed",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Distance divided by elapsed time gives speed, not signed vector velocity.",
      "url": "/calculators/average-speed/",
      "version": "f8ae25d08d0773adbf5d9ccbe0796fd938642ebc91172f40fb67983452fb945e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Time (s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Average speed (m/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Distance divided by elapsed time gives speed, not signed vector velocity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Average speed (m/s)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10
          },
          "outputs": [
            {
              "label": "Average speed (m/s)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-277",
      "name": "Constant acceleration motion",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Constant acceleration in one dimension. Signs encode the chosen positive direction.",
      "url": "/calculators/constant-acceleration-motion/",
      "version": "e4941155a753731e8ff64303d328728c5583607e05040c3954fed188f4ec7917",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial velocity (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Acceleration (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Time (s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final velocity (m/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Displacement (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Constant acceleration in one dimension. Signs encode the chosen positive direction."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final velocity (m/s)",
          "text": "a+b × c"
        },
        {
          "label": "Displacement (m)",
          "text": "a × c+b × c × c ÷ 2"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0,
            "b": 2,
            "c": 5
          },
          "outputs": [
            {
              "label": "Final velocity (m/s)",
              "value": 10
            },
            {
              "label": "Displacement (m)",
              "value": 25
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-278",
      "name": "Acceleration from velocity change",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Average acceleration is change in velocity divided by elapsed time.",
      "url": "/calculators/acceleration-from-velocity-change/",
      "version": "423517c86092dc2d68bd564407ca5b72905c958ad1fb0349bb6281acec3f5ce0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial velocity (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Final velocity (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Time (s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Acceleration (m/s²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Average acceleration is change in velocity divided by elapsed time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Acceleration (m/s²)",
          "text": "(b-a) ÷ c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 15,
            "c": 2
          },
          "outputs": [
            {
              "label": "Acceleration (m/s²)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-279",
      "name": "Newton second law",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Uses F = ma for constant mass in an inertial frame. This is net force, not necessarily one applied force.",
      "url": "/calculators/newton-second-law/",
      "version": "9d3458bd71aa5d2ff17d5216c0e624661829dc3ab15f253d9844f4594d773ceb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Acceleration (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Net force (N)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses F = ma for constant mass in an inertial frame. This is net force, not necessarily one applied force."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Net force (N)",
          "text": "a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2
          },
          "outputs": [
            {
              "label": "Net force (N)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-280",
      "name": "Newton third law",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "The paired forces act on different bodies. The acceleration relation uses only the paired interaction force; other forces must be accounted for separately.",
      "url": "/calculators/newton-third-law/",
      "version": "7077afd02f9e1179bcaa77c2e6baf25fb7d74fadc33045de68061ae100d6c349",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass A (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Acceleration A due to interaction (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Mass B (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Reaction force on B (N)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Acceleration B due to interaction (m/s²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The paired forces act on different bodies. The acceleration relation uses only the paired interaction force; other forces must be accounted for separately."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Reaction force on B (N)",
          "text": "-a × b"
        },
        {
          "label": "Acceleration B due to interaction (m/s²)",
          "text": "-a × b ÷ c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 90,
            "b": 20,
            "c": 30
          },
          "outputs": [
            {
              "label": "Reaction force on B (N)",
              "value": -1800
            },
            {
              "label": "Acceleration B due to interaction (m/s²)",
              "value": -60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-281",
      "name": "Weight force",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Mass is not weight. Gravitational acceleration is entered explicitly.",
      "url": "/calculators/weight-force/",
      "version": "bcb3df3e8a5fe0de09b6832b30f6788dc288ec942297a0299221a7f46787ccf2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Gravity (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Weight (N)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Mass is not weight. Gravitational acceleration is entered explicitly."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Weight (N)",
          "text": "a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 9.80665
          },
          "outputs": [
            {
              "label": "Weight (N)",
              "value": 98.06649999999999
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-282",
      "name": "Kinetic energy",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Classical translational kinetic energy; not a relativistic model.",
      "url": "/calculators/kinetic-energy/",
      "version": "d0cfefe7ff462d4912fc9652cfa7e9a0e19924adf7210f329217fccf9e50a0dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Speed (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Kinetic energy (J)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Classical translational kinetic energy; not a relativistic model."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Kinetic energy (J)",
          "text": "a × b × b ÷ 2"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3
          },
          "outputs": [
            {
              "label": "Kinetic energy (J)",
              "value": 9
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-283",
      "name": "Gravitational potential energy",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Assumes approximately constant gravitational acceleration over the height change.",
      "url": "/calculators/gravitational-potential-energy/",
      "version": "b4c6cec9da68b67c8944a303a96c8dbf5347b435eef8352f126fa75e7763624b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Gravity (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Height change (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Potential energy change (J)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes approximately constant gravitational acceleration over the height change."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Potential energy change (J)",
          "text": "a × b × c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 9.80665,
            "c": 5
          },
          "outputs": [
            {
              "label": "Potential energy change (J)",
              "value": 490.3325
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-284",
      "name": "Momentum",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "One-dimensional classical momentum, with signed velocity.",
      "url": "/calculators/momentum/",
      "version": "3fbdd6ea9a550ad98dc13dcfd18e885d7efc1cad3f3dedaed47a88bb1077af0c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Velocity (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Momentum (kg·m/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One-dimensional classical momentum, with signed velocity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Momentum (kg·m/s)",
          "text": "a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3
          },
          "outputs": [
            {
              "label": "Momentum (kg·m/s)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-285",
      "name": "Impulse",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Force must be constant or the time-averaged force over the interval.",
      "url": "/calculators/impulse/",
      "version": "2af966f463430520b9f802d8b33b8310003e236ac5c1e4bb590585a8d05c1075",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mean force (N)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Duration (s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Impulse (N·s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Force must be constant or the time-averaged force over the interval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Impulse (N·s)",
          "text": "a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2
          },
          "outputs": [
            {
              "label": "Impulse (N·s)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-286",
      "name": "Mechanical work",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Work is the dot product of force and displacement. Assumes constant force.",
      "url": "/calculators/mechanical-work/",
      "version": "5a4a1396612df9d3d0f7b086dd9435bda9aad24dd7dc7d0c98b8b80051941b27",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Force (N)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Displacement (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Work (J)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Work is the dot product of force and displacement. Assumes constant force."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Work (J)",
          "text": "a × b × cos(c × π ÷ 180)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 5,
            "c": 60
          },
          "outputs": [
            {
              "label": "Work (J)",
              "value": 25.000000000000007
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-287",
      "name": "Mechanical power",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Power is energy transfer per unit time.",
      "url": "/calculators/mechanical-power/",
      "version": "dcc47dbd2d2c6c2f6d4f9cb441c27678e6869e203503d276e2058df339e8251e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Work (J)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Time (s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Average power (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Power is energy transfer per unit time."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Average power (W)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 10
          },
          "outputs": [
            {
              "label": "Average power (W)",
              "value": 100
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-288",
      "name": "Torque",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "The angle lies between the lever arm and force. This outputs magnitude, not a vector direction.",
      "url": "/calculators/torque/",
      "version": "2bf3c9c97779bdbc10d4a10617447f22a0a5a2d1d45fa73ee0cd042fe6685807",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Force (N)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Lever arm (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Torque magnitude (N·m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The angle lies between the lever arm and force. This outputs magnitude, not a vector direction."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Torque magnitude (N·m)",
          "text": "abs(a × b × sin(c × π ÷ 180))"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2,
            "c": 90
          },
          "outputs": [
            {
              "label": "Torque magnitude (N·m)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-289",
      "name": "Rotational speed",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "One revolution is 2π radians. Radius is measured from the rotation axis.",
      "url": "/calculators/rotational-speed/",
      "version": "ed1c3acc6d4242cadfec0b43fc13cdc4d18e1a7d9fb4040f49de282cdee2c4f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "RPM",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Radius (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Angular speed (rad/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Tangential speed (m/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One revolution is 2π radians. Radius is measured from the rotation axis."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Angular speed (rad/s)",
          "text": "a × 2 × π ÷ 60"
        },
        {
          "label": "Tangential speed (m/s)",
          "text": "a × 2 × π ÷ 60 × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 60,
            "b": 1
          },
          "outputs": [
            {
              "label": "Angular speed (rad/s)",
              "value": 6.283185307179585
            },
            {
              "label": "Tangential speed (m/s)",
              "value": 6.283185307179585
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-290",
      "name": "Centripetal force",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Required net inward force for uniform circular motion; it is not an additional force type.",
      "url": "/calculators/centripetal-force/",
      "version": "c0ed61dabb1dda870107aab1450d32d99846a64fcc8524cd7d00d10d4479924f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Speed (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Radius (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Centripetal force (N)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Centripetal acceleration (m/s²)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Required net inward force for uniform circular motion; it is not an additional force type."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Centripetal force (N)",
          "text": "a × b × b ÷ c"
        },
        {
          "label": "Centripetal acceleration (m/s²)",
          "text": "b × b ÷ c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3,
            "c": 2
          },
          "outputs": [
            {
              "label": "Centripetal force (N)",
              "value": 9
            },
            {
              "label": "Centripetal acceleration (m/s²)",
              "value": 4.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-291",
      "name": "Friction force",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Use a kinetic coefficient for sliding force or a static coefficient for the maximum static limit, not automatic static force.",
      "url": "/calculators/friction-force/",
      "version": "b10a17df8b4f3179706b40ee6b439292633df00a07cf4b5c858278c433d32b12",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Friction coefficient",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Normal force (N)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Friction force or limit (N)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use a kinetic coefficient for sliding force or a static coefficient for the maximum static limit, not automatic static force."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Friction force or limit (N)",
          "text": "a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 0.3,
            "b": 100
          },
          "outputs": [
            {
              "label": "Friction force or limit (N)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-292",
      "name": "Hooke spring law",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Linear spring within its elastic range. Negative force indicates opposition to displacement.",
      "url": "/calculators/hooke-spring-law/",
      "version": "fcee0b4fd64dd6b5a35ac3fc6bf13a0f8fa06d87a877c2a3ca2179339cc7e35c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Spring stiffness (N/m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Displacement (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Restoring force (N)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Stored energy (J)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Linear spring within its elastic range. Negative force indicates opposition to displacement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Restoring force (N)",
          "text": "-a × b"
        },
        {
          "label": "Stored energy (J)",
          "text": "a × b × b ÷ 2"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 0.1
          },
          "outputs": [
            {
              "label": "Restoring force (N)",
              "value": -10
            },
            {
              "label": "Stored energy (J)",
              "value": 0.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-293",
      "name": "Spring oscillator period",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Ideal undamped mass–spring oscillator with a massless spring.",
      "url": "/calculators/spring-oscillator-period/",
      "version": "faade1b8f8b8ed954159b3d14fde43877f905b133479c2a124639175ae686af3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Spring stiffness (N/m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Period (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal undamped mass–spring oscillator with a massless spring."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Period (s)",
          "text": "2 × π × sqrt(a ÷ b)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 100
          },
          "outputs": [
            {
              "label": "Period (s)",
              "value": 0.6283185307179586
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-294",
      "name": "Simple pendulum period",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Small-angle simple pendulum with a point mass and massless string.",
      "url": "/calculators/simple-pendulum-period/",
      "version": "c1c5ce3a2eef179d493cbfba7a5b38129e3cd9a245c3943d5a162353b54bfb3c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Gravity (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Period (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Small-angle simple pendulum with a point mass and massless string."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Period (s)",
          "text": "2 × π × sqrt(a ÷ b)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 9.80665
          },
          "outputs": [
            {
              "label": "Period (s)",
              "value": 2.0064092925890407
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-295",
      "name": "Projectile motion",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Ideal two-dimensional flight to a horizontal ground plane, with no drag and constant gravity.",
      "url": "/calculators/projectile-motion/",
      "version": "a7e30de9d77701826dea92ce2d8b5593f7bc9182c8e98166f3ec37f45064ff31",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Launch speed (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Launch height (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Gravity (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Flight time (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Range (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal two-dimensional flight to a horizontal ground plane, with no drag and constant gravity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Flight time (s)",
          "text": "(a × sin(b × π ÷ 180)+sqrt((a × sin(b × π ÷ 180))^2+2 × d × c)) ÷ d"
        },
        {
          "label": "Range (m)",
          "text": "a × cos(b × π ÷ 180) × (a × sin(b × π ÷ 180)+sqrt((a × sin(b × π ÷ 180))^2+2 × d × c)) ÷ d"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 45,
            "c": 0,
            "d": 9.80665
          },
          "outputs": [
            {
              "label": "Flight time (s)",
              "value": 1.4420964981651176
            },
            {
              "label": "Range (m)",
              "value": 10.197162129779283
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-296",
      "name": "Free fall",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Starts from rest, with no air resistance and constant gravity.",
      "url": "/calculators/free-fall/",
      "version": "5684a10e2372a67166079000cc1f2fdc67b6d0fe5e9bfa41cd2f45137dd8ed11",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Drop height (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Gravity (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Fall time (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Impact speed (m/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Starts from rest, with no air resistance and constant gravity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Fall time (s)",
          "text": "sqrt(2 × a ÷ b)"
        },
        {
          "label": "Impact speed (m/s)",
          "text": "sqrt(2 × a × b)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 20,
            "b": 10
          },
          "outputs": [
            {
              "label": "Fall time (s)",
              "value": 2
            },
            {
              "label": "Impact speed (m/s)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-297",
      "name": "Escape velocity",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Newtonian ideal escape speed without atmosphere or rotation. G is 6.67430 × 10⁻¹¹ in SI units.",
      "url": "/calculators/escape-velocity/",
      "version": "81722e4165c90cd10f5ffc813a949df2bf41669a1262790b18300b011f3df45c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Central mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Distance from centre (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Escape speed (m/s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Newtonian ideal escape speed without atmosphere or rotation. G is 6.67430 × 10⁻¹¹ in SI units."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Escape speed (m/s)",
          "text": "sqrt(2 × 6.67430e-11 × a ÷ b)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5.972e+24,
            "b": 6371000
          },
          "outputs": [
            {
              "label": "Escape speed (m/s)",
              "value": 11185.97789184991
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-298",
      "name": "Orbital period",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Keplerian two-body model using the combined mass of the bodies. Perturbations are excluded.",
      "url": "/calculators/orbital-period/",
      "version": "a2ff70ee05599a3cd90b861cfbe3217395caeba1fbb6fb476c84ba9f51dfc009",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Semi-major axis (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Combined mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Orbital period (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Keplerian two-body model using the combined mass of the bodies. Perturbations are excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Orbital period (s)",
          "text": "2 × π × sqrt(a^3 ÷ (6.67430e-11 × b))"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 7000000,
            "b": 5.972e+24
          },
          "outputs": [
            {
              "label": "Orbital period (s)",
              "value": 5828.598860022618
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-299",
      "name": "Pressure from force",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Force is normal to the surface and averaged over the stated area.",
      "url": "/calculators/pressure-from-force/",
      "version": "b0b48067cbd35d75eeef4f8194ec447840705b5cbc3601a7136c2a3edbcbdaf3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Normal force (N)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pressure (Pa)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Force is normal to the surface and averaged over the stated area."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pressure (Pa)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 2
          },
          "outputs": [
            {
              "label": "Pressure (Pa)",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-300",
      "name": "Buoyant force",
      "category": "Physics and mechanics",
      "status": "review_hold",
      "purpose": "Archimedes’ principle for the displaced fluid volume in a static uniform fluid.",
      "url": "/calculators/buoyant-force/",
      "version": "1c7977f98fda8f9f12ab471f53f01979af8f88ac59eb4f19a90df94ee42cf154",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fluid density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Displaced volume (m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Gravity (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Buoyant force (N)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Archimedes’ principle for the displaced fluid volume in a static uniform fluid."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Buoyant force (N)",
          "text": "a × b × c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 0.01,
            "c": 9.80665
          },
          "outputs": [
            {
              "label": "Buoyant force (N)",
              "value": 98.06649999999999
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-301",
      "name": "Ohm law",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "DC Ohm’s law for an ohmic resistor; resistance is treated as constant.",
      "url": "/calculators/ohm-law/",
      "version": "1ddf6c9f3aa1a2ab8d989863ce150427ada74c0c40f47b0eb564ea6d436de2ef",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Voltage (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Resistance (Ω)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Current (A)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Power (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "DC Ohm’s law for an ohmic resistor; resistance is treated as constant."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Current (A)",
          "text": "a ÷ b"
        },
        {
          "label": "Power (W)",
          "text": "a × a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 6
          },
          "outputs": [
            {
              "label": "Current (A)",
              "value": 2
            },
            {
              "label": "Power (W)",
              "value": 24
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-302",
      "name": "DC electrical power",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "DC power is voltage times current. This formula alone does not cover AC phase differences.",
      "url": "/calculators/dc-electrical-power/",
      "version": "cb008d09ef0c0e0b493b75f3490df357603f5af08124c86653ec553af8631a9d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Voltage (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current (A)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Power (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "DC power is voltage times current. This formula alone does not cover AC phase differences."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Power (W)",
          "text": "a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 2
          },
          "outputs": [
            {
              "label": "Power (W)",
              "value": 24
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-303",
      "name": "Series resistance",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Series resistances add directly.",
      "url": "/calculators/series-resistance/",
      "version": "d1385b60322b200cc67b6e041bf1d0bd9a80126d89c84999c84df61633645a83",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Resistors (Ω)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Series resistance (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Series resistances add directly."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Series resistance (Ω)",
          "text": "sum(a)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20,30"
          },
          "outputs": [
            {
              "label": "Series resistance (Ω)",
              "value": 60
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-304",
      "name": "Parallel resistance",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Adds conductances, then takes the reciprocal.",
      "url": "/calculators/parallel-resistance/",
      "version": "9929d6346d7acd4db340ee4431e53fdf2887bd6f5ac9a195cec45bb9249639fd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Resistors (Ω)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Parallel resistance (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Adds conductances, then takes the reciprocal."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Parallel resistance (Ω)",
          "text": "Take the reciprocal of each resistance in a, add those conductances, then take the reciprocal of the sum."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,10"
          },
          "outputs": [
            {
              "label": "Parallel resistance (Ω)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-305",
      "name": "Voltage divider",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "The output is across the lower resistor. Loading by another circuit is excluded.",
      "url": "/calculators/voltage-divider/",
      "version": "90fe0e815cf4769d49a8ce95b2ddffeb37dcad11dc60619dcbbcb5a9bc431718",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Supply voltage (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Upper resistance (Ω)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Lower resistance (Ω)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Unloaded output (V)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Divider current (A)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The output is across the lower resistor. Loading by another circuit is excluded."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Unloaded output (V)",
          "text": "a × c ÷ (b+c)"
        },
        {
          "label": "Divider current (A)",
          "text": "a ÷ (b+c)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 1000,
            "c": 1000
          },
          "outputs": [
            {
              "label": "Unloaded output (V)",
              "value": 6
            },
            {
              "label": "Divider current (A)",
              "value": 0.006
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-306",
      "name": "Current divider",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Current divides in proportion to branch conductance.",
      "url": "/calculators/current-divider/",
      "version": "74ced17cf6d68bc7fcaf8899d9996b4d429c500bb7441aa2dfb746826f09d850",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total current (A)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Parallel resistances (Ω)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Branch currents (A)",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Current divides in proportion to branch conductance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Branch currents (A)",
          "text": "For each resistance R in b: branch current = a × (1/R) / sum of all reciprocal resistances."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 3,
            "b": "10,20"
          },
          "outputs": [
            {
              "label": "Branch currents (A)",
              "value": "2, 1"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-307",
      "name": "LED series resistor",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "An ideal resistor calculation; choose real component ratings and tolerances separately. No safety certification is provided.",
      "url": "/calculators/led-series-resistor/",
      "version": "7c607e226c7560faacd4a6a3d6be55a5a05cbc22b79042ab2ea66ccea1983940",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Supply (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "LED forward voltage (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target current (mA)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ideal resistor (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Resistor dissipation (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "An ideal resistor calculation; choose real component ratings and tolerances separately. No safety certification is provided."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ideal resistor (Ω)",
          "text": "(a-b) ÷ (c ÷ 1000)"
        },
        {
          "label": "Resistor dissipation (W)",
          "text": "(a-b) × c ÷ 1000"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 2,
            "c": 20
          },
          "outputs": [
            {
              "label": "Ideal resistor (Ω)",
              "value": 150
            },
            {
              "label": "Resistor dissipation (W)",
              "value": 0.06
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-308",
      "name": "Resistor colour code",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Supports a four-band resistance code: two digits, multiplier and tolerance. Read from the digit end.",
      "url": "/calculators/resistor-colour-code/",
      "version": "60c3cfc4d9aa204aba0b3f236b276ba617a8d96ef535495415924cd74048b017",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Four bands, comma-separated",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Resistance and tolerance",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Supports a four-band resistance code: two digits, multiplier and tolerance. Read from the digit end."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Resistance and tolerance",
          "text": "decodeResistor(a)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "brown,black,red,gold"
          },
          "outputs": [
            {
              "label": "Resistance and tolerance",
              "value": "1000 Ω ±5%"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-309",
      "name": "Resistor tolerance range",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "The tolerance band is symmetric around the nominal value.",
      "url": "/calculators/resistor-tolerance-range/",
      "version": "3ec25e81f8512af329bd2fc41be31859aeabbdf873466e29840ece380fd9271e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal resistance (Ω)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tolerance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Minimum (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Maximum (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The tolerance band is symmetric around the nominal value."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Minimum (Ω)",
          "text": "a × (1-b ÷ 100)"
        },
        {
          "label": "Maximum (Ω)",
          "text": "a × (1+b ÷ 100)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 5
          },
          "outputs": [
            {
              "label": "Minimum (Ω)",
              "value": 950
            },
            {
              "label": "Maximum (Ω)",
              "value": 1050
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-310",
      "name": "Capacitors in series",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Ideal capacitors in series add reciprocal capacitances.",
      "url": "/calculators/capacitors-in-series/",
      "version": "1f08c3bb5fe89d88a7a16db539d04ea59d6d30e41fd898af152dd3adb192bdce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Capacitances (µF)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Series capacitance (µF)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal capacitors in series add reciprocal capacitances."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Series capacitance (µF)",
          "text": "Take the reciprocal of each capacitance in a, add the reciprocals, then take the reciprocal of the sum."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,10"
          },
          "outputs": [
            {
              "label": "Series capacitance (µF)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-311",
      "name": "Capacitors in parallel",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Ideal parallel capacitances add directly.",
      "url": "/calculators/capacitors-in-parallel/",
      "version": "533878c786ebf473171c98778938343de0df74940d895c5c4cd51af932c4f239",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Capacitances (µF)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Parallel capacitance (µF)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal parallel capacitances add directly."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Parallel capacitance (µF)",
          "text": "sum(a)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "10,20"
          },
          "outputs": [
            {
              "label": "Parallel capacitance (µF)",
              "value": 30
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-312",
      "name": "Capacitor stored energy",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Converts microfarads to farads before applying E = ½CV².",
      "url": "/calculators/capacitor-stored-energy/",
      "version": "91be779e1ec5feb5744fe31e84db15ad566248fb8d96e12541fb6e0a41da061b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Capacitance (µF)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Voltage (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Energy (J)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Charge (C)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Converts microfarads to farads before applying E = ½CV²."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Energy (J)",
          "text": "a × 1e-6 × b × b ÷ 2"
        },
        {
          "label": "Charge (C)",
          "text": "a × 1e-6 × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1000,
            "b": 10
          },
          "outputs": [
            {
              "label": "Energy (J)",
              "value": 0.05
            },
            {
              "label": "Charge (C)",
              "value": 0.01
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-313",
      "name": "RC time constant",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Ideal first-order RC circuit. Five time constants corresponds to approximately 99.3% of the final change.",
      "url": "/calculators/rc-time-constant/",
      "version": "f26aabfa81ec50160e000eff9f0b52b012a74234ef7226e81baff35a761ac012",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Resistance (kΩ)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Capacitance (µF)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Time constant (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Approximate five-time-constant settling (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal first-order RC circuit. Five time constants corresponds to approximately 99.3% of the final change."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Time constant (s)",
          "text": "a × b ÷ 1000"
        },
        {
          "label": "Approximate five-time-constant settling (s)",
          "text": "5 × a × b ÷ 1000"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 100
          },
          "outputs": [
            {
              "label": "Time constant (s)",
              "value": 1
            },
            {
              "label": "Approximate five-time-constant settling (s)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-314",
      "name": "RL time constant",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Ideal first-order RL circuit; the time constant is L/R.",
      "url": "/calculators/rl-time-constant/",
      "version": "44adbb24ed75db27ac5e0ec309b2d5162c73fe01d47430899b1e588679e29ae8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Inductance (mH)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Resistance (Ω)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Time constant (s)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal first-order RL circuit; the time constant is L/R."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Time constant (s)",
          "text": "a ÷ 1000 ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10
          },
          "outputs": [
            {
              "label": "Time constant (s)",
              "value": 0.01
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-315",
      "name": "LC resonance",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Ideal LC resonance ignores resistance and parasitic effects.",
      "url": "/calculators/lc-resonance/",
      "version": "206e73249d2069044bcb24d2538d65de336d6d091aaf385e2d5defdcddbd27cc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Inductance (mH)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Capacitance (µF)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Resonance (Hz)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal LC resonance ignores resistance and parasitic effects."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Resonance (Hz)",
          "text": "1 ÷ (2 × π × sqrt(a ÷ 1000 × b ÷ 1e6))"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 1
          },
          "outputs": [
            {
              "label": "Resonance (Hz)",
              "value": 1591.5494309189535
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-316",
      "name": "Reactance",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Reactance magnitudes for ideal components at a single sinusoidal frequency.",
      "url": "/calculators/reactance/",
      "version": "0f1fbec9afe384d1d8f4cf0876f65b147791d05526c6bec9512081f734ff0d6c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Frequency (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Capacitance (µF)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Inductance (mH)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Capacitive reactance (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Inductive reactance (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Reactance magnitudes for ideal components at a single sinusoidal frequency."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Capacitive reactance (Ω)",
          "text": "If b = 0, report Open circuit. Otherwise 1/(2 × π × a × b/10^6)."
        },
        {
          "label": "Inductive reactance (Ω)",
          "text": "2 × π × a × c/1000."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 100,
            "c": 100
          },
          "outputs": [
            {
              "label": "Capacitive reactance (Ω)",
              "value": 31.830988618379067
            },
            {
              "label": "Inductive reactance (Ω)",
              "value": 31.41592653589793
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-317",
      "name": "Series RLC impedance",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Ideal series RLC circuit. Reactances subtract because inductive and capacitive phase shifts oppose.",
      "url": "/calculators/series-rlc-impedance/",
      "version": "4b0b94dea142694b666ee947a5b35bda473487d2db74ae4ea154e2046b487b8b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Resistance (Ω)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Inductance (mH)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Capacitance (µF)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Frequency (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Impedance magnitude (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal series RLC circuit. Reactances subtract because inductive and capacitive phase shifts oppose."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Impedance magnitude (Ω)",
          "text": "hypot(a,2 × π × d × b ÷ 1000-1 ÷ (2 × π × d × c ÷ 1e6))"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 100,
            "c": 100,
            "d": 50
          },
          "outputs": [
            {
              "label": "Impedance magnitude (Ω)",
              "value": 10.008610119907438
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-318",
      "name": "AC power factor",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "This magnitude relation assumes the appropriate sinusoidal model; it does not determine leading versus lagging power factor.",
      "url": "/calculators/ac-power-factor/",
      "version": "54e1bd756998d97565e9313fdb161089e78ff611c861b43ea3227624fde57fd1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Real power (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Apparent power (VA)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Power factor",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Reactive magnitude (var)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "This magnitude relation assumes the appropriate sinusoidal model; it does not determine leading versus lagging power factor."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Power factor",
          "text": "a ÷ b"
        },
        {
          "label": "Reactive magnitude (var)",
          "text": "sqrt(b × b-a × a)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 800,
            "b": 1000
          },
          "outputs": [
            {
              "label": "Power factor",
              "value": 0.8
            },
            {
              "label": "Reactive magnitude (var)",
              "value": 600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-319",
      "name": "Three-phase balanced power",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Balanced three-phase sinusoidal system with line-to-line voltage.",
      "url": "/calculators/three-phase-balanced-power/",
      "version": "510aa1193c2230b8729bf896fca5b035219e4a5ffcd8cc83efacf93385538876",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Line voltage (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Line current (A)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Power factor",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Real power (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Apparent power (VA)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Balanced three-phase sinusoidal system with line-to-line voltage."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Real power (W)",
          "text": "sqrt(3) × a × b × c"
        },
        {
          "label": "Apparent power (VA)",
          "text": "sqrt(3) × a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 400,
            "b": 10,
            "c": 0.8
          },
          "outputs": [
            {
              "label": "Real power (W)",
              "value": 5542.562584220407
            },
            {
              "label": "Apparent power (VA)",
              "value": 6928.203230275509
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-320",
      "name": "Ideal transformer ratio",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Ideal transformer with no losses or regulation effects.",
      "url": "/calculators/ideal-transformer-ratio/",
      "version": "d4ca2ebc3d6cd97b67397947939066ba597cb7c0658808edc04dccf12880cf91",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Input voltage (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Primary turns",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Secondary turns",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Ideal output voltage (V)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal transformer with no losses or regulation effects."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Ideal output voltage (V)",
          "text": "a × c ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 240,
            "b": 1000,
            "c": 100
          },
          "outputs": [
            {
              "label": "Ideal output voltage (V)",
              "value": 24
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-321",
      "name": "Wire resistance",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Use resistivity at the actual operating temperature. This does not determine safe current capacity.",
      "url": "/calculators/wire-resistance/",
      "version": "43b1113c0f0e8f7315807186d6b1f4b7faba67db20dfa7a688dfd1ba79bb2a28",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Resistivity (Ω·m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cross-section (mm²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Resistance (Ω)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use resistivity at the actual operating temperature. This does not determine safe current capacity."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Resistance (Ω)",
          "text": "a × b ÷ (c ÷ 1e6)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1.68e-8,
            "b": 10,
            "c": 1
          },
          "outputs": [
            {
              "label": "Resistance (Ω)",
              "value": 0.16800000000000004
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-322",
      "name": "DC cable voltage drop",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Loop resistance includes both outbound and return conductors. This is not a cable-sizing or installation approval.",
      "url": "/calculators/dc-cable-voltage-drop/",
      "version": "4f12b6f160c44296ea4ff2d94e1beee7e2170483e98c734509fcb1256fc1d663",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current (A)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Total loop resistance (Ω)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supply (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Voltage drop (V)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Load voltage (V)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_3",
          "label": "Wire loss (W)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Loop resistance includes both outbound and return conductors. This is not a cable-sizing or installation approval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Voltage drop (V)",
          "text": "a × b"
        },
        {
          "label": "Load voltage (V)",
          "text": "c-a × b"
        },
        {
          "label": "Wire loss (W)",
          "text": "a × a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 0.2,
            "c": 12
          },
          "outputs": [
            {
              "label": "Voltage drop (V)",
              "value": 2
            },
            {
              "label": "Load voltage (V)",
              "value": 10
            },
            {
              "label": "Wire loss (W)",
              "value": 20
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-323",
      "name": "Decibel power ratio",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "For power use 10 log10 of the ratio. Amplitude ratios use a different formula under equal impedance.",
      "url": "/calculators/decibel-power-ratio/",
      "version": "7cb90e6538daf0acea3bc7072f494fa2fe778b03000ee9d4b9e406f209faa779",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Output power",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Reference power",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Power ratio (dB)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "For power use 10 log10 of the ratio. Amplitude ratios use a different formula under equal impedance."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Power ratio (dB)",
          "text": "10 × log10(a ÷ b)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10
          },
          "outputs": [
            {
              "label": "Power ratio (dB)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-324",
      "name": "Battery charge quantity",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Assumes constant current throughout the interval.",
      "url": "/calculators/battery-charge-quantity/",
      "version": "3d2ebe39d70510399ca4015d4cb295ffe8788b39f616cf3ed66d30a3e632072e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current (A)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Duration (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Charge (Ah)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Charge (C)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes constant current throughout the interval."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Charge (Ah)",
          "text": "a × b"
        },
        {
          "label": "Charge (C)",
          "text": "a × b × 3600"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 3
          },
          "outputs": [
            {
              "label": "Charge (Ah)",
              "value": 6
            },
            {
              "label": "Charge (C)",
              "value": 21600
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-325",
      "name": "PWM average voltage",
      "category": "Electricity and electronics",
      "status": "review_hold",
      "purpose": "Rectangular waveform switching between zero and the stated supply; ideal switching is assumed.",
      "url": "/calculators/pwm-average-voltage/",
      "version": "ee8b3fe493731888bd277fa4a57d12f6c8b8ce475310bf7e2001c6ce17bc6fa0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Supply voltage (V)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Duty cycle (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mean voltage (V)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "RMS voltage (V)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Rectangular waveform switching between zero and the stated supply; ideal switching is assumed."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mean voltage (V)",
          "text": "a × b ÷ 100"
        },
        {
          "label": "RMS voltage (V)",
          "text": "a × sqrt(b ÷ 100)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 12,
            "b": 25
          },
          "outputs": [
            {
              "label": "Mean voltage (V)",
              "value": 3
            },
            {
              "label": "RMS voltage (V)",
              "value": 6
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "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": "13013bf69aafd6936bc2a4f8e6cf8db18188e0c37e1bd0e0cda2c4505544c328",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Power (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hours per day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4db5f3f24ed424afae0bfd1f938ec90604f3e286ce29a82bdcd7ac6a26f4de03",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Start meter (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "End meter (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Standing charge (£/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "496b15bc6049e7a8156341a8b96e5db44a01703a781d684db36fe5c9c76dba22",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Meter volume (m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Calorific value (MJ/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Volume correction factor",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3dc0897491307cb5c548b748946a5c18c6841f6cdad9a28856b74c41995e9090",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fuel price per unit (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Energy content (kWh/unit)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Appliance efficiency (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a50ed6132f5cc7d28ffd0f0ebea67f2c068ac4f2d72b7af8382841af0a25b392",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Heat required (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Seasonal performance factor",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Electricity (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b26f310a6e43b7bfbcddc1a6fe246c90d4f161589ebb8dd62bfb6f00b1c2bdb1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "System rating (kW)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Equivalent sun hours/day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Performance factor (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c053a642be86d1693ea0bd13480b44773813aa847bd6b49ca8c591f73cd8506a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Generation (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Directly used (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Import price (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Export price (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b02409be285757ad8244823630e23169915a08b4a17bddd956faf5f608416e19",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Installed cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual savings (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual maintenance (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7b51ad8c03b13c0608ad861594b77ecac503e944b9faecad1c8b98db51b95369",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Usable capacity (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual cycles",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Round-trip efficiency (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Low-price energy (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Avoided price (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Installed cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "efaa0084c2195e2ab62981b12eea59103add5e0a94f3ac3c7d51d22d16835452",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Capacity (Wh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Load (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable fraction (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Output efficiency (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "adfa26783d33032c841c8963f36c106f0e3240b49d56b670029d42f1376d6e06",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Capacity (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting charge (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target charge (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Charger input (kW)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Efficiency (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7980f591329e14c9861c2d0706c27d8ee529d96197e0c03d956f0e6602bc1231",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Energy (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "beb444e5f36985e48814077718255db529f2388a0c3f241de95c2b91dda14b5f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Daily mean temperatures (°C)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Base temperature (°C)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "db0cd2f0181d4bcbe4540c4976fe7f9a77fcf5f96f0a2bf2b99b7e24cf0ca3e5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Daily mean temperatures (°C)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Base temperature (°C)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ddd7b98179cbe99b6ca845a7179aaca3931eff262468112a7fb69107e44cb994",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Water volume (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting temperature (°C)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Target temperature (°C)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Efficiency (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "294ab8b513e9b1fce311bdeb8700c9a47c3c8b7110db58398a84f125f5a80019",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Hot temperature (°C)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Cold temperature (°C)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Target temperature (°C)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Final volume (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "591701f559376cbaea5fb3aef84b0c357977fb229e28c243c1f83b4435b45e41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Flow (L/min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Showers",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Water (£/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Heat energy per litre (kWh/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Energy (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "14bad900e05d6e58219dbbe9288025819bf1c9a363f21e99cc77046c220670f3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured leak (mL/min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Water (£/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "12e46bfd49eb2ee9dccd9cd11cdf64a232e64cca20d34c301135a4ed479a0bdc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Old power (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New power (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Annual hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Replacement cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f27984e0a5326ce14ac6cc898f05c04f2ad9f1cccffcbbc7ab65f26dcb3702b9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Standby power per device (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Devices",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hours per day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "561458db0b39a348ca5d409f37014a57296816f84c02999533ed4df91a3553b0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Surface area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Old U-value (W/m²K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "New U-value (W/m²K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Temperature difference (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Duration (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "616e3ecfb577b1b09914d0dfb1d220c714f7e424679596785c0727db07066f2a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Airflow (m³/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Air density (kg/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Heat capacity (J/kgK)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Temperature difference (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3d6b5a81265722af8ce892d98f18290ae064d567d7802fb8326798027cd4fd82",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Activity quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Emission factors (kg CO₂e/unit)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "57a5b3befbe6849d45d1be8f3dd28426ecbcf39a1158cbeed2547035b97ae36b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Reused mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Recycled mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Disposed mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "71d5c01f6f72b343982a82a76736aac0173f549077671b537b474f68bf8de1b5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Usable tank volume (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Daily consumption (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Daily refill (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "29cafe3dbe00661d21a2abc40c20cb120793b81387ad491a992134adc60d0620",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Average speed (km/h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Stop time (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8d66e20604225d31649edc45d29c27f7d1ed61f9b8741756599327f5961298ff",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consumption (L/100 km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fuel price (£/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7f03a6de3d9db88d40937a35a0fc45b0883b695fc4b0b54a3a62fcbbd4f0b0c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Consumption (L/100 km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fe28bf7cc964efbbacbf65b73cbf09883a6ca9cbf45e88ef753d823e0cac640e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fuel (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tolls (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Parking (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "People",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "64c6e47e65769f95294ea32132911a84cbfcdaf5b3388cf6ae68cd55234a27d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Daily round-trip distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Commute days/month",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Running cost (£/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Daily parking and tolls (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b540cfa77dc3b6fc39e1293c9705e2ad6881cd6306a17d2236476433aabe565c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consumption (kWh/100 km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Charging loss (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5246b4609719f6b7d034de83ca9595b7654f99233774985376090aa4aa11283e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Purchased energy (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Session fee (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b8c492afd1d23367a08c38866b4d1f3cf87176e12ff3b72c618ddd7fd63679ac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Usable battery (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current charge (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reserve charge (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Consumption (kWh/100 km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a26c8d96fc2ef4df4dc3def169b4fd5d3cc9c1edbb1063e60802a621f57ddb2b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Journey (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting usable range (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Range added per stop (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Minutes per stop",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "407338d568ba430656075ab3a59d4487eda5ad09824d559192b4f736871fea4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Purchase (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected resale (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Other annual ownership costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Years owned",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Annual distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ad24341f63d0af295f77183459ff6c3a1821bbdf9c530424d831e6416e478899",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial value (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual depreciation (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Years",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e5ef9774bdfcc1d241cf5686adc569e1ba66ff0cece59edff511ef74f72ae3a9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Trip cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Passenger distance weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "68cf74224af9bb5217493f2f53ab4f0621bd598ba1baae322fdf314d7273af3d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Base fare (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rate (£/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Waiting (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Wait rate (£/minute)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Surcharge (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "17ef876dba590a73d3873c2d1bce25ab0a749e7e7ebe8fb7cbdf3848a31c548a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Transport total (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Nights",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Accommodation per night (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Daily spending per person (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "People",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "90da44ed744d10d7e225fb6cf7e91f59a7dd835c635d71dfee3fd6d4f8ccd599",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Nightly price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Nights",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Cleaning (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other fees and taxes (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5ed51bcb99e34ff7c0a2cb3fed5a3403a4755257fe29686915e28907743d0baf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Budget (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Prepaid costs (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Trip days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0d0f3c397b49bb683b85108a0de38869768df8e3d263a7f9be216711ef01d918",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bag weights (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Allowance (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fee per excess kg (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "90280492f17f7b5d3ac2b0234b777be30390c5071991209079fbee40b122d2eb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cash fare (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Award taxes and charges (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Points required",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bf5c648156140d7992478c875ad60d8cf069ca8d8ea900c3825d5500c00e198d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Latitude A (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Longitude A (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Latitude B (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Longitude B (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "598b970e56e8850ddef6955c1adac7779002d0f213e1eeaf26aa7ce47925335d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Map distance (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Scale denominator",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2159ff8aae616493576e9acd23be4b72803e4c46134fffd5ee8ed0682c9180af",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (nautical miles)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Speed (knots)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9dc679624d1f7f2db6c27144b5f93e73e61c06f02b0e589c5c435e9647ee22f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Wind speed",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Wind from direction (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Heading (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4937c9b73edbd79848b12e823a2ac806a84c29d7b198f86f135d209fc35caea6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Speed (km/h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Reaction time (s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Braking deceleration (m/s²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0af1eeaedcfe11a373c24b04faa560c3665786079996686372b24fb52cd4238e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Vehicles counted",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Observation minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Lanes",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "34d592797be2eacc6d7606b712fb1a1d5432ddef3da0132f0b7deda39da0e12b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Duration (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hourly rate (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Daily cap (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "03570409d8ef00c797f897d7af00b7014ef6f2073603012c6366c60e17c6354b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original servings",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired servings",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Ingredient quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "59d5ba43c460a376a893e5f88959a38094831749c37cbcf153bc51fc5940a06d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Flour mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Other ingredient masses (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "517dc20f177468e034f25b1c6cd63b69c944bc8dfd0bf56e0b407382ec252f5f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total flour (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Total water (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5be28467d98972593ea3d03b70dbe4e245f2366337636619f0f600518b297a3e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target dough mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Non-flour bakers percentages",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c22252aaadcc5f4bf6dd6ae74595829b7d1e23a289be495bebf3d7e0eb76b287",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starter mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Flour feed multiple",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Water feed multiple",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bbdcb54b66e2b5b9761a500347201ef5c44cb84436fdc420f8629cb607e235a0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Preferment mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hydration (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Total recipe flour (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total recipe water (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "56eb29b553f355a79fff8ddaef990377a11a8ff18b45fd6d31c7b95cfc64da01",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pizzas",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dough per pizza (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hydration (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Salt (% of flour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Yeast (% of flour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "daf068cc5f01f6a2316743da091548ffef6d4e1455ff1832c1568f0bebbd93fa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pizza diameter (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "77601ce3e923ae55572194534be04e3b2d7725af056bbc3e0763cbd59f8e4f36",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original round-pan diameter (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Original fill depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "New diameter (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "New fill depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5e6aa2535d9a9d3d659c913f6036b61c7c788fc7ac868e0128a3197833005a44",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Batches",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Batches per oven load",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Bake minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Changeover minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7c9a438469cf9938a8d9969eb351dc0cf50fd9be2da00b85fbb81888b1a6961c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "People",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dry rice per person (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cooked mass multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e93f242e165fa537a44c927da439516375670bae22b722b63053e9d519a87130",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "People",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dry pasta per person (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cooked mass multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8e85c78fbc37ee3fd0134fb26bd4abb047ee1fa849fd4f31c36b91fd3bdc86dd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Water (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Water-to-coffee ratio",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "623f6c3caa16479b96f96a6b6a02f8d9e04122535e31e16344b222361e59492e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Coffee dose (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Beverage mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "df286cca87af80563f0e3cf58f39f639f09b39e8ccb51fb0276fdc4a803a1eb4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Servings",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Water per serving (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Leaves per litre (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3b7fd843fb1b7d300d0bf67d941c92e21deee0655fc57942f350ab6736275f0e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Guests",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Portion quantity per guest",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Buffer (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2ad7fe666e0ca54d8593e119f9de0d7e80309b5bc6a6005eee9f93120e5fb6a7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredients (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Staff (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Equipment (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Guests",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8e0654f13806c04eea0d6a62f8cf62bb096cc31827f8ab180cb51226596a951d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Pack quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Pack prices (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Servings",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4a93ebf686e72e808e3d3f7423092fad39b3c654be4ff1553a1bc08cbd113ec4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Purchase mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Usable mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Purchase price (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "34de893c454245c57b3b15b27b588a2e6fd0b90f624a63375a8d37be14467f4d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Purchased quantity",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Waste quantity",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unit cost (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1938344bf5dff0b56eb6c636ea54517527a9f91d2d1687ffe4ab101e1abce3d4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Volume (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Density (g/mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ee3af5489e3d71df8439a823d4f7b7ddbcbcf365962d71b60007a5d19d79e184",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Quantity in US cups",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9859a2cc25fae959325548d8fbcf59cd8dbbb25846c64d7a2542b81d7bdfe527",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Water mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Salt mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "eefd57ce6e28999d929f2becde8e8e9458b33dcae8cb61a0b53ccf1ea41e0f3d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total syrup mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sugar ratio parts",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Water ratio parts",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "133bab4741b7557ae480ec82dad573079d513a75c0643fed6a16dc4311f8906f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Temperature (°C)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6ae7b0300e9209a9201cfe6ab4d667b9b85e482b32a4eeb01e124396731d38f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Elapsed minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f1abd0a891246ead85c4804d95af93086df9e8663040f1f04e5399ff2f4a5d7e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Pace (minutes/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d07aad501b61dba1f50e9762ef4cb68420e159c12eadebdd92f1b172182aa02a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Race distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Pace (minutes/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Split length (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ec9d817a5e63c28177cbd1ebed9b8ef1734cec77f88c9b73152c7b579c8e381c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target total minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "First half slower by (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "45d9c64be68376d5e07eac859fbfec8f94af187b905f3077bfafee0776e0bd1e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Known distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Known finish minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Empirical exponent",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f22770cb674f9597e8e295b69212669ac6bb505cee550d2dc6d9b9574e2779f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target distance (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Track length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d3a7ed38725ffad94443cf0342eb6e516ce2a1e31194a09fd751f10bb79c2764",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Belt speed (km/h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6be7e7aaaaf017e98e74c7e3753bb81d69113a9754954f492c2a48dda4891640",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Belt distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Grade (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4f8e194479079f2167f60c16c702a45f73b985dbbc6bd21531c4d8d2cc5248bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cadence (rpm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Chainring teeth",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sprocket teeth",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Wheel circumference (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "32cc5e28ea2dcba47723aca7e601de919b68762bae4dd6dd9f20272209155d64",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Wheel diameter (inches)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Chainring teeth",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sprocket teeth",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "15a05760b908794c46e83030b194f9441dcd55bf0c3be46064aaf2313e2e13db",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Power (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rider or system mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "33702ed67ca8f8ea77f79701c46ea4e25b6d0fd275d8a9a2652969b52e1296e4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "System mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Vertical gain (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Duration (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4e3aa64feea834b22cea12995fd732345f07144c0e055c67fa4eedc415bf12ef",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Distance (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Elapsed minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a94ffd0751b6dafe39136ce26018c2e96a3c30287ee77db7749e561e280ab558",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pool length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target distance (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "366ae38441c9bf19617fbc464016c09f1878253f42b817d725c6a2d8c77e1eee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "500 m split (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "72341965999d1bbcf1e9efe1d73b55f4a3deb5c40088db852f5931b0370445b0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Swim minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bike minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Run minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total transition minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5950180a76a74ac1be5667fd9427164afcafcde487d7a4dece8836ea36ad4688",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Repetitions",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Work seconds",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rest seconds",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Warm-up minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cool-down minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bb427b49db1e0e10b14e47e7cdeccd9045cfc7064d19a50cfe560ccc10335d90",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sets",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Repetitions per set",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Load (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c03958dd4abee27897bc6663075c1448ec69d43565025f6c3d5585e0f26740fd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target weight (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bar weight (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Available pair plate weights (kg), repeated for quantity",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9b64cf3261a04815d4b4c9d447ef0ef15ea8b83813ff7b00b68dd6a06e9bf2c3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Lifted weight (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Repetitions",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c717a60f37663a3e31d27047945867f1696802a3b1546fb60c502f754c2d79b4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Session durations (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Perceived effort (0–10)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8dcdbaa9326e4e485754890689f4fdc9a4b21b44636d081a7c93f19bb0c83d18",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Teams",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Meetings per pair",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9bc26d3634de8723a955f2cb2ccb76427ac81466e2090b42757b3d1a8b948aa4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Entrants",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "98f5918fbb2e0427373fc737d08ab8413b186c36c87049d697aa449444af6dd7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current points",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Remaining matches",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Points per win",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Points per draw",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e9a1bce58568e78eaa747a5a78dbe81e3edfb2769de0ab0425938309e267fa44",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Matches",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Courts",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Minutes per match",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Changeover minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "072c3a39b30154dbf3431842fce09509e9acbd96a1face92c99bc56428eb3b49",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Size in decimal GB",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3ce73688e3c1971f6cd3e9bf2aa356de49895c70cfb624a2e56376c371f722f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "File size (GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Connection (Mbps)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Efficiency (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "75b71c9ede683eb50c57f29c06295bb2b10402621ff1f98749e449d362cfa795",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Data volume (GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Upload window (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Efficiency (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ea8143e13ac6d023aeca67110ebf6a559b33e40072ad15651f484158cbb4f31a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Streaming bitrate (Mbps)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hours per day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "41158e0919eb0a8ff49733eedc83479f752b13ed3f40c05f507675bbb6b30173",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "File count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Average file size (MB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reserve (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ca959d78882b1978e70ccd994a5073aeb29402b71541558de6009d7ae3d8bad3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Data to back up (GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sustained throughput (MB/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c0d8a63b697ec88273047b73ddd5891988ab3f820632f9ca4911d7f5b049ecf2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Full backup (GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Incremental backup (GB/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Full copies retained",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Incremental copies retained",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6d6a2184f9414b68767cabb96665df09f7af7fd5a1605ff4e113560711d88dbb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Drive count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Drive size (TB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "RAID level (0,1,5,6,10)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a85f2aa7332a728647e88f5ca70886fc6f19715061de8e9c12579c7869adf046",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original size",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Compressed size",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bbb9f48e7d0041807fa6d124d2fe112af24fa205dcf8f0f63ede410b3b0010cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "IPv4 address",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Prefix length",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "54cf5fc116b4bcc589af422b71310fd7ec59466d42efdb8398cee51684e46e26",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First IPv4 address",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Last IPv4 address",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9dc0d4d4327a0c546c0d8b8541e05c4383434991ffe59a1d2cd75311b5271c50",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Parent prefix",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Child prefix",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e375fb2627e5513571f08ae5ede2d8069e211ec0ada6e5643b9222603e823f7f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bandwidth (Mbps)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Round-trip time (ms)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7688d5e14da8266c3c62b0c2a1aecbe57c776e3e13bbe33be15fd616610ad7ce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Availability (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Period (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "49193221ad736aed6b7ecb680f900586ba5e47c4c41166a485384787e3e1056a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Parallelisable share (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Workers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "83e3596ed1f4eaf7379de6660dd93526a786d9f47380fb57b10bb57a57828c26",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Arrival rate per second",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Service rate per server per second",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Servers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "605c426ab4a50d5f793b80020d335d80bceb18e45efff26146d87f613ceaa759",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Requests",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Price per 1000 (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fixed charge (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1353a3d949b464cf832e29aeb5f94efb053e90e979e3bf776363ee58cd3b7697",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Stored GB",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Storage (£/GB-month)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Egress GB",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Egress (£/GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Other monthly charges (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3ada8276f8f95dc3eda86ed2e75733f65c55388f371d0f31b760c5c96c41ae4e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Idle power (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Loaded power (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Loaded share (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Tariff (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c6cda35c13e774e19a1f34b7febd1dbcde553a6c457970480d464a3f8f2aa335",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Events per second",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bytes per event",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Compression retained fraction (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retention days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "38244a07ee73a721e7941dd17a2c9c7b5c1a3c279e28bebdd9d1650b5ff7002d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Image count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Average size (MB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Versions per image",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Copies",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8de5faddea97dde21f8d1f63893339a00d0fa5c9e865003105f109f117963bd3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Camera count",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bitrate each (Mbps)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recording hours/day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retention days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c0f59785aa0cf22939cc22e4c796eece8234496234bbfd75fdce02bf3b734735",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Alphabet size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Password length",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Guesses per second",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0e14c75b08a07a4abfd0a4876b5abacbe0a40cc7a0c733b337af2608f8f4adb2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Hash bits",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Items",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "91428aabf22cc9a8cc35982427165c70ac735fdfbfe04b11ffdf08f6a1494f28",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Requests needed",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Requests per window",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Window seconds",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bb40555f0bf272263787ccbce61acb8d34c7ed22f94ed11bb12b2bf361c571ba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Width",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Height",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a81e17ab3ac23025116ff182d4e3ba72c8a3d7f02b805a7e58296b717b7746b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original width (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Original height (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Target width (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1d391276b54f7b9c4b5863f71717d573e563ad15713ed7fb483815b730a4c851",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pixel width",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Print width (inches)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3b3348fcfcfa55e023766b3dbedf6c45c164310ba3453e83382a619db7947670",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Horizontal pixels",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Vertical pixels",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Diagonal (inches)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "53655ceab544bac9632d537f2839bc75b6654ffd06173e5c8d90c4c21b58af3f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Video bitrate (Mbps)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Audio bitrate (kbps)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0e63a46a380786cd6ab6821650d862a42572901978d550dad7bd770224d73b02",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target size (MB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Audio bitrate (kbps)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fdb966dfa27e930b9150689ec31645e87483ecde752f8c4b2b759f6a12abaa61",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sample rate (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bit depth",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Channels",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6554804cc2cb64dab54e21c9aa6df24337003eb8e3742e8e47d6791799001223",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Samples per channel",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sample rate (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "eb740ebce275bf29162dc96a965dadfa983d139669100a5804afdab9e6e145e2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Frame count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Frames per second",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9c78db7ec55fb774b48d9bbf1fbcc73f7123eca7669ac635b87384717a679f98",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Timecode HH:MM:SS:FF",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Integer frame rate",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "aebe8dc3293e5f9c4883753d734b9838bc19677d8d04c8b79fa614e7348662cc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Capture frame rate",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Playback frame rate",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recorded seconds",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a05a94882eca5ec72a527b930e76f13111cd99e7a8d09e93f98d413a18cfa029",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Event duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Capture interval (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Playback fps",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bc1e6eba82e29320a70ef7a684e2517e4b67f1396726d0a972160b2ecea63034",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original exposure time (s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Original f-number",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "New f-number",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Original ISO",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "New ISO",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a3c0195f83e6acf1f1811b189ac5c275a6466dba701f4f6b72b87666c1d5c35d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Focal length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Aperture f-number",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Focus distance (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Circle of confusion (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2f2864fffdb01c212c12d36e9b27f0bfe5c9a032ea62fb14f8f03137232cc8a2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Focal length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sensor width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sensor height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fd7880171316bbfcccf89a7ba7efed4bd66818a06aa12bb21cfc4b4334d8e226",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Focal length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Crop factor",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "40dd807ae007b2e6c23212e29fc5a66e68a6f66181e45f7419926639c749a0a1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Trim width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Trim height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bleed per side (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Resolution (ppi)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d4527d84412598e188a571a59f4dbdab74d5246df41919ce3f5996f2bad0cf4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Artwork width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Artwork height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Usable sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Usable sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Overlap (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fd039bd915db4c3a7bbfa46c71a51f63959a66d81f7d59dcf6411a8f52c923cd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Base font size (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Scale ratio",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Steps",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dd93a6e407b4fa76c066b11f828ddbf2383786612a3123794beabc74c7215ef8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Font size (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Line-height multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Lines",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4dadc47570189933124f422d8562672b45a8f3e276ccdb9efbbc39ced115f3c9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Minimum size (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Maximum size (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Minimum viewport (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Maximum viewport (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5acb98f8b434f0ac6a78ef1350edad94fde1b8f3c9f870d0b108ecd07df6da4f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Container width (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Margin each side (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Columns",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Gutter (px)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "78f3ac296333a5d5aa7f510163843882e2b6538700252b8adce4557bf63dc129",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Foreground HEX",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Background HEX",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "89b425f8ad15dc782d4300634bff323dd56cb5f8b01c4fc15ed77e22ea280768",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "HEX colour",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dff0962bc8e30472bf9e67a07462f6a89475df683866a3b03854db842620bed1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tempo (BPM)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Note denominator (4 = quarter)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-476",
      "name": "Molar mass",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Uses a documented small table of standard atomic weights and supports simple parenthesised formulas. Isotopes, hydrates and ionic charges are not inferred.",
      "url": "/calculators/molar-mass/",
      "version": "c1331c4f5ddfff80616d44495ae61cc3c4c683193ebd43d643c1d6d970390203",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Chemical formula",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Molar mass (g/mol)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses a documented small table of standard atomic weights and supports simple parenthesised formulas. Isotopes, hydrates and ionic charges are not inferred."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Molar mass (g/mol)",
          "text": "formulaMass(a)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "H2O"
          },
          "outputs": [
            {
              "label": "Molar mass (g/mol)",
              "value": 18.015
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-477",
      "name": "Moles and mass",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Amount in moles equals mass divided by molar mass.",
      "url": "/calculators/moles-and-mass/",
      "version": "65209f2706a326d8fa46e81f2d4df4edc8583dd9136b6429b33c33cfaebfa4ba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Molar mass (g/mol)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Amount (mol)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Amount in moles equals mass divided by molar mass."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Amount (mol)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 18,
            "b": 18
          },
          "outputs": [
            {
              "label": "Amount (mol)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-478",
      "name": "Particle count",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Uses the exact Avogadro constant, 6.02214076 × 10²³ mol⁻¹.",
      "url": "/calculators/particle-count/",
      "version": "fa168d8253edd2def4c69e4923d647a6a2b87ce207173c3feee05791838c5f17",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Amount (mol)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Particles",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses the exact Avogadro constant, 6.02214076 × 10²³ mol⁻¹."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Particles",
          "text": "a × 6.02214076e23"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1
          },
          "outputs": [
            {
              "label": "Particles",
              "value": 6.02214076e+23
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-479",
      "name": "Molarity",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Use the final solution volume, not the solvent volume before mixing.",
      "url": "/calculators/molarity/",
      "version": "1680de926b9e20b94aacf89f27489dc9183bce7a83fe1a24de1844ffedb43a8c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Solute amount (mol)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Solution volume (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Molarity (mol/L)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use the final solution volume, not the solvent volume before mixing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Molarity (mol/L)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 2
          },
          "outputs": [
            {
              "label": "Molarity (mol/L)",
              "value": 0.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-480",
      "name": "Molality",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "The denominator is solvent mass, not total solution mass.",
      "url": "/calculators/molality/",
      "version": "659a2cf5bb620e90ffafd186dae53fb60971dba48e2346dc1e978a903f3c58d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Solute amount (mol)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Solvent mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Molality (mol/kg solvent)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "The denominator is solvent mass, not total solution mass."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Molality (mol/kg solvent)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 2
          },
          "outputs": [
            {
              "label": "Molality (mol/kg solvent)",
              "value": 0.5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-481",
      "name": "Dilution equation",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "C₁V₁ = C₂V₂ conserves solute under an ideal nonreacting dilution. Volume units must match.",
      "url": "/calculators/dilution-equation/",
      "version": "7fe6bb6257fbf7817c95ceb95fcd18e6893bd66a96248d83c3f9b904e120f695",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting concentration",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starting volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Final volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final concentration",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "C₁V₁ = C₂V₂ conserves solute under an ideal nonreacting dilution. Volume units must match."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final concentration",
          "text": "a × b ÷ c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 100,
            "c": 500
          },
          "outputs": [
            {
              "label": "Final concentration",
              "value": 0.4
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-482",
      "name": "Serial dilution",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "A dilution factor of ten means one part original solution in ten parts final volume.",
      "url": "/calculators/serial-dilution/",
      "version": "0e0505221b9594a0f2190752918d13d24e812496454791f86f0aebe96ded1258",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting concentration",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dilution factor per step",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Steps",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final concentration",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A dilution factor of ten means one part original solution in ten parts final volume."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final concentration",
          "text": "a ÷ b^c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 10,
            "c": 3
          },
          "outputs": [
            {
              "label": "Final concentration",
              "value": 0.1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-483",
      "name": "Mass percent concentration",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Both masses must use the same unit.",
      "url": "/calculators/mass-percent-concentration/",
      "version": "859c648ef175eea06e45ea8577e4d9a40ffe7904408a141ca83050ef739d3b1c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Solute mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Total solution mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mass percentage",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Both masses must use the same unit."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mass percentage",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 100
          },
          "outputs": [
            {
              "label": "Mass percentage",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-484",
      "name": "Volume percent concentration",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Use measured final volume; volumes can change on mixing.",
      "url": "/calculators/volume-percent-concentration/",
      "version": "11957bc2e30ae8c78286d0f1449dd97304e832f2ea4935270c2eb7ca5e98f0ab",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Solute volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Final solution volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Volume percentage",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use measured final volume; volumes can change on mixing."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Volume percentage",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 100
          },
          "outputs": [
            {
              "label": "Volume percentage",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-485",
      "name": "Parts per million",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "One milligram per kilogram is one ppm by mass. Do not substitute volume ratios without density information.",
      "url": "/calculators/parts-per-million/",
      "version": "55692869b607a368b82dc0694f8f666e64b66950d724ba742f1972228a6065a1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Component mass (mg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Total mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Mass concentration (ppm)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Parts per billion",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "One milligram per kilogram is one ppm by mass. Do not substitute volume ratios without density information."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Mass concentration (ppm)",
          "text": "a ÷ b"
        },
        {
          "label": "Parts per billion",
          "text": "a ÷ b × 1000"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 5,
            "b": 1
          },
          "outputs": [
            {
              "label": "Mass concentration (ppm)",
              "value": 5
            },
            {
              "label": "Parts per billion",
              "value": 5000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-486",
      "name": "Density",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Density depends on temperature, pressure and material state.",
      "url": "/calculators/density/",
      "version": "b0cb4c364d1edac43854a6b534da080d7d86f03c41aa71cc2c5a7076e038814d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Volume (m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Density (kg/m³)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Density depends on temperature, pressure and material state."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Density (kg/m³)",
          "text": "a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 10,
            "b": 2
          },
          "outputs": [
            {
              "label": "Density (kg/m³)",
              "value": 5
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-487",
      "name": "Ideal gas law",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Ideal-gas model using R in kPa·L/(mol·K). Real gases can depart substantially from this approximation.",
      "url": "/calculators/ideal-gas-law/",
      "version": "6ac671baa10b4c368143f80d1ac319883ab2d46c66076d3265c9270753c2775e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Amount (mol)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Absolute temperature (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Volume (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Pressure (kPa)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal-gas model using R in kPa·L/(mol·K). Real gases can depart substantially from this approximation."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Pressure (kPa)",
          "text": "a × 8.314462618 × b ÷ c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 300,
            "c": 24
          },
          "outputs": [
            {
              "label": "Pressure (kPa)",
              "value": 103.93078272500001
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-488",
      "name": "Combined gas law",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Fixed gas amount with absolute temperatures. Pressure and volume units must be consistent.",
      "url": "/calculators/combined-gas-law/",
      "version": "e1b4ce371dbf64c3a8ed06cc474c296618e2c7721e4ddefea9ef226c2cd40f0a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial pressure",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Initial volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Initial temperature (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Final volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Final temperature (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Final pressure",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Fixed gas amount with absolute temperatures. Pressure and volume units must be consistent."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Final pressure",
          "text": "a × b × e ÷ (c × d)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 2,
            "c": 300,
            "d": 4,
            "e": 300
          },
          "outputs": [
            {
              "label": "Final pressure",
              "value": 50
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-489",
      "name": "Partial pressure",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Ideal-gas mixture under Dalton’s law. Mole fractions must sum to one.",
      "url": "/calculators/partial-pressure/",
      "version": "80c7fd86af6787b8361481bf378745fb8884dd83cf0ebc4b0b309219a527eaef",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total pressure",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Mole fractions",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Partial pressures",
          "type": "string",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal-gas mixture under Dalton’s law. Mole fractions must sum to one."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Partial pressures",
          "text": "For each mole fraction x in b: partial pressure = a × x."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": "0.2,0.8"
          },
          "outputs": [
            {
              "label": "Partial pressures",
              "value": "20, 80"
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-490",
      "name": "Gas molar volume",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Ideal-gas molar volume at the explicitly supplied temperature and pressure.",
      "url": "/calculators/gas-molar-volume/",
      "version": "ead397612184c6698c085cf5d0195f91ebced458a583de67f3125d4998fe54eb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Absolute temperature (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Pressure (kPa)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Molar volume (L/mol)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Ideal-gas molar volume at the explicitly supplied temperature and pressure."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Molar volume (L/mol)",
          "text": "8.314462618 × a ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 273.15,
            "b": 101.325
          },
          "outputs": [
            {
              "label": "Molar volume (L/mol)",
              "value": 22.413969544601038
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-491",
      "name": "Reaction stoichiometry",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Uses coefficients from an already balanced reaction. This version does not balance equations or identify a limiting reagent.",
      "url": "/calculators/reaction-stoichiometry/",
      "version": "640d132bc89a027ecfa0e91ba4aafc47ab35ef45537344a67213b23cb8d67fe5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Known reactant amount (mol)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Reactant coefficient",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Product coefficient",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Theoretical product (mol)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Uses coefficients from an already balanced reaction. This version does not balance equations or identify a limiting reagent."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Theoretical product (mol)",
          "text": "a × c ÷ b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 2,
            "c": 1
          },
          "outputs": [
            {
              "label": "Theoretical product (mol)",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-492",
      "name": "Limiting reactant",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Compare available moles divided by stoichiometric coefficients. Enter a balanced reaction and consistent amounts.",
      "url": "/calculators/limiting-reactant/",
      "version": "0add0e77b91c7a74529d2866767536eb8d3366e60b84ae1d5aa52be6f1e42215",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Available reactants (mol)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Balanced coefficients",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Product coefficient",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Theoretical product (mol)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Limiting reactant position",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Compare available moles divided by stoichiometric coefficients. Enter a balanced reaction and consistent amounts."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Theoretical product (mol)",
          "text": "Divide each available reactant amount by its matching stoichiometric coefficient. Take the smallest ratio and multiply by product coefficient c."
        },
        {
          "label": "Limiting reactant position",
          "text": "Return the one-based position of the smallest ratio; if tied, return the first tied input."
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": "4,3",
            "b": "2,1",
            "c": 2
          },
          "outputs": [
            {
              "label": "Theoretical product (mol)",
              "value": 4
            },
            {
              "label": "Limiting reactant position",
              "value": 1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-493",
      "name": "Percent yield",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "A yield above 100% can indicate impurities, moisture or a calculation error; it is displayed rather than silently capped.",
      "url": "/calculators/percent-yield/",
      "version": "5e3cd6e7a14a10a1bccfe8e5a4685d2dd1d8f1d701628b8a67373293ec28ad46",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Actual product mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Theoretical product mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Yield (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "A yield above 100% can indicate impurities, moisture or a calculation error; it is displayed rather than silently capped."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Yield (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 8,
            "b": 10
          },
          "outputs": [
            {
              "label": "Yield (%)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-494",
      "name": "Atom economy",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Use masses weighted by balanced-equation coefficients. Atom economy is different from experimental yield.",
      "url": "/calculators/atom-economy/",
      "version": "ee1ea765755d043be54f0d3ac022d7801efd416f8dc53e8c556596e231cc85de",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Desired product stoichiometric mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Total reactant stoichiometric mass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Atom economy (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Use masses weighted by balanced-equation coefficients. Atom economy is different from experimental yield."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Atom economy (%)",
          "text": "a ÷ b × 100"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 80,
            "b": 100
          },
          "outputs": [
            {
              "label": "Atom economy (%)",
              "value": 80
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-495",
      "name": "Beer-Lambert absorbance",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Beer–Lambert law assumes a suitable dilute, non-scattering sample and monochromatic measurement.",
      "url": "/calculators/beer-lambert-absorbance/",
      "version": "e6c3d9a509bfb6d8d839c7c07db59dcc7826118f78e7b775c1595ba195fb40e5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Molar absorptivity (L/mol/cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Concentration (mol/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Path length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Absorbance",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Transmittance fraction",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Beer–Lambert law assumes a suitable dilute, non-scattering sample and monochromatic measurement."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Absorbance",
          "text": "a × b × c"
        },
        {
          "label": "Transmittance fraction",
          "text": "10^(-a × b × c)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 100,
            "b": 0.01,
            "c": 1
          },
          "outputs": [
            {
              "label": "Absorbance",
              "value": 1
            },
            {
              "label": "Transmittance fraction",
              "value": 0.1
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-496",
      "name": "Absorbance and transmittance",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Absorbance is minus the base-10 logarithm of the transmitted fraction.",
      "url": "/calculators/absorbance-and-transmittance/",
      "version": "1f78940f8cbbe537d100fc8331f3ab958058802531094f6051b063b000da057b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Absorbance",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Transmittance (%)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Absorbance is minus the base-10 logarithm of the transmitted fraction."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Transmittance (%)",
          "text": "100 × 10^(-a)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1
          },
          "outputs": [
            {
              "label": "Transmittance (%)",
              "value": 10
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-497",
      "name": "Specific heat energy",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Assumes constant specific heat and no phase change.",
      "url": "/calculators/specific-heat-energy/",
      "version": "faca7c49bceaa42665e106fdc93b38aaad0974e58abd3edae41d9a4d47552826",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Specific heat (J/kg/K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Temperature change (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Energy change (J)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Assumes constant specific heat and no phase change."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Energy change (J)",
          "text": "a × b × c"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 1000,
            "c": 10
          },
          "outputs": [
            {
              "label": "Energy change (J)",
              "value": 20000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-498",
      "name": "Latent heat energy",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Applies to the selected phase change at its transition conditions, not sensible heating before or after it.",
      "url": "/calculators/latent-heat-energy/",
      "version": "21522bf0449cc27707591b88574b751e3b165b7bc35f0a78296ce86064e4c070",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Specific latent heat (J/kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Phase-change energy (J)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Applies to the selected phase change at its transition conditions, not sensible heating before or after it."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Phase-change energy (J)",
          "text": "a × b"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 2,
            "b": 334000
          },
          "outputs": [
            {
              "label": "Phase-change energy (J)",
              "value": 668000
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-499",
      "name": "Thermal expansion",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Linear thermal expansion with a constant coefficient and no mechanical constraint.",
      "url": "/calculators/thermal-expansion/",
      "version": "45f9b0a5f4990d597c1e55b4ae7270c7b7959c0537094d890c1c6b21f88a5b1e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expansion coefficient (1/K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Temperature change (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Length change (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        },
        {
          "key": "result_2",
          "label": "Final length (m)",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Linear thermal expansion with a constant coefficient and no mechanical constraint."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Length change (m)",
          "text": "a × b × c"
        },
        {
          "label": "Final length (m)",
          "text": "a × (1+b × c)"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 1,
            "b": 0.000012,
            "c": 100
          },
          "outputs": [
            {
              "label": "Length change (m)",
              "value": 0.0012000000000000001
            },
            {
              "label": "Final length (m)",
              "value": 1.0012
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "id": "CC-500",
      "name": "Arrhenius rate ratio",
      "category": "Chemistry and scientific quantities",
      "status": "review_hold",
      "purpose": "Arrhenius ratio assuming constant activation energy and pre-exponential factor over the temperature range.",
      "url": "/calculators/arrhenius-rate-ratio/",
      "version": "74bf9c3303570ffd63fdefebb8ecb25d62a76e063f2867799bd6278946cb5c51",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Activation energy (kJ/mol)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Initial temperature (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Final temperature (K)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        }
      ],
      "outputs": [
        {
          "key": "result_1",
          "label": "Rate constant ratio",
          "type": "number",
          "unit": null,
          "type_status": "observed_default_only"
        }
      ],
      "assumptions": [
        "Arrhenius ratio assuming constant activation energy and pre-exponential factor over the temperature range."
      ],
      "constraints": {
        "relations": [],
        "runtime_validator": "engine.parse and calculator guards",
        "additional_runtime_constraints": true
      },
      "dependencies": {
        "engine_modules": [
          "engine.mjs",
          "math.mjs",
          "expansion-math.mjs"
        ],
        "external_services": [],
        "tool_dependencies": []
      },
      "method": [
        {
          "label": "Rate constant ratio",
          "text": "exp(a × 1000 ÷ 8.314462618 × (1 ÷ b-1 ÷ c))"
        }
      ],
      "example_questions": [],
      "retrieval_phrases": [],
      "examples": [
        {
          "label": "Reference example; never silently used for missing inputs",
          "inputs": {
            "a": 50,
            "b": 300,
            "c": 310
          },
          "outputs": [
            {
              "label": "Rate constant ratio",
              "value": 1.9090878542285181
            }
          ]
        }
      ],
      "verification": {
        "expert_certified": false,
        "review_gate": "Subject-specialist review before public launch; dimensional analysis; constants and assumptions sourced; independently checked examples; educational scope.",
        "evidence_url": "/quality-report.json"
      }
    },
    {
      "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": "282a1a5be1102f9f4e941ceb401653438bb02650a65806efd30e5b8100f6c3e1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Window width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Finished drop (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Fullness ratio",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Usable width per fabric drop after side hems and seams (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Combined top and bottom allowance (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Finished curtain panels",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b159399509100de43a3dcc1901a4199ff5ebb232e8adfb55a469be4911033d67",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Quilt width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Quilt length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Overhang on every edge (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable fabric width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Seam allowance on each joined edge (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "237fb97a5b81b1d8414576f64de36e182cec3b6285a786fc17502f9e2b6df95d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Quilt perimeter (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cut binding strip width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable fabric width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Length lost at each strip join (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Extra length for corners and final closure (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-504",
      "name": "Half-square triangle cutting",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Half-square triangle cutting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "46e1d2afeb7e37e2910a6723b2156546b00121ace17be46b4d2105fb973d4f9c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Finished block width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Finished block height (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Rows",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Columns",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Finished sashing width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Finished outer border width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0d011394b19cbd350e1170b1cb50e8aa72540b04f5d474e54bc47859473b75c8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Finished width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Finished length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Width shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Length shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-507",
      "name": "Bias binding yield",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Bias binding yield",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "64b8f4a09152c507dc3e382c840bd8cf967f296a3fb17259e29e9d3aae720c6e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Panel cut lengths (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Pattern repeat (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Matching policy (each or shared)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e5c88260a2b1f6481d3a5df2d96058d8212c6ba9febf0edb39e7323115588b46",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fabric width after edge hems (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target finished width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Knife pleats",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Unpleated margin at each end (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f7baf5d5ee1f1bfe7b8d0a50595ae3c662b32029dcb8094b72846ebe391babce",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Finished trim length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Gathering ratio",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable strip length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Seam allowance at each joining edge (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Combined allowance for the two exposed ends (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dd5b7825313c317bd69271c7fb7cd3ffc4e11953ff13481cbf2b30ed4ffb0896",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Body circumference (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Reduction from body (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overlap (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6a34e268bc8c2396d90801cd36a47c7bc193496eaf5bd5b9217e30b2ef9daa65",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Placket length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Top offset (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bottom offset (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Button count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-513",
      "name": "Zipper pouch cutting planner",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Zipper pouch cutting planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-514",
      "name": "Tote bag pattern dimensions",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Tote bag pattern dimensions",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-515",
      "name": "Circular skirt fabric layout",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Circular skirt fabric layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "02f8b2d2f56f1ceab742760e1e3cf30294d9182037ac66eaf064a9a4c8780ce2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original stitches per 10 cm",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured stitches per 10 cm",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Original stitches",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Original rows per 10 cm",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Measured rows per 10 cm",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Original rows",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-517",
      "name": "Sweater stitch distribution",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Sweater stitch distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-518",
      "name": "Knitting increase spacing",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Knitting increase spacing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-519",
      "name": "Knitting decrease spacing",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Knitting decrease spacing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "11fec377832f1521e0266cbc197ecac2c3b81392d92195e339b2131b26f62694",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original yarn length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Original yarn weight (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Original total weight (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Replacement skein length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Replacement skein weight (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-521",
      "name": "Crochet blanket repeat planner",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Crochet blanket repeat planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "88125e4ab60b803e734cc0b8b2a1918d493000a5f93e58b52c6b45fe414ecb59",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Design width (stitches)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Design height (stitches)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fabric count per inch",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Threads or blocks per stitch",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Margin each side (inches)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3393316341fefa0f891ec7086da8204665491420baded0cadc26653df1db425c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sample thread used (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sample stitch count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Design stitch count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reserve (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Usable skein length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c2c29dcd9b0f3fbfd8ca60b2bb0aed6557f700d60d9c476de2a1cb3c11411005",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Finished cloth length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Loom waste (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Take-up as percentage of loom length (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Wet-finish shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional sample warp (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Warp ends",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-525",
      "name": "Weaving sett and reed threading",
      "category": "Sewing, knitting and textile crafts",
      "status": "planned",
      "purpose": "Weaving sett and reed threading",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6fcac2f0f88cce4db7f715d77c1d42a869dcc153f16b7f1665f1f145a2ba273c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Board quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Thicknesses (inches)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Widths (inches)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Lengths (feet)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-527",
      "name": "Linear cut stock optimizer",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Linear cut stock optimizer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-528",
      "name": "Sheet panel cutting layout",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Sheet panel cutting layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "9d276c3f3034835efc0759d7c6eb8176b898adf3abc003dc5841d35a4c0beac9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Panel thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Clearance (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cutter diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-530",
      "name": "Rabbet joint dimensions",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Rabbet joint dimensions",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-531",
      "name": "Box joint finger layout",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Box joint finger layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "53a3bbe9b3b49702292c278845954253fe063ca1d79ca37fb58769e51684b0b3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Slope rise",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Slope run",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Board thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-533",
      "name": "Mitered polygon frame",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Mitered polygon frame",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-534",
      "name": "Compound miter setup",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Compound miter setup",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-535",
      "name": "Segmented bowl ring",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Segmented bowl ring",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4841f3ca101cb213cfd75e2d79ca6f39dda39e0044e3cb1fa57a8ab339fa7cc1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Workpiece length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Start width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "End width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5c50fd37e10187719fcb3aa867cc747c872f6c08cf259441be507ba666237581",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Guide bushing outside diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cutter diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Rectangular template width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Rectangular template height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Follow inside opening (1) or outside template (2)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ae4422acab04a2490d2c52e684c4acdce493189168a0662a7dccc4623d7464cd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target circle diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cutter diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Keep disk (1) or make hole (2)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-539",
      "name": "Hinge cup layout",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Hinge cup layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c9fe217615c1796f88c49165d0af99e7a903ecae72d9f13003fa9b8f27227282",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Opening width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Slide clearance each side (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Wall thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "70fd209f6415b0a2daa866cd8a6ec5eb8b880d243ea6076e794ea75c22c32738",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cabinet height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "First hole offset from bottom (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hole pitch (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Top clearance (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Excluded zone starts (mm; 0 for none)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "f",
          "label": "Excluded zone ends (mm; 0 for none)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "353074b1641f84ac89e64d3f3fe4db49bc832634be98d65a3532c9277ac6f0ca",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Opening width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Opening height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Groove depth each edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Clearance each edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Total width movement reserve (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Total height movement reserve (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d823fc88e5381e4e2b7975f41ddda35350b50fa7e1123841601427b0bcda790a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Board width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Moisture change (percentage points)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Movement coefficient per percentage point",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-544",
      "name": "Table leg splay footprint",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Table leg splay footprint",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "11784d26c1377477f8c1ed8358282f4e688ce5f3f78159f60b605140789c9834",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Stock length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Stock width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Stock thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Blank length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Blank width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Blank thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "g",
          "label": "Saw kerf (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-546",
      "name": "Drill speed from cutting speed",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Drill speed from cutting speed",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f7c73f06ccc532930dcb5d63e9abf6f9d4bcde6c54d4b98f1b25e921b7939fd2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pilot diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Head diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Included angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-548",
      "name": "Drill tap selection check",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Drill tap selection check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-549",
      "name": "Belt length for two pulleys",
      "category": "Woodworking and workshop layout",
      "status": "planned",
      "purpose": "Belt length for two pulleys",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "1dc3a832e4d1116f677ffb430495eca03912e665ea8eedfb76b82072668617ef",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pack prices (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Discs in each pack",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured minutes of use per disc",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "15c9e896c808396695f809b9fbac5daa6efa90b6df52d4e54453f29548686392",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Material used (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Material price (£/kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Print hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Mean power (W)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Electricity (£/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Labour hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Labour rate (£/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "h",
          "label": "Allocated overhead (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "i",
          "label": "Markup (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8c6d10fae51377e49ace0d20623d62bc47db7b084a466de0056e5e5d2e77b148",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gross spool mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Empty spool mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Material density (g/cm³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Filament diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-553",
      "name": "Filament spool change estimate",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "Filament spool change estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "56b34235d946a43682bc45774794028dc3df5a7d496b3f91f14acb3dbf5de364",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Commanded length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Current steps per mm",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6c794237732cd6402ca8ddf3177de10b7e22451b26ff39f755750d63672bfe2d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target wall width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured wall width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Current flow multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "531c39110dcb725524b9c46919ae5d8e86a000e3aa56ecfe0f0b0a47c3816971",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal test length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured test length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Current steps per mm",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-557",
      "name": "Resin exposure ladder planner",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "Resin exposure ladder planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-558",
      "name": "Resin print wash throughput",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "Resin print wash throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "261bb24985dcd0fbe391287623d114f7a8efb5415d42bea1fbe60a2e9fa68947",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Object height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "First layer (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Regular layer (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-560",
      "name": "Variable layer schedule",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "Variable layer schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b37b85c3186557552f9409683c85b400330db707e2f9d960e042c56ee5909e58",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Line width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Layer height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tested volumetric limit (mm³/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "95c117cc9bb5b401d26c9e1ba98ab995640bac4fc35167521a3032255aefaccd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Volumetric flow (mm³/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Filament diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "487b92d1ee0c010812960bf40c28c758c691fc90001ff7d9f576eeab0e0f9b01",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal test holes (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured test holes (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Fit model (offset or scale)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Desired finished hole (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d23f2585e44f5fbc06213a7e9a7b8112d5c855d3823d792774087e6d646d308e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target X (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Target Y (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target Z (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "X shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Y shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Z shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "97677b77e3f99fcc111793a251f0e89492a508114569305a09bcf3118bd04caf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Layer height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired Z gap (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rounding policy (up, nearest, down)",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-566",
      "name": "Print bed batch arrangement",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "Print bed batch arrangement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "41d2a6f736882bf15a93d3b7497f879a5fca0fef47a3648fe2b69606937dc881",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current closed-mesh volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target volume",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c62c71cd611d4376f416db36143dbf9f22b7c98ec3279545eb4521cc96c76f5a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Box X (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Box Y (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Box Z (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Voxel pitch (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Bytes per voxel",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d8f66a95fa2c9d6a33e0b6a7f4ff58cf51615b0a08cedc16db81b89da48a0701",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Triangles",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Header metadata bytes used",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-570",
      "name": "Laser kerf joint compensation",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "Laser kerf joint compensation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-571",
      "name": "Laser cut job time",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "Laser cut job time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-572",
      "name": "CNC chip load planner",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "CNC chip load planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-573",
      "name": "CNC step-over scallop height",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "CNC step-over scallop height",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-574",
      "name": "CNC pocket pass count",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "CNC pocket pass count",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-575",
      "name": "Machining material removal rate",
      "category": "3D printing and digital fabrication",
      "status": "planned",
      "purpose": "Machining material removal rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ce7fc02f2fcbdee1f05b521c745ff4d630089c2da3c6dc8b7aec86bd9301b29d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "midi",
          "label": "MIDI note number (0-127)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "reference_hz",
          "label": "Reference frequency for MIDI 69 (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-577",
      "name": "Frequency to nearest note",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Frequency to nearest note",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "209ab8c4b05e52bc58a307e79c59874cb78b241a786cba63c2eb177d80cc2774",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "from_hz",
          "label": "From frequency (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "to_hz",
          "label": "To frequency (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0a99593fa9337fc549c1793b22094a494a3295b7aa42d09dbdf9f745312ebc07",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "start_bpm",
          "label": "Start tempo (BPM)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "target_bpm",
          "label": "Target tempo (BPM, >= start)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "step_bpm",
          "label": "Step per stage (BPM)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "repetitions",
          "label": "Repetitions per stage",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "beats_per_repetition",
          "label": "Beats per repetition",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b9a1064c3eec09a369b46276baef7b3a9c63b6edbfe60aa3d104421e4df11363",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "bars",
          "label": "Bars per section (comma-separated)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "beats_per_bar",
          "label": "Beats per bar per section (comma-separated)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "bpm",
          "label": "Tempo per section (BPM, comma-separated)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "11f4937071900ac97f743b7500878cba16370d9d7c43fa18d59978e55448b223",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "bpm",
          "label": "Beat tempo (BPM)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "events_per_beat",
          "label": "Events per beat (subdivision or tuplet)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "79a016b0cbe39b8a9c9f5568b460499e0aa2857bf3e5b3839d5a9224b091b632",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "left",
          "label": "Left rhythm event count (1-1000)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "right",
          "label": "Right rhythm event count (1-1000)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "cycle_seconds",
          "label": "Cycle length (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6888d2ee200202a463226034d21e75144490b4752f23ebb694b6ef9606f99b10",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "bpm",
          "label": "Beat tempo (BPM)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "long_parts",
          "label": "Long part (ratio numerator)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "short_parts",
          "label": "Short part (ratio denominator)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2d91a352174e89848060aabc534f7a2a39ed8cd2b41905f171f231fb8bbfe858",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "timestamps",
          "label": "Tap timestamps in seconds (comma-separated, increasing)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-585",
      "name": "Musical transposition",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Musical transposition",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-586",
      "name": "Instrument concert pitch",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Instrument concert pitch",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-587",
      "name": "Scale degree mapper",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Scale degree mapper",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-588",
      "name": "Chord inversion voicings",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Chord inversion voicings",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c9e6ab86a9f824ea36d31bd219e2fed6b0aee6775392fb8cb15a7a3b4b018e6d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "scale_mm",
          "label": "Scale length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "frets",
          "label": "Number of frets (1-48)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e3149d1b734a565230287cd3aa02300ef37c90906e63347bd8c9835b59839192",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "length_m",
          "label": "Vibrating length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "frequency_hz",
          "label": "Target frequency (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "linear_density_kg_m",
          "label": "Linear density (kg/m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-591",
      "name": "String gauge substitution",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "String gauge substitution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-592",
      "name": "Drum head mode ratio explorer",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Drum head mode ratio explorer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-593",
      "name": "Room axial mode explorer",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Room axial mode explorer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "26713dc38e547d9734a014025032c4a798df91102666712dec3033034b1b1b70",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Path-length difference (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sound speed (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f188c5d046c0e954fbd5f2ced11e611e95f28f1ce0e533eee09dc7c513db5804",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sample rate (Hz)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Delay samples",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "af66981883552778a7c5d3d30488d30f910c285b8a5d56ae403e6808df80d306",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Microphone separation (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Angle from broadside (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Sound speed (m/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-597",
      "name": "Comb filter notch frequencies",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Comb filter notch frequencies",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-598",
      "name": "Audio pan law gain",
      "category": "Music and sound production",
      "status": "planned",
      "purpose": "Audio pan law gain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "9d45c6215523795c31c0a276ad2fefaf59959333e92f7191b6e21f4c8928c8f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Input level (dB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Threshold (dB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Compression ratio",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Makeup gain (dB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6508de0db116d40d904c202ccddf85e3ae8e480d9c15f45a6a4f92ef98dc9fed",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured true peak (dBTP)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Desired ceiling (dBTP)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Proposed gain (dB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2d4c080dbb39bdfb53726244a250997a5c172b6104879cbd7e1e374c6d970029",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Guests to seat",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Seats per table",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Additional seats held empty",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Spare empty tables",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c0df546e9acd20019b5dd3eeeb2e5429471098a82c6e5f21f9b92cbd6ca5b82f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Table diameter (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Required place-setting arc width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable circumference (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-603",
      "name": "Venue aisle grid fit",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Venue aisle grid fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "33b164320c1f11113c6b5725c75b01f51d026c2c0f5adbe763ee50c490591563",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Invitations by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Expected response rates (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Low-scenario rate adjustment (percentage points)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "High-scenario rate adjustment (percentage points)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "95d90ae1e58577ad6230d4c5dfdb852d4325fceacbe65ae4be49f36a564dca0b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Arrivals by interval",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Interval length (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured processing time per guest (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Open lanes",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1badcff27129149e4b9363374378b55f04977bd44fa1dbeb5c3a52a16d44d8a1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Forecast arrivals by interval",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Interval length (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured handling time (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Target staff utilization (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-607",
      "name": "Event badge sheet layout",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Event badge sheet layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-608",
      "name": "Event programme schedule",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Event programme schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c4de3638f29972afefbf6b73b1f39c9c16096e2855b3306222364eb7df251c91",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "People in each group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Setup minutes per group",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Photo minutes per person",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Travel/transition minutes by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Available session minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-610",
      "name": "Conference room rotation",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Conference room rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-611",
      "name": "Buffet serving line capacity",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Buffet serving line capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6d1a052c402d771206edd126c9995d9a7e30d4dc21cf25002b5a6fa0633ea842",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Guests",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Servings per guest by drink type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Servings per package by drink type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Spare allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1c6848ce43bd49e6c5313a0b3a7a4800c59efb02b6b99733901797cbb8da0670",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Guests",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Servings per guest",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Ice per serving (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Extra chilling reserve (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Ice bag weight (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b763fc78c6fa4ac00b260b8f4b2317d0f664e6af10a4161f75fe8e4aa3df7d8d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Round tier diameters (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Serving width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Serving depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Cutting loss allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "16a01854517eeeaffeb2e213dcb83ed9d07bdaff657bf449906d25b0e1c878bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Garland length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured balloons per metre",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Size mix weights in your chosen order",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Spare percentage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6ae30f92e3c4721ce972a34fe5d2125fdc50b9d658341db9fcff91729e62441d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Spherical balloon diameters (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Balloon counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Usable helium per cylinder (m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Fill allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a94ff7ca3d799a6885bef23a28978ecc3364509b719b3cf3fbd7479809b0ba16",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Anchor-to-anchor spans (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Sag allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Unlit lead length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable length per string (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Spare allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c81d70ce6179e711ddc3682a530c5e3ad419ea52f32299f15d5d1cf6e3420e4f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Households receiving invitations",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Guests receiving individual inserts",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Invitations per household",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Inserts per guest",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Extra invitations",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Extra inserts",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9c1c470b51e7b14e41e300af2de97aad843640053f00043e2efa64659f1b281d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Guests by departure window",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Vehicle passenger capacity",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Round-trip cycle time (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Departure window length (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9711a4d359b3d9fd1e2cb42075209031022ed9e227b39508de6aae17abebe1c3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Vehicles",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bay width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Bay depth (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Shared aisle width (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional circulation allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d91a5d6ce76016a966ca7d7b6ac941f5722fa5fcd125e84d13386219ea29c695",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Expected coats",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Places per rack",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Extra capacity reserve (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-622",
      "name": "Volunteer shift assignment capacity",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Volunteer shift assignment capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-623",
      "name": "Prize pool distribution",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Prize pool distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-624",
      "name": "Silent auction bid increment",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Silent auction bid increment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-625",
      "name": "Event cancellation break-even",
      "category": "Events and group planning",
      "status": "planned",
      "purpose": "Event cancellation break-even",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f435fb13428f8bbb6867a882ccd0fe4169205b4764fd75274d3d337f75e4d0ec",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Length after carrier rounding (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Width after carrier rounding (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Height after carrier rounding (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Carrier divisor (cm³/kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Actual weight (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Billing increment (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-627",
      "name": "Carton packing proposal",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Carton packing proposal",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-628",
      "name": "Pallet carton arrangement",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Pallet carton arrangement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-629",
      "name": "Container loading estimate",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Container loading estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-630",
      "name": "Pallet wrap consumption",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Pallet wrap consumption",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "75d2266624a9017a0c0b397c454e11db3d51d535997816d350228db64bd5d56e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Roll length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Label pitch including gap (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Unusable leader (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Unusable trailer (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "47224bb7d08adce29933c5811f0e05515ade7266642c94cb8dea99e4a00cdfb6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Carton length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Carton width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Tape extension at each end of a strip (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Centre seal (1) or H seal (2)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Cartons",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Tape roll length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1d98403eccc79b160bb593de3bb266239793e0adf03152daa70d32bc534393bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Internal box length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Internal width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Internal height (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Packed item displacement (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fill bulk density (g/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-634",
      "name": "Carton board area",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Carton board area",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-635",
      "name": "Parcel surcharge comparison",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Parcel surcharge comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "cbc20fafcde1e9ecb6934000e9dfc106acff801066e0e84fad54c96e12e55fea",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Shift length (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Average driving time per stop (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average service time per stop (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Breaks (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fixed depot travel and preparation (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-637",
      "name": "Warehouse pick path distance",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Warehouse pick path distance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-638",
      "name": "Warehouse pick wave capacity",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Warehouse pick wave capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-639",
      "name": "Dock door scheduling capacity",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Dock door scheduling capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "17a421977ee4d5dcab059c237b541c392540bdbd7d53434615f9837edc6005f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Units to handle",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Handling minutes per unit",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Crew size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Setup minutes for full crew",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-641",
      "name": "Inventory cycle count schedule",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Inventory cycle count schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-642",
      "name": "Warehouse bin capacity",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Warehouse bin capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-643",
      "name": "ABC inventory classification",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "ABC inventory classification",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e8d5fff2ce2f2b84e6833b166764d83b5b16d6f4193f88f4e08580e618fe7855",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Stock values (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Ages (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Annual holding cost (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Recovery value (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-645",
      "name": "Inventory shrinkage reconciliation",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Inventory shrinkage reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-646",
      "name": "Return processing capacity",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Return processing capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-647",
      "name": "Reverse logistics recovery",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Reverse logistics recovery",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-648",
      "name": "Shipment consolidation threshold",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Shipment consolidation threshold",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-649",
      "name": "Freight emissions scenario",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Freight emissions scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-650",
      "name": "Warehouse slotting priority",
      "category": "Shipping and warehouse planning",
      "status": "planned",
      "purpose": "Warehouse slotting priority",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-651",
      "name": "Takt time planner",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Takt time planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-652",
      "name": "Assembly line balancing",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Assembly line balancing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-653",
      "name": "Bottleneck throughput",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Bottleneck throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-654",
      "name": "Little's law work-in-progress",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Little's law work-in-progress",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-655",
      "name": "First-pass yield",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "First-pass yield",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-656",
      "name": "Rolled throughput yield",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Rolled throughput yield",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-657",
      "name": "Scrap and rework cost",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Scrap and rework cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-658",
      "name": "Defects per million opportunities",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Defects per million opportunities",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-659",
      "name": "Process capability Cp and Cpk",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Process capability Cp and Cpk",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-660",
      "name": "Process performance Pp and Ppk",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Process performance Pp and Ppk",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-661",
      "name": "Measurement bias estimate",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Measurement bias estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-662",
      "name": "Gauge repeatability study",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Gauge repeatability study",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-663",
      "name": "Gauge reproducibility study",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Gauge reproducibility study",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-664",
      "name": "Tolerance stack worst case",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Tolerance stack worst case",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-665",
      "name": "Tolerance stack root sum square",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Tolerance stack root sum square",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-666",
      "name": "Statistical control limits for individuals",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Statistical control limits for individuals",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-667",
      "name": "X-bar and R control limits",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "X-bar and R control limits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-668",
      "name": "Attribute p-chart limits",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Attribute p-chart limits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-669",
      "name": "Attribute c-chart limits",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Attribute c-chart limits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-670",
      "name": "Acceptance sampling operating curve",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Acceptance sampling operating curve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-671",
      "name": "Machine changeover batch tradeoff",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Machine changeover batch tradeoff",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-672",
      "name": "Tool life Taylor estimate",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Tool life Taylor estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-673",
      "name": "Calibration interval drift planner",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Calibration interval drift planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-674",
      "name": "Measurement resolution ratio",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Measurement resolution ratio",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-675",
      "name": "Supplier defect comparison",
      "category": "Manufacturing and quality measurement",
      "status": "planned",
      "purpose": "Supplier defect comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-676",
      "name": "Field seed population",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Field seed population",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-677",
      "name": "Row crop seeding spacing",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Row crop seeding spacing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-678",
      "name": "Seed drill calibration",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Seed drill calibration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-679",
      "name": "Greenhouse bench layout",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Greenhouse bench layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-680",
      "name": "Nursery potting media demand",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Nursery potting media demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-681",
      "name": "Nursery tray production schedule",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Nursery tray production schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-682",
      "name": "Transplant succession schedule",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Transplant succession schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-683",
      "name": "Crop thermal time",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Crop thermal time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-684",
      "name": "Harvest labour capacity",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Harvest labour capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-685",
      "name": "Field work capacity",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Field work capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-686",
      "name": "Tractor wheel slip",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Tractor wheel slip",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-687",
      "name": "Sprayer water-only calibration",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Sprayer water-only calibration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-688",
      "name": "Irrigation distribution uniformity",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Irrigation distribution uniformity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-689",
      "name": "Irrigation water balance",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Irrigation water balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-690",
      "name": "Drip pressure zone comparison",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Drip pressure zone comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-691",
      "name": "Harvest moisture adjustment",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Harvest moisture adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-692",
      "name": "Grain bin geometric capacity",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Grain bin geometric capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-693",
      "name": "Silage clamp volume",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Silage clamp volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-694",
      "name": "Hay bale inventory",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Hay bale inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-695",
      "name": "Orchard yield projection",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Orchard yield projection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-696",
      "name": "Crop packout reconciliation",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Crop packout reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-697",
      "name": "Farm gross margin by crop",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Farm gross margin by crop",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-698",
      "name": "Harvest container planning",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Harvest container planning",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-699",
      "name": "Field trial plot layout",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Field trial plot layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-700",
      "name": "Propagation batch survival",
      "category": "Farming and growing operations",
      "status": "planned",
      "purpose": "Propagation batch survival",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-701",
      "name": "Telescope magnification",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Telescope magnification",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-702",
      "name": "Telescope exit pupil",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Telescope exit pupil",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-703",
      "name": "Telescope true field of view",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Telescope true field of view",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-704",
      "name": "Telescope angular resolution",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Telescope angular resolution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-705",
      "name": "Astronomy camera pixel scale",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Astronomy camera pixel scale",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-706",
      "name": "Astronomy sensor sky coverage",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Astronomy sensor sky coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-707",
      "name": "Star trail exposure estimate",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Star trail exposure estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-708",
      "name": "Sidereal drift timing",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Sidereal drift timing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-709",
      "name": "Angular object size",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Angular object size",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-710",
      "name": "Small-angle distance estimate",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Small-angle distance estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-711",
      "name": "Distance modulus",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Distance modulus",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-712",
      "name": "Stellar magnitude flux ratio",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Stellar magnitude flux ratio",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-713",
      "name": "Combined stellar magnitude",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Combined stellar magnitude",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-714",
      "name": "Telescope limiting magnitude comparison",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Telescope limiting magnitude comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-715",
      "name": "Astronomy exposure stacking signal",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Astronomy exposure stacking signal",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-716",
      "name": "Dark frame library coverage",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Dark frame library coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-717",
      "name": "Astronomy mosaic coverage",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Astronomy mosaic coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-718",
      "name": "Equatorial coordinate format",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Equatorial coordinate format",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-719",
      "name": "Hour angle converter",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Hour angle converter",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-720",
      "name": "Altitude from equatorial coordinates",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Altitude from equatorial coordinates",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-721",
      "name": "Airmass approximation",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Airmass approximation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-722",
      "name": "Synodic period",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Synodic period",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-723",
      "name": "Kepler orbital semimajor axis",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Kepler orbital semimajor axis",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-724",
      "name": "Orbital eccentricity from apsides",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Orbital eccentricity from apsides",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-725",
      "name": "Astronomical redshift conversion",
      "category": "Astronomy and sky observation",
      "status": "planned",
      "purpose": "Astronomical redshift conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-726",
      "name": "Dew point estimate",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Dew point estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-727",
      "name": "Relative humidity from dew point",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Relative humidity from dew point",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-728",
      "name": "Absolute humidity",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Absolute humidity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-729",
      "name": "Vapour pressure deficit",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Vapour pressure deficit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-730",
      "name": "Wet-bulb temperature estimate",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Wet-bulb temperature estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-731",
      "name": "Heat index reference",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Heat index reference",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-732",
      "name": "Wind chill reference",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Wind chill reference",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-733",
      "name": "Humid air mixing ratio",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Humid air mixing ratio",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-734",
      "name": "Station pressure sea-level reduction",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Station pressure sea-level reduction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-735",
      "name": "Barometric altitude difference",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Barometric altitude difference",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-736",
      "name": "Wind rose frequency bins",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Wind rose frequency bins",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-737",
      "name": "Mean wind vector",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Mean wind vector",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-738",
      "name": "Rain gauge calibration",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Rain gauge calibration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-739",
      "name": "Snow water equivalent",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Snow water equivalent",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-740",
      "name": "Rainfall intensity duration",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Rainfall intensity duration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-741",
      "name": "Rainfall return period plotting",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Rainfall return period plotting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-742",
      "name": "Air quality averaging window",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Air quality averaging window",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-743",
      "name": "Sensor missing-data coverage",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Sensor missing-data coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-744",
      "name": "Environmental baseline anomaly",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Environmental baseline anomaly",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-745",
      "name": "Temperature lapse adjustment",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Temperature lapse adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-746",
      "name": "Cloud base estimate",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Cloud base estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-747",
      "name": "Meteorological visibility extinction",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Meteorological visibility extinction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-748",
      "name": "Sound exposure energy average",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Sound exposure energy average",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-749",
      "name": "Daylight duration geometric",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Daylight duration geometric",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-750",
      "name": "Surface runoff volume scenario",
      "category": "Weather and environmental observations",
      "status": "planned",
      "purpose": "Surface runoff volume scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-751",
      "name": "Polynomial roots explorer",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Polynomial roots explorer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-752",
      "name": "Polynomial long division",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Polynomial long division",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-753",
      "name": "Partial fraction decomposition",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Partial fraction decomposition",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-754",
      "name": "Function root by bisection",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Function root by bisection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-755",
      "name": "Newton root iteration",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Newton root iteration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-756",
      "name": "Numerical definite integration",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Numerical definite integration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-757",
      "name": "Numerical differentiation",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Numerical differentiation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-758",
      "name": "Lagrange interpolation",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Lagrange interpolation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-759",
      "name": "Cubic spline interpolation",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Cubic spline interpolation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-760",
      "name": "Least-squares polynomial fit",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Least-squares polynomial fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-761",
      "name": "Simpson integration from samples",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Simpson integration from samples",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-762",
      "name": "Euler differential equation solver",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Euler differential equation solver",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-763",
      "name": "Runge-Kutta differential equation solver",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Runge-Kutta differential equation solver",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-764",
      "name": "Vector dot product",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Vector dot product",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-765",
      "name": "Vector cross product",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Vector cross product",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-766",
      "name": "Vector projection",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Vector projection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-767",
      "name": "Matrix eigenvalues",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Matrix eigenvalues",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-768",
      "name": "Matrix condition number",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Matrix condition number",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-769",
      "name": "LU factorization",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "LU factorization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-770",
      "name": "QR factorization",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "QR factorization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-771",
      "name": "Singular value decomposition",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Singular value decomposition",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-772",
      "name": "Linear programming simplex demo",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Linear programming simplex demo",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-773",
      "name": "Discrete Fourier transform",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Discrete Fourier transform",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-774",
      "name": "Discrete convolution",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Discrete convolution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-775",
      "name": "Quaternion rotation",
      "category": "Advanced mathematics and numerical methods",
      "status": "planned",
      "purpose": "Quaternion rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-776",
      "name": "Paired t-test",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Paired t-test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-777",
      "name": "One-sample t-test",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "One-sample t-test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-778",
      "name": "One-way ANOVA",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "One-way ANOVA",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-779",
      "name": "Repeated-measures ANOVA",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Repeated-measures ANOVA",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-780",
      "name": "Mann-Whitney rank test",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Mann-Whitney rank test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-781",
      "name": "Wilcoxon signed-rank test",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Wilcoxon signed-rank test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-782",
      "name": "Kruskal-Wallis test",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Kruskal-Wallis test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-783",
      "name": "Fisher exact test",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Fisher exact test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-784",
      "name": "McNemar paired proportion test",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "McNemar paired proportion test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-785",
      "name": "Cohen kappa agreement",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Cohen kappa agreement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-786",
      "name": "Weighted kappa agreement",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Weighted kappa agreement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-787",
      "name": "Intraclass correlation study",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Intraclass correlation study",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-788",
      "name": "Cronbach alpha",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Cronbach alpha",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-789",
      "name": "Standardized mean difference",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Standardized mean difference",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-790",
      "name": "Odds ratio interval",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Odds ratio interval",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-791",
      "name": "Risk ratio interval",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Risk ratio interval",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-792",
      "name": "Risk difference interval",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Risk difference interval",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-793",
      "name": "Two-proportion comparison",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Two-proportion comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-794",
      "name": "A/B test minimum detectable effect",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "A/B test minimum detectable effect",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-795",
      "name": "A/B test power estimate",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "A/B test power estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-796",
      "name": "Multiple testing correction",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Multiple testing correction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-797",
      "name": "Bootstrap confidence interval",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Bootstrap confidence interval",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-798",
      "name": "Permutation test",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Permutation test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-799",
      "name": "Survival Kaplan-Meier estimate",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Survival Kaplan-Meier estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-800",
      "name": "Meta-analysis effect pooling",
      "category": "Research design and statistical diagnostics",
      "status": "planned",
      "purpose": "Meta-analysis effect pooling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-801",
      "name": "Reynolds number",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Reynolds number",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-802",
      "name": "Pipe velocity from flow",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Pipe velocity from flow",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-803",
      "name": "Darcy-Weisbach pressure loss",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Darcy-Weisbach pressure loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-804",
      "name": "Hazen-Williams water loss",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Hazen-Williams water loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-805",
      "name": "Colebrook friction factor",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Colebrook friction factor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-806",
      "name": "Minor fitting pressure loss",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Minor fitting pressure loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-807",
      "name": "Pipe equivalent fitting length",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Pipe equivalent fitting length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-808",
      "name": "Pump hydraulic power",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Pump hydraulic power",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-809",
      "name": "Pump affinity scenario",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Pump affinity scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-810",
      "name": "Net positive suction head available",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Net positive suction head available",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-811",
      "name": "Open channel Manning flow",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Open channel Manning flow",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-812",
      "name": "Hydraulic diameter",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Hydraulic diameter",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-813",
      "name": "Froude number",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Froude number",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-814",
      "name": "Orifice ideal discharge",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Orifice ideal discharge",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-815",
      "name": "Tank drain time",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Tank drain time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-816",
      "name": "Weir discharge estimate",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Weir discharge estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-817",
      "name": "Nozzle jet velocity",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Nozzle jet velocity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-818",
      "name": "Thermal contact resistance",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Thermal contact resistance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-819",
      "name": "Heat conduction through layered wall",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Heat conduction through layered wall",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-820",
      "name": "Cylindrical insulation heat flow",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Cylindrical insulation heat flow",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-821",
      "name": "Thermal diffusivity",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Thermal diffusivity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-822",
      "name": "Biot number",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Biot number",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-823",
      "name": "Log mean temperature difference",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Log mean temperature difference",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-824",
      "name": "Heat exchanger effectiveness",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Heat exchanger effectiveness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-825",
      "name": "Psychrometric sensible heat load",
      "category": "Fluids and thermal engineering",
      "status": "planned",
      "purpose": "Psychrometric sensible heat load",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-826",
      "name": "Weighted course grade",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Weighted course grade",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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"
      }
    },
    {
      "id": "CC-828",
      "name": "Grade boundary scenario",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Grade boundary scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-829",
      "name": "GPA with custom grade scale",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "GPA with custom grade scale",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": 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": "d141d44f10e06bf9efbd5f6e4d09a979c6e0aedcafd1cd65cc2cc76621756512",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Completed credits",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Accumulated quality points",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Future credits",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Target GPA",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Maximum GPA",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c53b0ff19e94331343c0051b031a29f9f6ca8bc46afe91f0e1156d47b2a32b93",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Correct answers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Wrong answers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Omitted answers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reward per correct",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Penalty per wrong",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Score per omitted",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bcebaf441d3150d59fb385a0814f5f5369593974351bb0134363fd7623ff4388",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Answer options",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Reward if correct",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Penalty if wrong",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Success probability (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Score for skipping",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-833",
      "name": "Study timetable allocation",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Study timetable allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-834",
      "name": "Spaced review schedule",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Spaced review schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-835",
      "name": "Flashcard backlog clearing",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Flashcard backlog clearing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4bf7ae109e7d8380aaa2762a49f1dbb17f73cacb74145d1a6a3473010f9bd721",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required study hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Completed study hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Remaining study days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sessions per study day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-837",
      "name": "Course workload by week",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Course workload by week",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-838",
      "name": "Reading list completion plan",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Reading list completion plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b53bba8575abc55b4e89591603d900cd411d6d6bc1a8378ddd344d6bb33eb7f4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Recording lengths (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Playback speeds",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Pause and note allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-840",
      "name": "Vocabulary retention estimate",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Vocabulary retention estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-841",
      "name": "Quiz topic coverage",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Quiz topic coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-842",
      "name": "Rubric score calculator",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Rubric score calculator",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7264c797fe46d5bd83201f5bce6dbc7d5c5f08691b90c7c23ac7f3a85c37300f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sessions held",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Sessions attended",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Sessions remaining",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Required attendance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a664994ca41a39179aac90ea792935a1755e2d848250dbd7aef6a55d5ee75068",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Students",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired group size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Minimum group size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Maximum group size",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-845",
      "name": "Peer assessment normalization",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Peer assessment normalization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-846",
      "name": "Assignment late-penalty scenarios",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Assignment late-penalty scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "bdf5e7294158c8f1bbe06c392dfcb203838b3ab707cb453b67d5fc79de89bf6c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Section marks",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Exam minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reading reserve (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Review reserve (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ef6132f40aca562c1360de8e4f39cdc009d3d4c541eb083810813f61b3bb16a8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pages per student",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Class sizes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Sides per sheet (1 or 2)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Spare complete copies",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cost per sheet (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-849",
      "name": "Student loan-free term budget",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Student loan-free term budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-850",
      "name": "Marking workload planner",
      "category": "Education and learning planning",
      "status": "planned",
      "purpose": "Marking workload planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "eb22c4876116315b259e0641b83b84844f140b18cfc2a1bb87a115a3046462ab",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Asset counts by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Compressed bytes per asset in each group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Repeat-visit cache hit percentages by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4a4e891933df4c75900bc21550c100bf80c155c5d32cfa89c16f50385ed4cb22",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Image byte sizes in page order",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Initially loaded image numbers (1-based)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Remaining images reached by scrolling (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "959909a09ccda0301035a82770baf3a4915a69dc920c5e343e5508ab3850dd06",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rendered slot widths (CSS px)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Device pixel ratios for those slots",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Available source widths (image px)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0d659274739ea7bc644c4065f696442838d346a8d3b7b2f2b934e924cbe80254",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original font bytes by weight",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Subset font bytes by weight",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Visits",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Visits with all fonts cached (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-855",
      "name": "HTTP request latency model",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "HTTP request latency model",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "99810641f6e29be9a7c5b9eb1fa8ec3fcf05e5808ca46604410a35ae04b1f335",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Requests",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cache hit rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Origin cost per 1,000 requests (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Cache lookup cost per 1,000 requests (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-857",
      "name": "Cache time-to-live freshness model",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Cache time-to-live freshness model",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e9399826d92bd24e558c67f735560a138b0bfa65fa12a66c98c92c009bf522dd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Traffic by region (decimal GB)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Price per GB by region (£)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Free GB for each region",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Requests",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Price per 10,000 requests (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Fixed fee (£)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "040144e6a6bb23779343bfb75c351c6aaf0ddb68b467e87f1c015c0e206100bc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Arrival rate (transactions/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured connection-held time (ms)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Existing connections",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Target utilization (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c3919f7d8db08c8438e546435e6687dc7885acb8383cfdc90a7522fc29635c90",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Indexed rows",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Key bytes per row",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pointer bytes per row",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Additional storage overhead (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "47533aae0e96ce98cb4431080dda1f0e85515a220d91691cb423eaadc2c6e58e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Incoming requests",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Downstream calls per request",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Downstream cache hit rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Mean attempts per uncached call",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1edf04f999aa07086f91394eda48c800c7bdca1008a451bde17bf8c5bde01d8d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Serialized bytes per record in order",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Maximum records per request",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Maximum request bytes",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Fixed envelope bytes per request",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f56765771192259b72fed04e874684e61dcbce55df9e78c1e493a29407fe2b5c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Independent failure probability per attempt (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Maximum attempts including the first",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Waits before retries (ms; 0 for one attempt)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3742cc975b7d420734355e6bbabebff32c6babcd6808e4091fe52b41374d29ab",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial retry delay (ms)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Backoff multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Delay cap (ms)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retries after the initial attempt",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "No jitter (0) or seeded full jitter (1)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Seed (1–2147483646)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-865",
      "name": "Token bucket burst simulator",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Token bucket burst simulator",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-866",
      "name": "Circuit breaker threshold simulator",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Circuit breaker threshold simulator",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-867",
      "name": "Job queue drain time",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Job queue drain time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-868",
      "name": "Worker autoscaling scenario",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Worker autoscaling scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6d7060c949a9a4db58259b884530e521e82a66aef383757039d1b0e18d188d55",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Events per day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Bytes per event",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Retention days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Target bytes per partition",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f17acb0f097749f74ae0e3478dad04a6af75cc6008978ef1e3990e670455c071",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current backlog (bytes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New data generation (bytes/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Transfer capacity (bytes/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Apply capacity (bytes/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-871",
      "name": "Error budget burn rate",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Error budget burn rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-872",
      "name": "Canary rollout sample requirement",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Canary rollout sample requirement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-873",
      "name": "Feature flag allocation buckets",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Feature flag allocation buckets",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-874",
      "name": "Timestamp identifier capacity",
      "category": "Web performance and application capacity",
      "status": "planned",
      "purpose": "Timestamp identifier capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "dc0b095d7a174cb0df6ff7d7698a6f937b917d7bb65ff8bcf3f92029cd12b0be",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Absolute drift bound (ppm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Seconds between synchronization",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Synchronization uncertainty bound (ms)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "73a8333bbc3988eb18de9dab3f9092ba6affd40ae7d45cf27b6ef92bea3e3eb5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Interior printed pages",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Measured paper caliper per leaf (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Additional binding allowance (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b9268fbbdb77b71c6f62e26523a6bdfc32c30d38d21ba599bed7438bd27a322a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Interior pages",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Permitted signature sizes (pages)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Maximum blank pages allowed",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-878",
      "name": "Booklet page imposition",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Booklet page imposition",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "73d19dc3cd8b89a860d85abcb139990bcec7983a9363970dbf684dcb1c8204c8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Trim cover width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Trim cover height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Supplied spine width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Outer bleed on each edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional hinge allowance on EACH side of spine (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b62f6576f409372c7c4291d94761ecadddbbf560395d6d77308986b760a2ad6d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Paper weight (g/m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sheets",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b14782d25d2bccd6034627b05da54bbfa310218c7141e297d5c9de0f60806351",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Folded insert width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Folded insert height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Insert thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Clearance on EACH edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-882",
      "name": "Paper grain folding planner",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Paper grain folding planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "3f3e3417fc0ec7846b914df4386a505566e4b0c9dcc3c1f7da44cacf49256994",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Press sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Press sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Flat artwork width including bleed (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Flat artwork height including bleed (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Additional leading gripper allowance (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Outer margin on every edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Gutter between artworks (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "h",
          "label": "Allow uniform rotation: no (0), yes (1)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "edd2ec7d24435ac50c9f10b145be65e14cfd5f8609be32d093402490325faaaa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Good copies required",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Startup waste copies",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Running spoilage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "297b7f4b91934f5fbbd1675f3076b57955a173eed15709414958efce904b1513",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Printed area per copy (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Equivalent full-coverage percentage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Measured full-coverage yield (m² per litre)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Printed copies",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Container size (litres)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-886",
      "name": "Screen printing stencil placement",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Screen printing stencil placement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "5462330944862dce9b70005aa2fde8358e531b05f79d09566857fb37402c6ce5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Items",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Colour passes per item",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Measured seconds per colour pass",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Flash seconds BETWEEN colour passes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Setup time (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Attended fraction of running time (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-888",
      "name": "Large-format roll nesting",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Large-format roll nesting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-889",
      "name": "Print finishing cutting sequence",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Print finishing cutting sequence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b2831f65245c1d0857b99fd0c9dee5052f8af10dd86afc50aadcc9f3f3f26ffc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Nested folded sheets",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Measured sheet caliper (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured creep multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-891",
      "name": "Casebound endpaper dimensions",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Casebound endpaper dimensions",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4e4e96102b75c5b3e392a91df0a0bf363de48cc509727bbc645e297bf31ae724",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cover panel width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cover height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Spine width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Left flap width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Right flap width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Outer bleed (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-893",
      "name": "Die-cut carton tab layout",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Die-cut carton tab layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "fc4f3f580441008700dbdfb5dcf202c74feb64fb0804ae310157acc635652168",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sticker cut width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sticker cut height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Outer margin on every edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Minimum gap between cut lines (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Allow uniform rotation: no (0), yes (1)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-895",
      "name": "Sequential ticket numbering",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Sequential ticket numbering",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a415cc580195fe47ed953cdf2482d4989eb67a1cf3706cd15702a7673c296a5e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Data records",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Templates generated per record",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Bytes per rendered record per template",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Maximum output file bytes",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Fixed bytes per file",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Maximum records per output file",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dffa22f21739f8975e0d3976f059a120d8496659ec70b2bebdf63f47ce7b2258",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Index entries",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured average lines per entry",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable lines per column",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Columns per page",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-898",
      "name": "Publication pagination planner",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Publication pagination planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f46cb934fd9f1f031e8339ea0ef87e221d879473276657c1d232cef41d6e1bc7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original character counts by text box",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured expansion factors by language",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Character capacities of the corresponding boxes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-900",
      "name": "Print job turnaround schedule",
      "category": "Print production and publishing",
      "status": "planned",
      "purpose": "Print job turnaround schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-901",
      "name": "Poker five-card hand probability",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Poker five-card hand probability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-902",
      "name": "Poker draw improvement odds",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Poker draw improvement odds",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-903",
      "name": "Blackjack dealer outcome explorer",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Blackjack dealer outcome explorer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-904",
      "name": "Baccarat draw-rule explorer",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Baccarat draw-rule explorer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-905",
      "name": "Roulette bet expectation",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Roulette bet expectation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-906",
      "name": "Raffle multiple-prize chance",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Raffle multiple-prize chance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-907",
      "name": "Lottery match distribution",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Lottery match distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-908",
      "name": "Deck draw target probability",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Deck draw target probability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-909",
      "name": "Card mulligan target chance",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Card mulligan target chance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-910",
      "name": "Board-game exploding dice",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Board-game exploding dice",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-911",
      "name": "Keep-highest dice pool",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Keep-highest dice pool",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-912",
      "name": "Reroll dice pool success",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Reroll dice pool success",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-913",
      "name": "Opposed dice pool odds",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Opposed dice pool odds",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-914",
      "name": "Advantage-disadvantage roll",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Advantage-disadvantage roll",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-915",
      "name": "Tabletop attack damage expectation",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Tabletop attack damage expectation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-916",
      "name": "Initiative order probability",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Initiative order probability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-917",
      "name": "Board-game resource production",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Board-game resource production",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-918",
      "name": "Crafting drop collection time",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Crafting drop collection time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-919",
      "name": "Coupon collection expectation",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Coupon collection expectation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-920",
      "name": "Tournament Swiss round estimate",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Tournament Swiss round estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-921",
      "name": "Chess rating expected score",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Chess rating expected score",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-922",
      "name": "Chess rating change",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Chess rating change",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-923",
      "name": "Go handicap score adjustment",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Go handicap score adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-924",
      "name": "Duplicate bridge score",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Duplicate bridge score",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-925",
      "name": "Mahjong hand payment table",
      "category": "Tabletop games and recreational probability",
      "status": "planned",
      "purpose": "Mahjong hand payment table",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-926",
      "name": "Thin lens conjugate distances",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Thin lens conjugate distances",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-927",
      "name": "Lens diopter conversion",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Lens diopter conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-928",
      "name": "Separated lens effective focal length",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Separated lens effective focal length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-929",
      "name": "Lens extension magnification",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Lens extension magnification",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-930",
      "name": "Macro effective aperture",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Macro effective aperture",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-931",
      "name": "Bellows exposure compensation",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Bellows exposure compensation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-932",
      "name": "Diffraction Airy disc size",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Diffraction Airy disc size",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-933",
      "name": "Diffraction sampling comparison",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Diffraction sampling comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-934",
      "name": "Lens numerical aperture",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Lens numerical aperture",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-935",
      "name": "Microscope magnification chain",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Microscope magnification chain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-936",
      "name": "Microscope field diameter",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Microscope field diameter",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-937",
      "name": "Microscope resolution estimate",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Microscope resolution estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-938",
      "name": "Microscope calibrated measurement",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Microscope calibrated measurement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-939",
      "name": "Snell refraction angle",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Snell refraction angle",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-940",
      "name": "Critical angle",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Critical angle",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-941",
      "name": "Brewster angle",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Brewster angle",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-942",
      "name": "Fresnel reflectance",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Fresnel reflectance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-943",
      "name": "Prism minimum deviation",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Prism minimum deviation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-944",
      "name": "Diffraction grating angles",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Diffraction grating angles",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-945",
      "name": "Double-slit fringe spacing",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Double-slit fringe spacing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-946",
      "name": "Newton rings radius",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Newton rings radius",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-947",
      "name": "Optical density stack",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Optical density stack",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-948",
      "name": "Polarizer transmission",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Polarizer transmission",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-949",
      "name": "Integrating sphere port fraction",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Integrating sphere port fraction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-950",
      "name": "Spectrometer wavelength calibration",
      "category": "Optics and imaging systems",
      "status": "planned",
      "purpose": "Spectrometer wavelength calibration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-951",
      "name": "Survey bearing distance endpoint",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Survey bearing distance endpoint",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-952",
      "name": "Survey inverse bearing distance",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Survey inverse bearing distance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-953",
      "name": "Survey traverse closure",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Survey traverse closure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-954",
      "name": "Bowditch traverse adjustment",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Bowditch traverse adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-955",
      "name": "Survey leveling reduction",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Survey leveling reduction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-956",
      "name": "Leveling loop closure",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Leveling loop closure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-957",
      "name": "Slope distance reduction",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Slope distance reduction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-958",
      "name": "Three-point resection geometry",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Three-point resection geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-959",
      "name": "Two-bearing intersection",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Two-bearing intersection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-960",
      "name": "Offset stakeout coordinates",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Offset stakeout coordinates",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-961",
      "name": "Station chainage conversion",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Station chainage conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-962",
      "name": "Circular curve setting-out",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Circular curve setting-out",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-963",
      "name": "Transition spiral geometry",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Transition spiral geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-964",
      "name": "Vertical curve elevations",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Vertical curve elevations",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-965",
      "name": "Cut-and-fill cross section",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Cut-and-fill cross section",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-966",
      "name": "Earthwork average end areas",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Earthwork average end areas",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-967",
      "name": "Earthwork prismoidal volume",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Earthwork prismoidal volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-968",
      "name": "Soil swell and shrink balance",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Soil swell and shrink balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-969",
      "name": "Stockpile volume from sections",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Stockpile volume from sections",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-970",
      "name": "Contour interpolation",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Contour interpolation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-971",
      "name": "Plane from three elevations",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Plane from three elevations",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-972",
      "name": "Aspect from elevation plane",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Aspect from elevation plane",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-973",
      "name": "Local coordinate rotation",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Local coordinate rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-974",
      "name": "Survey angular closure",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Survey angular closure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-975",
      "name": "Map projection scale correction",
      "category": "Surveying and earth geometry",
      "status": "planned",
      "purpose": "Map projection scale correction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-976",
      "name": "Decision matrix scoring",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Decision matrix scoring",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-977",
      "name": "Decision matrix weight sensitivity",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Decision matrix weight sensitivity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-978",
      "name": "Pairwise priority comparison",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Pairwise priority comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-979",
      "name": "Pareto frontier explorer",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Pareto frontier explorer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-980",
      "name": "Expected monetary value tree",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Expected monetary value tree",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-981",
      "name": "Value of perfect information",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Value of perfect information",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-982",
      "name": "Minimax regret decision",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Minimax regret decision",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-983",
      "name": "Break-even scenario probability",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Break-even scenario probability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-984",
      "name": "Monte Carlo project budget",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Monte Carlo project budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-985",
      "name": "Project deadline probability",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Project deadline probability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-986",
      "name": "Project buffer consumption",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Project buffer consumption",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-987",
      "name": "Risk exposure register",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Risk exposure register",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-988",
      "name": "Contingency reserve percentile",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Contingency reserve percentile",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-989",
      "name": "Resource leveling schedule",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Resource leveling schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-990",
      "name": "Project crashing tradeoff",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Project crashing tradeoff",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-991",
      "name": "Milestone payment cash flow",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Milestone payment cash flow",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-992",
      "name": "Earned value project health",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Earned value project health",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-993",
      "name": "Estimate at completion scenarios",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Estimate at completion scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-994",
      "name": "Work-in-progress limit simulation",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Work-in-progress limit simulation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-995",
      "name": "Project communication channels",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Project communication channels",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-996",
      "name": "Meeting coordination cost",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Meeting coordination cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-997",
      "name": "Build-versus-buy discounted comparison",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Build-versus-buy discounted comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-998",
      "name": "Vendor scorecard normalization",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Vendor scorecard normalization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-999",
      "name": "Dependency risk concentration",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Dependency risk concentration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1000",
      "name": "Project portfolio selection",
      "category": "Project decisions and scenario planning",
      "status": "planned",
      "purpose": "Project portfolio selection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1001",
      "name": "Room cleaning rotation",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Room cleaning rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1002",
      "name": "Vacuum bag replacement budget",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Vacuum bag replacement budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7490b84b173160fa2207bee398daf053adc669c0b2e65532ce95a7125a7e6258",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Room areas (m²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Tested area per charge (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Cleaning time per cycle (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Recharge time (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "abedaac9fadea7adb4e9c7086b1ecc2d80caa8cd13eef0c65a14f465e7c99f21",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pads used in each floor zone",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Cleaning sessions per day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Wash return delay (days)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7cb8013cd5c50d7ec6872a89badf3a439c9a46e817fcbc476f0df42b91b684fc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Windows in each size group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured minutes per window by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Setup and packing time (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1006",
      "name": "Blind cleaning slat count",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Blind cleaning slat count",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "86e4d57128e1ef8dd285a7d04c2fe390640bc6e161e67f60727c19e258d24750",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Carpet area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured solution usage (L/m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Clean tank capacity (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Observed recovered fraction (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Collection tank capacity (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1008",
      "name": "Upholstery drying scenario",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Upholstery drying scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1009",
      "name": "Oven cleaning session planner",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Oven cleaning session planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1010",
      "name": "Fridge shelf capacity layout",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Fridge shelf capacity layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1011",
      "name": "Freezer defrost inventory window",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Freezer defrost inventory window",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1012",
      "name": "Household filter replacement calendar",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Household filter replacement calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1013",
      "name": "Smoke alarm replacement inventory",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Smoke alarm replacement inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "8b7f9439df3b68318a94194e30cd8d26454cde443f9dfb70fb8fa0c02120cd22",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Door heights (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Door widths (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Supplied pack length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Waste allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1015",
      "name": "Window screen mesh cutting",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Window screen mesh cutting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c235a37c8c6cd135d47d7e2f189ff442816f9a15ba35859425db806be886a4d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Frame perimeters (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Join allowance per frame (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Spare length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Roll length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4fef5a031ebb0746fc48d93e913d7d1b0e6f31472975057b0746299161c7afe4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Feet needing pads by shape",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Pads per pack for each shape",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1018",
      "name": "Descaler dilution from label",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Descaler dilution from label",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1019",
      "name": "Cleaning concentrate dispenser check",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Cleaning concentrate dispenser check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ba537249cd4268067cecc5c63eedaf5d9096ff707ad5f2fc56060f8480a224d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Usable rail length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Garment width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Gap between garments (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Garments to dry",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1021",
      "name": "Household chore fairness ledger",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Household chore fairness ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1022",
      "name": "Seasonal maintenance sinking schedule",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Seasonal maintenance sinking schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4d847a153cf23cd4818af72e10909bcbbd97728a1c7582d21e38982192968a99",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Opening width, height, depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Appliance width, height, depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Total required clearances per axis (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1024",
      "name": "Home inventory insurance tally",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Home inventory insurance tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1025",
      "name": "Rug and furniture placement fit",
      "category": "Home cleaning and maintenance",
      "status": "planned",
      "purpose": "Rug and furniture placement fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1026",
      "name": "Laundry load sorting planner",
      "category": "Laundry and wardrobe logistics",
      "status": "planned",
      "purpose": "Laundry load sorting planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "67ee504e02886ec5582390bf6975cc276f62e3afc03d3c5e426c6179c41115d5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dry garment weights (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Rated capacity for selected program (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1028",
      "name": "Laundry detergent label dose",
      "category": "Laundry and wardrobe logistics",
      "status": "planned",
      "purpose": "Laundry detergent label dose",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1029",
      "name": "Laundry machine cycle scheduler",
      "category": "Laundry and wardrobe logistics",
      "status": "planned",
      "purpose": "Laundry machine cycle scheduler",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2958d252e2540f4ecce554db380370be088f893119848519247d89a44616ae6f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Weekly loads by program",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Option A water per load (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Option B water per load (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f3c102b6eef3da1053797b22e106fb32d7c31c29b9948ecb1fa6fd19cc114a9b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Garment counts by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Pegs per garment by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Line width per garment by group (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Spare pegs (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "97df5e6ac6bb953e641349b08b5f4cc3513991607f0aa4d730d05c1f06e70ff2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Garment counts by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured ironing minutes per garment",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Setup time (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Available session length (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3379ec823e95d8be9b95931f6b407fea61a2d1cb2c51d2a8cc20a0755f90555e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Garment purchase price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected lifetime wears",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Dry-cleaning charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Wears between cleanings",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "00cec39a7713f0215e196bf89ea1c2a036209491efb935d0fd52051198efdbc9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Wear counts by garment",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observation days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "528c0777c16e9666678c5fd74d0d42a8f1698adad64cdff303e8be52dc082bef",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Sale prices by garment (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Platform percentage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fixed fee per garment (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Packing costs by garment (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Preparation costs by garment (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "78e28d7430cfeafbb6814f3aa116ecd6aa5a3f9d2bcd30573ebc713491d440ee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Purchase prices by option (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Alteration quotes by option (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Expected wears by option",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8318b2715304d997561fd64cca228a2b6d20816479ba063e88f2b76707780901",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current finished length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired finished length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "New hem allowance (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ed1a74ccfcf5a0307bc45552fcde6c15f5832f459cd11026ff9ba5b4b3c9f371",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Left sleeve length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Right sleeve length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Desired finished length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "New hem allowance (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1039",
      "name": "Trouser inseam reconciliation",
      "category": "Laundry and wardrobe logistics",
      "status": "planned",
      "purpose": "Trouser inseam reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1040",
      "name": "Shoe size chart comparison",
      "category": "Laundry and wardrobe logistics",
      "status": "planned",
      "purpose": "Shoe size chart comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "83bb089de8d0090279b958873468bc76428c79d681806b364e2a812dcc18fa3c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Advertised dimensions (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured dimensions (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Allowed absolute error (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "11d89b36ca61c591276aa7c834cfce6de0daf6452e28ddf112383dd89710b7e1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rail length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hanger center spacing (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "End clearance at each end (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Garments to hang",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Garment shoulder width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "g",
          "label": "Closet internal depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6be618a5e41038b86be38b92021ab5653e3fe52ca2a7189e71640a62d8f80e42",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Drawer width, depth, height (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Folded garment width, depth, height (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Garments",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "61061a898b48f5315fdaae8d659e8b2c2ce8f413b0e1a08e20dfc00a51e5211c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Garment volumes by labeled group (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Container volume (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Extra packing allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4c903f452adcbe53bbea9f92ee016ee03fff9f6b995f4a171bb313ab3367a0c1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Items sent by bag",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Items returned by same bag",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "01e50349a3b860b1c6d49bc26b90dd3f1541bdf5ac136751b529cab66078bc8c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Occupied beds",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Changes per bed per day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Laundry turnaround (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reserve linen sets",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "74929b3fe5a6f8fa0d5245d7fc5008a9fc014de7b74ac81b3be24358fe7dccd8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Staff counts by size",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Sets per person",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Spare sets by same size",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1048",
      "name": "Uniform replacement accrual",
      "category": "Laundry and wardrobe logistics",
      "status": "planned",
      "purpose": "Uniform replacement accrual",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "1c4fbeb597eda1eb1125aa08bafef3516c9acc43c5a3e89332af833fbaffff01",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Before stain areas (cm²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "After stain areas (cm²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Treatment durations (min)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "823646fc3e4121942263292c73acf77adb55bff2a175aae9a53bf9233d5d4cc6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Repair quote (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected extra repaired wears",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Replacement purchase (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Expected replacement wears",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "836a643f8edc7a81477806f6b5341eded505b7ce7324d7a03deffc13719f744a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Packed item volume by room (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Usable box capacity (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8394273d0bd40d42550af32f887c19cd97975b66d9bdc3543b00c9f41d304e57",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Inventory volume (m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Truck internal volume (m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable loading fraction (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1053",
      "name": "Furniture doorway turn check",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Furniture doorway turn check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1054",
      "name": "Sofa diagonal doorway check",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Sofa diagonal doorway check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1055",
      "name": "Stairwell furniture clearance",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Stairwell furniture clearance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1056",
      "name": "Storage unit layout",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Storage unit layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "769917c49d9f17270d48ecc101e7692578d4b2ee4fe721731f69412738be20ea",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Expected retrievals by location",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Round-trip retrieval minutes by location",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1058",
      "name": "Removal crew labour plan",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Removal crew labour plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "df7a9d20d289806d7428c779882eeb6ac2cf895813a4d74171d1da47a1fc9b56",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Identical loads to move",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Loads per elevator cycle",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Full cycle including return (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Booked window (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1060",
      "name": "Moving box weight balancing",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Moving box weight balancing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "fcb738b9a1cac998368987bafb35be1c8714cba4ad261829045b6e19f15c791f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Item counts by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Wrap area per layer by group (m²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Layers by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Roll area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1062",
      "name": "Address-change task schedule",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Address-change task schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d47389a43da0beeaafac3dad13e469bd02fb3367a103d35e98dd1e8f2e7b8fa1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Overlap days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Old housing daily cost (currency/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "New housing daily cost (currency/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Extra daily utilities (currency/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Temporary storage total (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1064",
      "name": "Moving deposit cash timeline",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Moving deposit cash timeline",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4fe3ee47ff37945e258a524ece1b91f963217fc166d7c1c96b19dd26d56fcf2c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Route leg distances (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Included mileage (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Excess fee (currency/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Base hire charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "337be9d01043a45e23fb96085c507ca326ba4f4cea7942da96bd08ef5cb4373b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Stay (whole months)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Introductory months",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Intro monthly price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Regular monthly price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "One-time fees",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a5edd03490e23abe310fc17a705a63436caeecd4a65a20396030ec41dba5a81a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Self-move vehicle, labour, supplies, hotel costs",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Removal company itemized quote",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Self-move work hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Chosen hourly value of own time",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1068",
      "name": "Furniture assembly workload",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Furniture assembly workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1069",
      "name": "Box label identifier generator",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Box label identifier generator",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2b86a580d8cebcb42c3dd216894cac5faf52c385dd3a9ce28f43e5c9d3fe902f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Expected sale receipts by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Fees by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Handling minutes by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Chosen time value per hour",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "cb17903ae138261201818c41b7e4c5816cae6110929ff8bee31b772ad948e34e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Item lengths (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Item widths (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Item heights (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Item counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Packing multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1072",
      "name": "Moving insurance declared value",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Moving insurance declared value",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "45d82135138d4b477503ee7afc6406d47cdbfff6033f17ad19762b4868ae018f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Humidity observations (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Hours represented by each reading",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Chosen lower bound (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Chosen upper bound (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1074",
      "name": "Furniture cover purchase planner",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Furniture cover purchase planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1075",
      "name": "Moving-day contingency buffer",
      "category": "Moving and household storage",
      "status": "planned",
      "purpose": "Moving-day contingency buffer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6da13dd5524ab88f9c901927c3b7b381b522778cef12e57dd0b4752227b2d1c1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pack quantity (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Usage per day (units/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable days before expiry",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Pack price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "54f225bc496b4d6d6fbf3b4b7bb9f9abc0aad1ef7fc1a214c0bfa990a96fd288",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Reusable purchase price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Disposable price per use",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reusable cleaning cost per use",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reusable lifetime (uses)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ddfdf9688f3d109ed7ffa2af21dfa9f997337bed002b2bc01b35a336409f6779",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Warranty price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "User-assumed covered failure probability (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Repair cost without warranty",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Repair excess with warranty",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5a69a76c77986456d442fd1f73c1a8a54ea509e0b2d59dc588f0ee0094ef42b9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting inventory (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Delivery quantity (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Delivery interval (days)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Consumption (units/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Delivery cycles to project",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7387850991656f7b648ab66cc59177b776236dba1ea5d654318e1643aab97a5d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible item subtotal",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Excluded item subtotal",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Required eligible spend",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Coupon rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Discount cap",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6290ecd076fcd334087e178263a708513b9200261f8eefc9fe552cae07a887b4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Identical item quantity",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Regular unit price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Paid items per promotion group",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Free items per promotion group",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "183fed8dd8baa70f6659276fd54589d1b5a5b415880acf76d04eb71c3ebc81e5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gift-card balances",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Eligible planned spend before each expiry",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "063c250109fe6c88a19274b45d64cedbc7f48b68b272182258490e26001202f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cash prices by option",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Points required by option",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Mandatory cash fees by option",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4f4691eed5d012fe2aeda11f2af454dcaa2a7fc983973c845e28e06df87a9439",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible spend",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cashback rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reward cap",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Qualification threshold",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1085",
      "name": "Installment purchase fee comparison",
      "category": "Household purchasing decisions",
      "status": "planned",
      "purpose": "Installment purchase fee comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "99be811871c6d5c79140af26e805be872d859d957846476c591e67d64cdbc39d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Purchase price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Original nonrefundable shipping",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Return postage",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Restocking rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "aeb15936fa2b2e8488c2737ac56e276eb32f031a604321b504ad77295a4dd418",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starter container cost",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Refill pack price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Yield per refill (uses)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Container replacement interval (refills)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Refills to compare",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "418c8e3ba2fe5c1b36209ddb041c61c1fc3bc5b5a0443d987ec72dedbbf1cb7c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual membership fee",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Annual spending by category",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Supplied discount by category (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "05c25d01af2dbae496db850aa78015b74e0467245e127297569ac0dec40e8599",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Basket saving before travel",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Round-trip distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Travel cost (currency/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Trip time (h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Chosen time value (currency/h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Parking and tolls",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1090",
      "name": "Store credit expiry planner",
      "category": "Household purchasing decisions",
      "status": "planned",
      "purpose": "Store credit expiry planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "06b068b21772b0307d520f90894bd813c1571be83c19b8d47e07b4749782fae3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Participant quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Unit price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Order-wide discount (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Delivery fee",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9a41299517073eea36bd3f33fe3810451999d829d2fe918d17b4a5a7a014d06d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pack weights by option (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observed edible fraction by option (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Pack prices",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1093",
      "name": "Concentrated product equivalent price",
      "category": "Household purchasing decisions",
      "status": "planned",
      "purpose": "Concentrated product equivalent price",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ccdd8b55a00d55724020fe59b5b455c0b4c403650669405a6e43affe3243f0d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Replacement part price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Fitting charge",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Expected extra service (years)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "New appliance installed price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Expected new appliance service (years)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2c1b1b081e731d8139c334e19af6e800428275d9054a6df8a53a1dd1ab1d9b7a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fixed basket quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Base-period unit prices",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Current unit prices",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a5cb4e0646b291a46d7b5d08bacaa0477c55d3b3173351fff051ec00a98ac2cb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original eligible purchase price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current eligible price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Claim deduction",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplied maximum refund",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d27034a10ba9b69b70b754bae9d31a1aabc5b9073d1b572ea0657c8535aba7a7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current qualifying points",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tier threshold points",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Qualifying points per currency spent",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Days remaining in qualification period",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "513588c6887977b8e6bf1f25da6fca6b3778a92280bee415c56bb9007f33f71b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gift qualification threshold",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Already intended eligible purchases",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Your value of gift",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1099",
      "name": "Pantry reorder by expiry",
      "category": "Household purchasing decisions",
      "status": "planned",
      "purpose": "Pantry reorder by expiry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6c1459cc1904a521cd47bce64d34e3ab6d8b51db52d75a37f73797cfade71a41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original bundle amount paid",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Standalone prices of retained items",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Standalone prices of returned items",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Promotion reversal cap",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8732726fa14d3214d2bcb249d9bb58bdf19505099a0afff424c89d3711d40765",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Private room areas (m²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Shared area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Agreed room quality weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Total rent",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "49f5b24e66e5873cb5b57253606db3c4c8d98f9cab66f4cc64b1fb5dcb64b21c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Resident occupied days in bill period",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Fixed portion of bill",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Variable portion of bill",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Bill-period days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "eed42419a68cb5951b8064321a61efdbbc86f476ddd042c2bc6c98bed03da124",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Amount each resident paid",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Agreed consumption weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Excluded personal purchases by payer",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "07a510afb185e3487022a82753ecbbea5e04a0c03eabcc260c23717a3d34ee33",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Guest nights",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Agreed charge per night",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Additional shared expenses",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Guest share of additional expenses (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c5f7b5011bf588ecf9d44ea9a8a66dfcbc233dff3266ae135a86370dd9e08452",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original owner contributions",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Agreed current appliance value",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Departing owner number",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "791bc1a7e9547dde7eff9d6a7cfa13194f67ab773509ff1e27eafa1d010e343b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Deposits contributed by resident",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Total documented deductions",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Agreed deduction responsibility weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "545d789736683066067a2efe98f852c1a6c9962be1f069362d989abf7dd3f34c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unit floor numbers",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Agreed usage multipliers",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Lift maintenance budget",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1108",
      "name": "Communal cleaning rota credits",
      "category": "Shared homes and building communities",
      "status": "planned",
      "purpose": "Communal cleaning rota credits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1109",
      "name": "Shared parking rotation",
      "category": "Shared homes and building communities",
      "status": "planned",
      "purpose": "Shared parking rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e573b4747d5565e35498f6cfa61f3ba7b28496ed3d11e2c480d1567d87d4525d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Opening reserve",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Contributions by period",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Planned works spending by period",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Interest per period (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4106501012187abc048a2d89caecd5f31c63df57d4354453ac7d528bb2ea8a1c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Building metered volume (m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unit metered volumes (m³)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Verified common-use volume (m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Unit water price (currency/m³)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "63d227c4bc35ccf0323a0fcc687ebf553660629ae55c8f86ce9369282320ebb1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unit heat usage (kWh)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Energy price (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Building standing charge",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Standing-charge weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e09780bab6998d4b90f6b7ab5968b77545edd9608d33b0f749fa28d38f0a852b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total production (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Member production weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Member self-use allocations (kWh)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Avoided purchase value (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Export value (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "477017056ef6996a1d3ef3774094b7308bfc9273e7f48a8df5f469e923d63c45",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Shared internet base bill",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Agreed user weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Individual add-ons",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7d3d2ce1472e893bbdd76e22144f2cce7494f734dddd5bd242c5ede2e631bcf8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible voters",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Yes ballots",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "No ballots",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Abstentions",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Quorum (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Required yes share of yes-plus-no (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1116",
      "name": "Community room booking conflict",
      "category": "Shared homes and building communities",
      "status": "planned",
      "purpose": "Community room booking conflict",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1117",
      "name": "Neighbourhood tool lending rotation",
      "category": "Shared homes and building communities",
      "status": "planned",
      "purpose": "Neighbourhood tool lending rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1118",
      "name": "Shared garden plot allocation",
      "category": "Shared homes and building communities",
      "status": "planned",
      "purpose": "Shared garden plot allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b343b4775ff573f48fb7b4a7779a7b84fe455a97553b063bcb9b41d190592c5c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Member annual energy use (kWh)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Option A rate (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Option A annual standing charge per member",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Option B rate (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Option B annual standing charge per member",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1120",
      "name": "Building maintenance tender split",
      "category": "Shared homes and building communities",
      "status": "planned",
      "purpose": "Building maintenance tender split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a858dddcce02cae53ee59e51c437bdc78dde901c06e97d54534f10ba89d6849f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bill-period days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Days newcomer is included",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Period shared bill",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Existing residents",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "91e60762c306fcfeaa4a30f9563453cf0433bf094205b4f466021915e882ab88",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Resident deposit refundable",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Unpaid shared bills",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Resident agreed bill share (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Agreed owned-goods buyout receivable",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Other agreed deductions",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "428741dcc72a67b2f730bb057e4cbee68afd623e24ee2b07527c7369f6c4e172",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Freezer shelf capacity (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Agreed resident quota weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Resident stored volume (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b1174d938207308928564c8454786d60c2947b061949c6e5c9d727a8475df3dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Deposited material by member (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Labour credits by member",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Agreed points per kg input",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Agreed points per labour credit",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Finished compost to share (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d114c12403647cc757c9a80f25bbb95f9ec86ccbb83562b5b15b40c3154dd4d3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Selected monthly communal expenses",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Chosen months of coverage",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Current reserve",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Participating households",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1126",
      "name": "Childcare weekly coverage map",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "Childcare weekly coverage map",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f61f052df8de26849d3e06788f6bafcd3937d8686d557bb80cbdb881b3aa86cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Weekly sessions by tariff type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Price per session by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Chargeable weeks per year",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Additional weekly fees",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1128",
      "name": "School holiday care budget",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "School holiday care budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1129",
      "name": "Sibling activity transport schedule",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "Sibling activity transport schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1130",
      "name": "School pickup authorization rota",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "School pickup authorization rota",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b62e572968bd47b1d4df59a2494e9720e6f63cd2a12e8936c703754bf1273378",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Actual session hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Hourly rate",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Minimum billed hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Travel charge",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1132",
      "name": "After-school club availability",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "After-school club availability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "9ab294da500f260bc81df50725adf455efab45bc1330b23a6cb98fdd800bbe7b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Available voucher balance",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Eligible fees due before expiry",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Ineligible fees",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplied maximum voucher payment",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1134",
      "name": "Family leave coverage calendar",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "Family leave coverage calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "440d3e4934d031e40134da1fecb4ed931ce8448090e4051a5f0499e67f495c62",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current lunch balance",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Meal price",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Scheduled lunch attendance days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Desired ending balance",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "95d8688f41a954e22d357b0cdf4d5cb8e9d814fe88cadae5e1926fb86473aa4e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "School days to prepare",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Portions per day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Portions per preparation batch",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Available portion containers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1137",
      "name": "School uniform growth allowance ledger",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "School uniform growth allowance ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d5332068219d706fe387f8deb3a20592869a0e7a3900d796e17a386d3ae83554",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required quantities by supply type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Pack contents by matching type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Pack prices by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7c7af2c9c71c857b24367210c137e66e414bb1ac4a7ad02fa38a581d75c6abd2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Invited children by household",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Invited adults by household",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Venue guest capacity",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Assumed attendance rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5d5ce72f3cff4088db6f10a1ff716d2c360ac8e04aebfa20ad174386a05c58b2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Earliest pickup minute after midnight",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Latest pickup minute after midnight",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Walking time (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Required arrival buffer (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1141",
      "name": "Parent evening appointment planner",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "Parent evening appointment planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1142",
      "name": "Family calendar collision finder",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "Family calendar collision finder",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "8ebf05797d1f7d577a0df0d71b95acb85eeb47eae8d31afc95a9a6b1a1636476",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Outgoing carer shift end (minute of day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Incoming carer departure (minute of day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Incoming travel duration (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Required handover overlap (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a8cf0f8b63860f815281218abd769f10c109f9ebb57b5c7aee0e48f171745930",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Care hours by household",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Agreed effort multiplier",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Agreed target share weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0447f78d56c23ef98977cc3feb69c705ad796679fdbd68b0c3581651f0167ea7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual sessions",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Session fee",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Travel cost per session",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Equipment cost per year",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Activity duration per session (h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Travel time per session (h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a5445488355c2ec3854f0f43ac6b7a5f1245d3cd182b552e86234b922cd91cd9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Base allowance",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Completed agreed chore rewards",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Bonuses",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Agreed deductions",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "952b1ab28b000c2587be4796b71ba6aa14bd6b7fe54869255d012c09eec5569f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gift amount in whole cents",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Agreed beneficiary weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1148",
      "name": "School fundraiser volunteer coverage",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "School fundraiser volunteer coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1149",
      "name": "Toy library rotation plan",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "Toy library rotation plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1150",
      "name": "Family screen-time timetable",
      "category": "Family scheduling and childcare logistics",
      "status": "planned",
      "purpose": "Family screen-time timetable",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7c44ea8934f17a2a047ebb0f68676ee340387bb01fdf76bd239cfaea207e214e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Food pack mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Owner-supplied daily portion per pet (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Pets using this pack",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Order lead time (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1152",
      "name": "Pet sitter visit schedule",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet sitter visit schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "777f6e7cbaf4d5fd6f1c3e79125b6b90fc09c1bfc21d215cecbb866417aa1114",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Stay duration from arrival to departure (h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Billable block duration (h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Charge per block",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Fixed booking extras",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional pet surcharge per block",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f0dae051e5a5466236c660a314e1b1319dc0a60e583cd24ee894b57ddb6074d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Booked dogs",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Supplied maximum dogs per group",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Minutes per walk group",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Available staff",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Minutes available per staff member",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1155",
      "name": "Pet transport crate fit",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet transport crate fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1156",
      "name": "Pet insurance reimbursement arithmetic",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet insurance reimbursement arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "5cd07c527156be14449362926111eaf8a8211cef856fed40bd3fd115398c65f0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Recurring monthly pet costs",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Planned annual appointment costs",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Annual equipment purchases",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Already saved for annual costs",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4bbdf4778f02fa430a23de43e9391f105b3dd87af56d27f1248580b7981465ad",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Full replacement quantity (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Days between full replacements",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Additional top-up use (L/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Planning days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Pack size (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1159",
      "name": "Aquarium sitter task calendar",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Aquarium sitter task calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1160",
      "name": "Pet medication reminder spacing",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet medication reminder spacing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1161",
      "name": "Pet grooming booking cadence",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet grooming booking cadence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1162",
      "name": "Pet weight log trend",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet weight log trend",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1163",
      "name": "Pet harness size chart lookup",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet harness size chart lookup",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1164",
      "name": "Pet door opening comparison",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet door opening comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1165",
      "name": "Cat climbing shelf footprint",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Cat climbing shelf footprint",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d5704a73b1eae7c54e6031d2eb9791169b1f466be65eab469c0be66c78195430",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Owner-defined weekly activity target (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Logged sessions (min)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1167",
      "name": "Pet rescue transport handover",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet rescue transport handover",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ec30f8af6ed2667cacf9bc8ec85e06dafce9187cccc46762e44e4afefff3b2f5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Actual recording bitrate (Mbit/s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Recording hours per day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Usable storage (decimal GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1169",
      "name": "Pet travel document timeline",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet travel document timeline",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1170",
      "name": "Multi-pet expense allocation",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Multi-pet expense allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "fcb56269454b94dad625a7b617bda9c3a1efa718d5e4afbcbfb56363d43307a6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "New foster placements",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Required units per kit by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Available stock by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Supplier pack units by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1172",
      "name": "Animal shelter kennel occupancy",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Animal shelter kennel occupancy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1173",
      "name": "Animal shelter volunteer rota",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Animal shelter volunteer rota",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1174",
      "name": "Pet daycare attendance forecast",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet daycare attendance forecast",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1175",
      "name": "Pet memorial service comparison",
      "category": "Pet household logistics",
      "status": "planned",
      "purpose": "Pet memorial service comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1176",
      "name": "Aquarium displacement-adjusted water",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium displacement-adjusted water",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1177",
      "name": "Aquarium water-change sequence",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium water-change sequence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1178",
      "name": "Aquarium batch water preparation",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium batch water preparation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1179",
      "name": "Aquarium heater duty from observations",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium heater duty from observations",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1180",
      "name": "Aquarium filter turnover adjustment",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium filter turnover adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1181",
      "name": "Aquarium sump reserve capacity",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium sump reserve capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1182",
      "name": "Aquarium evaporation top-up autonomy",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium evaporation top-up autonomy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1183",
      "name": "Aquarium light photoperiod energy",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium light photoperiod energy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1184",
      "name": "Aquarium light coverage footprint",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium light coverage footprint",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1185",
      "name": "Aquarium aquascape substrate slope",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium aquascape substrate slope",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1186",
      "name": "Aquarium CO2 cylinder runtime",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium CO2 cylinder runtime",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1187",
      "name": "Aquarium air pump branch allocation",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium air pump branch allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1188",
      "name": "Aquarium overflow drain-down volume",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium overflow drain-down volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1189",
      "name": "Aquarium return pump measured curve",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium return pump measured curve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1190",
      "name": "Aquarium hose cleaning workload",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium hose cleaning workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1191",
      "name": "Aquarium filter-media compartment fit",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium filter-media compartment fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1192",
      "name": "Aquarium conductivity blend estimate",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium conductivity blend estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1193",
      "name": "Aquarium salinity mass balance",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium salinity mass balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1194",
      "name": "Aquarium temperature mixing capacity",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium temperature mixing capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1195",
      "name": "Aquarium backup aeration duration",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium backup aeration duration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1196",
      "name": "Aquarium observation sampling schedule",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium observation sampling schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1197",
      "name": "Aquarium maintenance cost attribution",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium maintenance cost attribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1198",
      "name": "Aquarium quarantine tank availability",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium quarantine tank availability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1199",
      "name": "Aquarium feeding inventory ledger",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium feeding inventory ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1200",
      "name": "Aquarium leak-test level correction",
      "category": "Aquarium systems and maintenance",
      "status": "planned",
      "purpose": "Aquarium leak-test level correction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1201",
      "name": "Pool irregular-section volume",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool irregular-section volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1202",
      "name": "Pool cover evaporation comparison",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool cover evaporation comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1203",
      "name": "Pool backwash water demand",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool backwash water demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1204",
      "name": "Pool refill scheduling",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool refill scheduling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1205",
      "name": "Pool filter cycle throughput",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool filter cycle throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1206",
      "name": "Pool pump speed energy comparison",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool pump speed energy comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1207",
      "name": "Pool heat-up energy budget",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool heat-up energy budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1208",
      "name": "Pool cover reel storage fit",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool cover reel storage fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1209",
      "name": "Pool lane booking capacity",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool lane booking capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1210",
      "name": "Swim school group timetable",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Swim school group timetable",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1211",
      "name": "Pool shower peak water demand",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool shower peak water demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1212",
      "name": "Pool locker turnover",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool locker turnover",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1213",
      "name": "Pool lifeguard rota coverage",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool lifeguard rota coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1214",
      "name": "Pool opening-hours operating cost",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool opening-hours operating cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1215",
      "name": "Spa drain-and-refill turnaround",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Spa drain-and-refill turnaround",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1216",
      "name": "Pool brush cleaning path",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool brush cleaning path",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1217",
      "name": "Pool tile joint length",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool tile joint length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1218",
      "name": "Pool water meter reconciliation",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool water meter reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1219",
      "name": "Pool solar cover material layout",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool solar cover material layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1220",
      "name": "Pool lane rope float inventory",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool lane rope float inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1221",
      "name": "Pool water sampling route",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool water sampling route",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1222",
      "name": "Pool contractor visit comparison",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool contractor visit comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1223",
      "name": "Pool frost protection runtime log",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool frost protection runtime log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1224",
      "name": "Pool accessibility equipment booking",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool accessibility equipment booking",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1225",
      "name": "Pool seasonal shutdown calendar",
      "category": "Swimming pool and spa operations",
      "status": "planned",
      "purpose": "Pool seasonal shutdown calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1226",
      "name": "Tent pitch spacing layout",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Tent pitch spacing layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1227",
      "name": "Tent footprint groundsheet cut",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Tent footprint groundsheet cut",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1228",
      "name": "Camping water carry plan",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping water carry plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1229",
      "name": "Camping fuel canister plan",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping fuel canister plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1230",
      "name": "Camping meal package allocation",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping meal package allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1231",
      "name": "Camping cooler ice autonomy",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping cooler ice autonomy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1232",
      "name": "Camping lighting runtime budget",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping lighting runtime budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1233",
      "name": "Tent pole segment inventory",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Tent pole segment inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1234",
      "name": "Camping guyline purchase length",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping guyline purchase length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1235",
      "name": "Camp kitchen washing capacity",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camp kitchen washing capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1236",
      "name": "Camp group gear sharing",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camp group gear sharing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1237",
      "name": "Camp pitch slope level blocks",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camp pitch slope level blocks",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1238",
      "name": "Campsite fee comparison",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Campsite fee comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1239",
      "name": "Camping permit booking window",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping permit booking window",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1240",
      "name": "Camping solar shade log",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping solar shade log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1241",
      "name": "Camp waste pack-out volume",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camp waste pack-out volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1242",
      "name": "Camping emergency contact schedule",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping emergency contact schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1243",
      "name": "Camp arrival setup sequence",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camp arrival setup sequence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1244",
      "name": "Camping rainfall tarp drainage",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping rainfall tarp drainage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1245",
      "name": "Tarpaulin ridge coverage",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Tarpaulin ridge coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1246",
      "name": "Hammock suspension geometry",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Hammock suspension geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1247",
      "name": "Camping chair and table packing",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camping chair and table packing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1248",
      "name": "Campfire wood inventory",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Campfire wood inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1249",
      "name": "Festival campsite supply split",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Festival campsite supply split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1250",
      "name": "Camp evacuation vehicle loading",
      "category": "Camping and outdoor trip logistics",
      "status": "planned",
      "purpose": "Camp evacuation vehicle loading",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1251",
      "name": "Hiking elevation-adjusted itinerary",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking elevation-adjusted itinerary",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1252",
      "name": "Backpack base weight audit",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Backpack base weight audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1253",
      "name": "Backpack volume by access zone",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Backpack volume by access zone",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1254",
      "name": "Hiking food mass by meal",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking food mass by meal",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1255",
      "name": "Resupply parcel timing",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Resupply parcel timing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1256",
      "name": "Trail daylight margin",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Trail daylight margin",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1257",
      "name": "Hiking turnaround time",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking turnaround time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1258",
      "name": "Hiking ascent distribution",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking ascent distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1259",
      "name": "Walking pole segment adjustment",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Walking pole segment adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1260",
      "name": "Backpack load transfer ledger",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Backpack load transfer ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1261",
      "name": "Trail water-source reliability scenarios",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Trail water-source reliability scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1262",
      "name": "Hiking footwear replacement log",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking footwear replacement log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1263",
      "name": "Route escape-point timing",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Route escape-point timing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1264",
      "name": "Hiking rest-stop interval planner",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking rest-stop interval planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1265",
      "name": "Backpacking stove boil-test comparison",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Backpacking stove boil-test comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1266",
      "name": "Trail nutrition package arithmetic",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Trail nutrition package arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1267",
      "name": "Backpack rain-cover sizing",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Backpack rain-cover sizing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1268",
      "name": "Trekking transport connection buffer",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Trekking transport connection buffer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1269",
      "name": "Hiking permit group allocation",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking permit group allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1270",
      "name": "Trail maintenance volunteer output",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Trail maintenance volunteer output",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1271",
      "name": "Hiking GPS battery trace",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking GPS battery trace",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1272",
      "name": "Walking challenge milestone calendar",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Walking challenge milestone calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1273",
      "name": "Trip bailout cash reserve",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Trip bailout cash reserve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1274",
      "name": "Expedition equipment redundancy count",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Expedition equipment redundancy count",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1275",
      "name": "Hiking elevation profile compression",
      "category": "Hiking and backpack planning",
      "status": "planned",
      "purpose": "Hiking elevation profile compression",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1276",
      "name": "Bicycle chain length by geometry",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle chain length by geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1277",
      "name": "Bicycle chain wear measurement",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle chain wear measurement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1278",
      "name": "Bicycle spoke length geometry",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle spoke length geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1279",
      "name": "Wheel dish offset",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Wheel dish offset",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1280",
      "name": "Bicycle tire rollout calibration",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle tire rollout calibration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1281",
      "name": "Bicycle tire clearance check",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle tire clearance check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1282",
      "name": "Tubeless sealant service inventory",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Tubeless sealant service inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1283",
      "name": "Bicycle chainline offset",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle chainline offset",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1284",
      "name": "Bicycle drivetrain ratio gaps",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle drivetrain ratio gaps",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1285",
      "name": "Bicycle cadence-speed table",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle cadence-speed table",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1286",
      "name": "Bicycle crank clearance geometry",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle crank clearance geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1287",
      "name": "Bicycle stem reach transformation",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle stem reach transformation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1288",
      "name": "Bicycle handlebar contact points",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle handlebar contact points",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1289",
      "name": "Bicycle saddle setback measurement",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle saddle setback measurement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1290",
      "name": "Bicycle frame reach comparison",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle frame reach comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1291",
      "name": "Bicycle brake rotor adapter difference",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle brake rotor adapter difference",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1292",
      "name": "Bicycle suspension sag arithmetic",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle suspension sag arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1293",
      "name": "Bicycle suspension travel log",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle suspension travel log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1294",
      "name": "Wheel rotational inertia estimate",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Wheel rotational inertia estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1295",
      "name": "Bicycle touring luggage balance",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle touring luggage balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1296",
      "name": "Bicycle service interval tracker",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle service interval tracker",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1297",
      "name": "Bicycle bearing spacer stack",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle bearing spacer stack",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1298",
      "name": "Bicycle seatpost insertion check",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle seatpost insertion check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1299",
      "name": "Bicycle cable housing cut list",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle cable housing cut list",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1300",
      "name": "Bicycle workshop job sequencing",
      "category": "Bicycle workshop and fit measurements",
      "status": "planned",
      "purpose": "Bicycle workshop job sequencing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1301",
      "name": "Boat passage current-vector estimate",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat passage current-vector estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1302",
      "name": "Boat fuel reserve by leg",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat fuel reserve by leg",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1303",
      "name": "Boat water-tank endurance",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat water-tank endurance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1304",
      "name": "Boat marina fee comparison",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat marina fee comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1305",
      "name": "Boat berth clearance geometry",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat berth clearance geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1306",
      "name": "Boat trailer payload audit",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat trailer payload audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1307",
      "name": "Boat static loading trim model",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat static loading trim model",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1308",
      "name": "Sail area from measured panels",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Sail area from measured panels",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1309",
      "name": "Sailcloth panel inventory",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Sailcloth panel inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1310",
      "name": "Boat line inventory",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat line inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1311",
      "name": "Anchor rode scope arithmetic",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Anchor rode scope arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1312",
      "name": "Boat swing circle geometry",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat swing circle geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1313",
      "name": "Boat fender placement plan",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat fender placement plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1314",
      "name": "Boat bilge pump test rate",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat bilge pump test rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1315",
      "name": "Boat battery daily audit",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat battery daily audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1316",
      "name": "Boat alternator charging log",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat alternator charging log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1317",
      "name": "Boat solar mounting shadow comparison",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat solar mounting shadow comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1318",
      "name": "Tidal height interpolation worksheet",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Tidal height interpolation worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1319",
      "name": "Tidal gate schedule comparison",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Tidal gate schedule comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1320",
      "name": "Sailing race corrected time",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Sailing race corrected time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1321",
      "name": "Sailing start-line timing",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Sailing start-line timing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1322",
      "name": "Boat hull antifouling area estimate",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat hull antifouling area estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1323",
      "name": "Boat winter storage footprint",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat winter storage footprint",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1324",
      "name": "Boat haul-out booking sequence",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat haul-out booking sequence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1325",
      "name": "Boat spare-parts cruising inventory",
      "category": "Sailing and small-boat logistics",
      "status": "planned",
      "purpose": "Boat spare-parts cruising inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1326",
      "name": "Camper payload passenger audit",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper payload passenger audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1327",
      "name": "Camper axle load estimate",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper axle load estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1328",
      "name": "Camper side-to-side load balance",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper side-to-side load balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1329",
      "name": "Camper fresh-grey water balance",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper fresh-grey water balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1330",
      "name": "Camper toilet cassette autonomy",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper toilet cassette autonomy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1331",
      "name": "Camper fridge duty-cycle energy",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper fridge duty-cycle energy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1332",
      "name": "Camper electric hookup demand",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper electric hookup demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1333",
      "name": "Camper gas bottle swap planning",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper gas bottle swap planning",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1334",
      "name": "Camper bed conversion clearance",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper bed conversion clearance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1335",
      "name": "Camper cabinet door swing",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper cabinet door swing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1336",
      "name": "Camper roof equipment packing",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper roof equipment packing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1337",
      "name": "Camper insulation cut panels",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper insulation cut panels",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1338",
      "name": "Camper thermal bridge area tally",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper thermal bridge area tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1339",
      "name": "Camper ventilation opening area",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper ventilation opening area",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1340",
      "name": "Camper window privacy cover cuts",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper window privacy cover cuts",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1341",
      "name": "Camper appliance priority shedding",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper appliance priority shedding",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1342",
      "name": "Camper off-grid scenario comparison",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper off-grid scenario comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1343",
      "name": "Camper parking length check",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper parking length check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1344",
      "name": "Camper leveling wedge travel",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper leveling wedge travel",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1345",
      "name": "Camper awning pitch footprint",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper awning pitch footprint",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1346",
      "name": "Camper service interval mileage",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper service interval mileage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1347",
      "name": "Camper toll vehicle classification lookup",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper toll vehicle classification lookup",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1348",
      "name": "Camper trip campsite mix budget",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper trip campsite mix budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1349",
      "name": "Camper conversion cost contingency",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper conversion cost contingency",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1350",
      "name": "Camper storage season comparison",
      "category": "Motorhome and camper systems",
      "status": "planned",
      "purpose": "Camper storage season comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1351",
      "name": "Tire size rolling diameter",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Tire size rolling diameter",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1352",
      "name": "Tire speedometer difference",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Tire speedometer difference",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1353",
      "name": "Wheel offset clearance change",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Wheel offset clearance change",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1354",
      "name": "Wheel stud thread engagement",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Wheel stud thread engagement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1355",
      "name": "Brake disc wear measurement",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Brake disc wear measurement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1356",
      "name": "Brake pad thickness log",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Brake pad thickness log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1357",
      "name": "Brake fluid bleed volume inventory",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Brake fluid bleed volume inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1358",
      "name": "Engine oil top-up arithmetic",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Engine oil top-up arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1359",
      "name": "Coolant blend replacement arithmetic",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Coolant blend replacement arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1360",
      "name": "Gearbox service fluid purchase",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Gearbox service fluid purchase",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1361",
      "name": "Automotive belt wrap geometry",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Automotive belt wrap geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1362",
      "name": "Battery cranking voltage drop log",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Battery cranking voltage drop log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1363",
      "name": "Alternator load balance",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Alternator load balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1364",
      "name": "Vehicle parasitic drain endurance",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Vehicle parasitic drain endurance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1365",
      "name": "Compression test cylinder spread",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Compression test cylinder spread",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1366",
      "name": "Cylinder leak-down arithmetic",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Cylinder leak-down arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1367",
      "name": "Engine displacement by bore-stroke",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Engine displacement by bore-stroke",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1368",
      "name": "Engine compression ratio geometry",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Engine compression ratio geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1369",
      "name": "Piston speed from RPM",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Piston speed from RPM",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1370",
      "name": "Fuel injector duty arithmetic",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Fuel injector duty arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1371",
      "name": "Vehicle alignment toe conversion",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Vehicle alignment toe conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1372",
      "name": "Steering turning circle geometry",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Steering turning circle geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1373",
      "name": "Vehicle stopping test analysis",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Vehicle stopping test analysis",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1374",
      "name": "Jack support load arithmetic",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Jack support load arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1375",
      "name": "Workshop consumables job tally",
      "category": "Automotive workshop measurements",
      "status": "planned",
      "purpose": "Workshop consumables job tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1376",
      "name": "Motorcycle sprocket speed change",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle sprocket speed change",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1377",
      "name": "Motorcycle chain adjustment travel",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle chain adjustment travel",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1378",
      "name": "Motorcycle chain slack measurement log",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle chain slack measurement log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1379",
      "name": "Motorcycle tire profile comparison",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle tire profile comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1380",
      "name": "Motorcycle static sag worksheet",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle static sag worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1381",
      "name": "Motorcycle fork oil air-gap volume",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle fork oil air-gap volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1382",
      "name": "Motorcycle suspension preload thread",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle suspension preload thread",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1383",
      "name": "Motorcycle lever reach adjustment",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle lever reach adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1384",
      "name": "Motorcycle luggage axle loading",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle luggage axle loading",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1385",
      "name": "Motorcycle touring range log",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle touring range log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1386",
      "name": "Motorcycle fuel stop itinerary",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle fuel stop itinerary",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1387",
      "name": "Motorcycle helmet cost per ride",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle helmet cost per ride",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1388",
      "name": "Motorcycle service parts basket",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle service parts basket",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1389",
      "name": "Motorcycle valve shim worksheet",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle valve shim worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1390",
      "name": "Motorcycle spark plug gap log",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle spark plug gap log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1391",
      "name": "Motorcycle brake lever travel log",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle brake lever travel log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1392",
      "name": "Motorcycle wheel balance weights",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle wheel balance weights",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1393",
      "name": "Motorcycle track-session fuel plan",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle track-session fuel plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1394",
      "name": "Motorcycle lap consistency",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle lap consistency",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1395",
      "name": "Motorcycle tire warmer energy",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle tire warmer energy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1396",
      "name": "Motorcycle trailer tie-point geometry",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle trailer tie-point geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1397",
      "name": "Motorcycle intercom battery schedule",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle intercom battery schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1398",
      "name": "Scooter drive belt wear log",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Scooter drive belt wear log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1399",
      "name": "Scooter roller weight combination",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Scooter roller weight combination",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1400",
      "name": "Motorcycle commuting time ledger",
      "category": "Motorcycle and scooter maintenance",
      "status": "planned",
      "purpose": "Motorcycle commuting time ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1401",
      "name": "Fleet vehicle assignment",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet vehicle assignment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b3b6a51632c01a1e3c4d3e92cca2e03535d2542a728a3576616d92588849b5b1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Loaded route-leg distances (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Empty route-leg distances (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1403",
      "name": "Fleet cost per productive hour",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet cost per productive hour",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1404",
      "name": "Fleet vehicle replacement scenario",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet vehicle replacement scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1405",
      "name": "Fleet maintenance downtime forecast",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet maintenance downtime forecast",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1406",
      "name": "Fleet spare vehicle requirement",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet spare vehicle requirement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1407",
      "name": "Fleet driver shift legality worksheet",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet driver shift legality worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1408",
      "name": "Fleet fuel card reconciliation",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet fuel card reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "8f11046ba5ba6f256918b49f2727c9a67af2d4fb1918ce77eb6b506cf7f3ba65",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Start odometer (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "End odometer (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recorded trip distances (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1410",
      "name": "Fleet idle fuel cost",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet idle fuel cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1411",
      "name": "Fleet loading factor",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet loading factor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "32a0913c37b07f4b8bfc2ec3f6d6064d89b2c8cd7804655b41012d62ff35baf9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Actual arrival minutes after midnight",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Window start minutes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Window end minutes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "71101b3fc6c00e082b1c6fbd51aaeb83639ba46ab311525ff59c71208cddef18",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Old route distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New route distance (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Old route duration (h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "New route duration (h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Distance cost (currency/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Time cost (currency/h)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "h",
          "label": "Old tolls",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "i",
          "label": "New tolls",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1414",
      "name": "Fleet tire cost tracking",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet tire cost tracking",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1415",
      "name": "Fleet damage downtime cost",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet damage downtime cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b459432da4900f34751e2f04b8069328c7f6f2184a43824ec9ec8c18e0d3745b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fuel by observed trip (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Trip distances (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Route-load class codes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1417",
      "name": "Fleet depot parking layout",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet depot parking layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1418",
      "name": "Fleet wash bay throughput",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet wash bay throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "0eee6952fa1a746e4880e57ea4b9c1cba680a574ecb9ebe01ab9e14f7c2ed35d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Vehicles",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Events per vehicle per day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bytes per event",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Upload overhead (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Days in billing period",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "g",
          "label": "Price per decimal GB",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3b28e778ca59bb7f31611ffd621cf43df01c7881e3d6094d9e2926133feced2c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Planned crossing charges in chronological order",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Current toll account balance",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Required ending balance",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1421",
      "name": "Fleet driver overtime scenarios",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet driver overtime scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "45dc1671ecf976bca4921aec0bec50749f14b77376e1eaf1693f43486a742ca9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Nominal hours by vehicle",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Excluded downtime hours",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Booked hours",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1423",
      "name": "Fleet seasonal lease comparison",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet seasonal lease comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1424",
      "name": "Fleet geographic service capacity",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet geographic service capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1425",
      "name": "Fleet incident rate denominator",
      "category": "Commercial fleet operations",
      "status": "planned",
      "purpose": "Fleet incident rate denominator",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1426",
      "name": "Depot charging slot allocation",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "Depot charging slot allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1427",
      "name": "Depot coincident charging peak",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "Depot coincident charging peak",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1428",
      "name": "EV demand-charge invoice scenario",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV demand-charge invoice scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1429",
      "name": "EV charger sharing throughput",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charger sharing throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1430",
      "name": "EV departure state-of-charge plan",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV departure state-of-charge plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1431",
      "name": "EV charging taper integration",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charging taper integration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1432",
      "name": "EV cold-weather fleet scenario",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV cold-weather fleet scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1433",
      "name": "EV battery preconditioning budget",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV battery preconditioning budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1434",
      "name": "EV charger cable reach layout",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charger cable reach layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1435",
      "name": "EV connector compatibility inventory",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV connector compatibility inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1436",
      "name": "EV charger downtime revenue",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charger downtime revenue",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1437",
      "name": "EV charging reimbursement ledger",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charging reimbursement ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1438",
      "name": "EV public charging membership threshold",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV public charging membership threshold",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1439",
      "name": "EV charging roaming fee comparison",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charging roaming fee comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1440",
      "name": "EV route elevation energy scenario",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV route elevation energy scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1441",
      "name": "EV charger installation phase allocation",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charger installation phase allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1442",
      "name": "EV solar-aware charge scheduling",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV solar-aware charge scheduling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1443",
      "name": "EV vehicle-to-building energy window",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV vehicle-to-building energy window",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1444",
      "name": "EV battery lease allowance",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV battery lease allowance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1445",
      "name": "EV charger cable loss estimate",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charger cable loss estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1446",
      "name": "EV charge-session anomaly audit",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charge-session anomaly audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1447",
      "name": "EV fleet energy procurement budget",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV fleet energy procurement budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1448",
      "name": "EV battery usable-capacity observation",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV battery usable-capacity observation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1449",
      "name": "EV charging bay idle-fee exposure",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV charging bay idle-fee exposure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1450",
      "name": "EV fleet transition staging",
      "category": "Electric vehicle depot planning",
      "status": "planned",
      "purpose": "EV fleet transition staging",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1451",
      "name": "Bus headway service frequency",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Bus headway service frequency",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "fca4969dd81b744d1dc6b0f9c92fcbaccb4c393f97df9171b6f4b3075be74826",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Outbound running time (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Inbound running time (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Recovery at first terminal (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Recovery at second terminal (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Target headway (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fad6daee43b7dd98f0d3f1e3fdac742974801fea463512f8cdf51bfd4ffadd10",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Boarding counts by stop",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Alighting counts by stop",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Initial onboard passengers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Vehicle passenger capacity",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "428ed23ecb4afdb415ba4567e002a3355c73b4643874468c1a3e90d960c8cea3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Boarders by stop",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Alighters by stop",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured boarding rate (people/s/door)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Measured alighting rate (people/s/door)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Dedicated boarding doors",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "g",
          "label": "Dedicated alighting doors",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "h",
          "label": "Fixed door overhead per stop (s)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1455",
      "name": "Bus bunching headway variability",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Bus bunching headway variability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1456",
      "name": "Bus transfer connection reliability",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Bus transfer connection reliability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a85b2e057b1d090e8c9fb77cce2e92059b751910a79728045dedfa3bc8e646cc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Daily uncapped eligible journey totals",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Daily fare cap",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Weekly fare cap",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1458",
      "name": "Transit pass break-even calendar",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit pass break-even calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e2ca7b435ebf140e55643c3a18895b57bf91e7fde9105ad48e9b9795ffdbad71",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First departure (minute after midnight)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Last allowed departure (minute after midnight)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Headway (min)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Excluded departure minutes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1460",
      "name": "Transit operator relief schedule",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit operator relief schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1461",
      "name": "Transit layover capacity",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit layover capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1462",
      "name": "Transit demand-responsive seat allocation",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit demand-responsive seat allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1463",
      "name": "Transit wheelchair space bookings",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit wheelchair space bookings",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1464",
      "name": "Transit platform clearance time",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit platform clearance time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ada33c7a86fd1d2aae2f1955d7c1407a196fec85dba095fd5c9c7176abd81412",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Supplied walk times from origins (min)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Population or demand at those origins",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Chosen catchment time (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1466",
      "name": "Transit journey-time percentile",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit journey-time percentile",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1467",
      "name": "Transit missed-trip compensation",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit missed-trip compensation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ddf6f52b530bcf1ef4bc2d3df39446a307f10a3e52d0a9c3c270db9c431f0c10",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Segment identifiers on route A",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Segment distances on route A (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Segment identifiers on route B",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Segment distances on route B (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1469",
      "name": "Transit weekend service scenario",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit weekend service scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1470",
      "name": "Transit lost-property handling workload",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit lost-property handling workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1471",
      "name": "Transit ticket machine throughput",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit ticket machine throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1472",
      "name": "Transit electric bus layover charging",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit electric bus layover charging",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1473",
      "name": "Transit demand elasticity scenario",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit demand elasticity scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1474",
      "name": "Transit route subsidy per passenger",
      "category": "Public transport service planning",
      "status": "planned",
      "purpose": "Transit route subsidy per passenger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e62d81e5551ddcded549d7b535de5c8f5b6bc89e139b74d246de9b5f9221c1e4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Observed running times (min)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Scheduled running time (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Additional recovery allowance (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1476",
      "name": "Model railway track radius conversion",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway track radius conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1477",
      "name": "Model railway grade transition",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway grade transition",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1478",
      "name": "Model railway helix geometry",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway helix geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1479",
      "name": "Model railway turnout ladder length",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway turnout ladder length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b548c555533bb78dff26fddb7e4a8d1ce7ad097f63ecf44a60dc66c08e77cd36",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Car body lengths (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Locomotive body length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Inter-vehicle coupling gap (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable platform length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1481",
      "name": "Model railway block occupancy plan",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway block occupancy plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1482",
      "name": "Model railway decoder current budget",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway decoder current budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1483",
      "name": "Model railway LED district allocation",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway LED district allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1484",
      "name": "Model railway bus wire drop scenario",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway bus wire drop scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "acb210fb37260086c85b2c8de9f6f5b19da932807e7b1863c6b93eabeb448ee9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Terrain patch areas (m²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Plaster thickness by patch (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured mixed yield (L/kg dry)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Maximum dry batch size (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1486",
      "name": "Model railway ballast purchase",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway ballast purchase",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d54f401917cba3a5091b5ce8a1c0eaf7bd580bc5f067838c9efe43febbdb09e9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Contour top elevations (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Contour footprint areas (m²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Foam sheet thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Purchased sheet area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "86e15ba3559725b841f3a7f651b8c9dbe343d66fd5adeb155f78b8ece2168b2c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Prototype event times (min from session start)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Fast-clock ratio (prototype minutes per real minute)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Real setup allowance before session (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1489",
      "name": "Model railway wagon spotting",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway wagon spotting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1490",
      "name": "Model railway coupler-height audit",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway coupler-height audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1491",
      "name": "Model railway rolling-stock roster value",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway rolling-stock roster value",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1492",
      "name": "Model railway storage cassette fit",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway storage cassette fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "cfcb51ca6736768489fbca932bde45208b48eaf800c8ea9e2878c468bfcce23f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Turnouts by control group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Turnouts supported per module by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Wires per turnout by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Average wire run per turnout by group (m)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1618a0ba1e9a57121b878cdbdbae88023377b7e2cc449ea2b405325e9c478bc0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Model rolling-stock body width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Body height above rail (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured outward curve offset (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Measured inward curve offset (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Supplied lateral margin each side (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Supplied top margin (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1495",
      "name": "Model railway bridge span scaling",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway bridge span scaling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1496",
      "name": "Model railway wheelbase curve offset",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway wheelbase curve offset",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1497",
      "name": "Model railway track expansion allowance",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway track expansion allowance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2aba4ea3b0da2f4ed0b8af32b80419c050ec18120ad9c7ef8f883ff12385dc57",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Prototype lettering width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Prototype lettering height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Scale denominator",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Print resolution (pixels/inch)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1499",
      "name": "Model railway session wagon demand",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway session wagon demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1500",
      "name": "Model railway exhibition packing plan",
      "category": "Model railways and miniature transport",
      "status": "planned",
      "purpose": "Model railway exhibition packing plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f242c484508c9d56654351db065209abbef73860eb8fbc4ecfb36c9a876e5808",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Oven deck width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Tray width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Clearance between trays (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Identical oven decks",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Total trays to bake",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Bake duration per load (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1502",
      "name": "Bakery proofing cabinet occupancy",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery proofing cabinet occupancy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1503",
      "name": "Bakery mixing bowl utilization",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery mixing bowl utilization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1504",
      "name": "Bakery dough temperature blend",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery dough temperature blend",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "26c9a97c0c941231cef30efd015bf307702030bdff5c555ffc282d64df08f91d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Planned dough mass by recipe (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Flour fraction of total dough by recipe (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Flour in stock (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7120ab19691bc7c40a3f8d3cf7207aca1b0ae263827a0e2c963edc648c23d905",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Production levain demand (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Starter retained after production (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Feed flour parts per starter part",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Feed water parts per starter part",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Starter currently available (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1507",
      "name": "Bakery overnight production schedule",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery overnight production schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6240c10f52011aef2c9a8ca117f5051b523dd2ff9f3e5b4038c1a66a487186d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial fat-layer count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Fold multipliers in chronological order",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "73ba49eab5229d35bedba9d88f0f6957ffc1fc60938a6467545348f7b57688dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dough sheet width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Dough sheet depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Triangle base (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Triangle height (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Edge trim on each side (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f0bc524a845da1ca92165cff896ba73521043872287124620c00c9d23f826a89",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required baked width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Required baked depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Observed width shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Observed depth shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Raw cutting trim per side (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "08f12b2a869ada451b7c3513d51c9256f8369a9e245bd687a28481c9da5a0a84",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target baked muffin mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Observed baking mass loss (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cavities to fill",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Measured deposit waste (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "77a6ae5149958258fd8115d1937a400ac00f1dc3b292808587690f70d90240d4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pre-bake batch masses (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Cooled baked batch masses (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dbe1aa9577fed0f5a6066901c8b3c8c97386e93d782498172c85c001f928b470",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Test tin internal volume (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Successful test dough load (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "New tin internal volumes (mL)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Chosen relative loading factor",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4284b7d513299162b50e4cbcd56403b577cbc8cca69a2379d9c1c8bd95f24e4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tray width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Test-baked cookie diameter (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Gap between baked cookies (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total cookies",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1515",
      "name": "Bakery cake stacking mass",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery cake stacking mass",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1516",
      "name": "Bakery frosting coverage test",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery frosting coverage test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "bbaf1b3761c85f445e3f9e282f70f1b53ec61d8cff27e71ea912f497bb79609d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Piece counts by product",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Chosen filling mass per piece (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured filling process loss (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Ingredient package mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Maximum filling batch mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bd6da3ea6a958d41f1340a5177a7777b565f544a18a57ead93049bbc70e7347d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Loaf length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "End trim per end (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Slice thickness (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1519",
      "name": "Bakery display restock cadence",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery display restock cadence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "675197549a3f3b86a4d5a50ff986c06d1f33cb555721b7fad42b19151aef0e5d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unsold units",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Regular price per unit",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Markdown percentage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Assumed fraction sold at markdown (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Chosen non-cash donation value per remaining unit",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f316e145e60c4240b22c28b004987ad8f3653dd5273a5e20fde1c40f3204ca5e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Customer orders in packs",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Units per sales pack",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Units per minimum production batch",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1522",
      "name": "Bakery allergen changeover schedule",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery allergen changeover schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1523",
      "name": "Bakery custom-order deposit timeline",
      "category": "Bakery production planning",
      "status": "planned",
      "purpose": "Bakery custom-order deposit timeline",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "50fd138ca70c5b50023aed555ddf680bf53e49df8745652d6f020e56c8dcf81d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Trays issued by customer",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Trays returned by customer",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Deposit per tray",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Deposits already refunded by customer",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "65bdd8b720d621faa707cae5cc379e0274bb1431c7443ce65c7694236266193c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Production units by SKU",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Setup minutes by SKU",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Processing minutes per unit by SKU",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Available production minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6e61c91e3935e002013da092a2ed1d2eb024d31fdcdfaa2c21415cd74654732c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cavity volume (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cavity count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Shell share of cavity volume (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Measured chocolate density (g/mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Measured filling density (g/mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5411e75a5f42ef0c8c12e16a461286c6faed4ec6eb7ad30f43c01a251f901243",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rectangular cavity width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Rectangular cavity depth (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Rectangular cavity height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Uniform shell thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1528",
      "name": "Chocolate tempering batch allocation",
      "category": "Chocolate and confectionery production",
      "status": "planned",
      "purpose": "Chocolate tempering batch allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1529",
      "name": "Chocolate seeded blend arithmetic",
      "category": "Chocolate and confectionery production",
      "status": "planned",
      "purpose": "Chocolate seeded blend arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ff9d556ec5df22dae4f9bd176787ff04f2fb705ed1338374558c23252e15f6f3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Couverture ingredient masses (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Label cocoa percentages",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3ad91256e53dfad8fda5d60d11bdbd27ca1185d41cbdc11b8ccb84fd2511134f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient masses (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Soluble solids by ingredient (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Water evaporated (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7b38c551fbe1a7d38301e6ad5ec6f486aba7bb061c2364d9cb771f4261a0b361",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial mixture mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Initial soluble solids (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Target soluble solids (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d07a9e480d2df70b09808ebefed0f2cfef4f3673ce0d2c6d865ed0758dbc6cb2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient masses (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured finished caramel mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target piece mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7a83276ccbdabe23cfdc2994b3ce3f9452c1fbfc5f9de6256333dfcdd14d1358",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Slab width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Piece width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Edge trim each side (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fbb9b88de22f58997836253bfff516f054949ce3662b0dd04f2654f0f519d06a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Finished nougat batch mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Nut inclusion (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Fruit inclusion (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other inclusion (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1536",
      "name": "Truffle center rolling inventory",
      "category": "Chocolate and confectionery production",
      "status": "planned",
      "purpose": "Truffle center rolling inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "fce959e394a177fcb63f6cf0b8b9d471b725511b4f2a62a57363b07266b64326",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Item masses before coating (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Item masses after coating (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured coating waste (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "24c70ccfcda1565f6726d0048d9958ea819be3c87062045caa7127ac828bf77a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Flavor inventory counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Required pieces of each flavor per bag",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Target bags",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "68d4d4ed3ccbb5dd204833e7d3b59f1a2e2e31b2199b01b931a15130637d09ac",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Available molds",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Pieces per mold",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Full mold cycle duration (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Cooling slots for molds",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Cooling duration per mold (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1540",
      "name": "Chocolate cooling rack occupancy",
      "category": "Chocolate and confectionery production",
      "status": "planned",
      "purpose": "Chocolate cooling rack occupancy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e00b005142329794ce77c5660d3b9d5337c26e1252af04d91dd87af1d4f9ef57",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fresh batch mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Available rework mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplied maximum rework fraction of final blend (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "cf2f974ae74d7b40fad788237ea3b7656b9140086d8d1a3a767205734c38e3c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Transfer sheet width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Motif width and depth (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Spacing between motifs (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Motifs needed",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1543",
      "name": "Confectionery gift-box cavity fit",
      "category": "Chocolate and confectionery production",
      "status": "planned",
      "purpose": "Confectionery gift-box cavity fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "609cb49b562b60a96babe413a61dd3b08f9d032108e564b4a5735c90eb285f23",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient issued by lot (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Recorded production use by lot (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Returns to stock by lot (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Measured losses by lot (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1545",
      "name": "Confectionery batch coding calendar",
      "category": "Chocolate and confectionery production",
      "status": "planned",
      "purpose": "Confectionery batch coding calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f28dd7cc4696474d724fe80f0befd9580dbb95de6443ea931852fb5d44f5ea6c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Footfall scenarios (people)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Assumed purchase conversion (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Units per purchase",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Product mix weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9f31102ad17cc6f792631522ea3ff5d3499b985d0a8e3b0d19581a53d72bc7df",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Visitors",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Samples per visitor by product",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Sample weight by product (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Ingredient cost by product (currency/kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Other event costs",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fad0128f67ab155f295e135a53adc85447923b72194443108be672ff9e15bd4d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Humidity readings (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Interval durations represented (h)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Supplier working-band lower bound (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplier working-band upper bound (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1549",
      "name": "Confectionery label ingredient order",
      "category": "Chocolate and confectionery production",
      "status": "planned",
      "purpose": "Confectionery label ingredient order",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1550",
      "name": "Chocolate shipping insulation comparison",
      "category": "Chocolate and confectionery production",
      "status": "planned",
      "purpose": "Chocolate shipping insulation comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1551",
      "name": "Brew gravity points balance",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew gravity points balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1552",
      "name": "Brew original-final gravity alcohol estimate",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew original-final gravity alcohol estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1553",
      "name": "Brew apparent attenuation",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew apparent attenuation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1554",
      "name": "Brew mash efficiency audit",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew mash efficiency audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1555",
      "name": "Brew pre-boil volume target",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew pre-boil volume target",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1556",
      "name": "Brew kettle evaporation calibration",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew kettle evaporation calibration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1557",
      "name": "Brew water loss ledger",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew water loss ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1558",
      "name": "Brew hop utilization estimate",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew hop utilization estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1559",
      "name": "Brew hop substitution arithmetic",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew hop substitution arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1560",
      "name": "Brew beer colour estimate",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew beer colour estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1561",
      "name": "Brew fermenter headspace check",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew fermenter headspace check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1562",
      "name": "Brew fermentation temperature log",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew fermentation temperature log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1563",
      "name": "Brew hydrometer temperature correction",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew hydrometer temperature correction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1564",
      "name": "Brew refractometer correction",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew refractometer correction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1565",
      "name": "Brew blending gravity",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew blending gravity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1566",
      "name": "Brew blending alcohol",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew blending alcohol",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1567",
      "name": "Brew packaging loss audit",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew packaging loss audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1568",
      "name": "Brew bottle cap inventory",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew bottle cap inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1569",
      "name": "Brew keg rotation schedule",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew keg rotation schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1570",
      "name": "Brew tap-line volume",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew tap-line volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1571",
      "name": "Brew chilling measured performance",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew chilling measured performance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1572",
      "name": "Brew carbonation sugar arithmetic",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew carbonation sugar arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1573",
      "name": "Brew ingredient purchase batches",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew ingredient purchase batches",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1574",
      "name": "Brew bottle deposit ledger",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew bottle deposit ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1575",
      "name": "Brew flight tasting order balance",
      "category": "Brewing and fermentation arithmetic",
      "status": "planned",
      "purpose": "Brew flight tasting order balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1576",
      "name": "Restaurant table mix capacity",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant table mix capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1577",
      "name": "Restaurant reservation turn schedule",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant reservation turn schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1578",
      "name": "Restaurant no-show overbooking scenario",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant no-show overbooking scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c44cebf3e2b519f73041b8c90ee9debb2f9e66f810dd703371cf82036a010845",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dish order counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Station 1 minutes per dish",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Station 2 minutes per dish",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Station 1 staff",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Station 2 staff",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "g",
          "label": "Service window (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1580",
      "name": "Restaurant prep par levels",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant prep par levels",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "cae319654479b3847e8c84d879a3cfe836e92323b8de05eeec78a79dbee3c890",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Item units sold",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Selling prices",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Variable costs per item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1582",
      "name": "Restaurant menu price rounding comparison",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant menu price rounding comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "1c5b88574c03db8527f45e875815728bf49f85f75709c6a6002337a26563130c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Order times (minutes from common start)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Completion times (minutes from common start)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Service-period numeric identifiers",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1584",
      "name": "Restaurant ingredient cross-utilization",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant ingredient cross-utilization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "0a4f8ecc689833c222c93cd549345f1449358cf181a79d5becce34d16c79a67d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Served food mass by menu item (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Returned uneaten mass by item (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Food cost by item (currency/kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a25d344374433826f54df0a371be5102c9097038d3c9adad3e14543fe25d5e5d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial oil fill (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Oil top-ups during period (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured disposed oil (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Oil remaining in fryer at end (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Oil price (currency/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Food output (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "h",
          "label": "Disposal fee (currency/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1587",
      "name": "Restaurant dishwasher rack throughput",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant dishwasher rack throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1588",
      "name": "Restaurant glassware par stock",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant glassware par stock",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1589",
      "name": "Restaurant cutlery shortage planner",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant cutlery shortage planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1590",
      "name": "Restaurant service section balancing",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant service section balancing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1591",
      "name": "Restaurant tip pool policy split",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant tip pool policy split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1592",
      "name": "Restaurant split-course timing",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant split-course timing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1593",
      "name": "Restaurant walk-in wait estimate",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant walk-in wait estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "04c0eee90a3171856b5de32a2645221aa79bc2e937364bb7772ba928023b2557",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Orders by sales channel",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Average food revenue per order by channel",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Commission by channel (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Packaging cost per order by channel",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Food cost per order by channel",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "g",
          "label": "Fixed channel fees",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1595",
      "name": "Restaurant meal bundle margin",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant meal bundle margin",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1596",
      "name": "Restaurant cancellation fee arithmetic",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant cancellation fee arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1597",
      "name": "Restaurant cover forecast from bookings",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant cover forecast from bookings",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1598",
      "name": "Restaurant opening day inventory",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant opening day inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a3b1ad7626e6f3aa1e54b7c97e294a4d002499162afe465d19f0e53ddd5d6728",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured handover task work (staff-minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Staff available during handover",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Scheduled overlap (min)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1600",
      "name": "Restaurant equipment bottleneck comparison",
      "category": "Restaurant operating workflows",
      "status": "planned",
      "purpose": "Restaurant equipment bottleneck comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1601",
      "name": "Cafe espresso station throughput",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe espresso station throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f1b00481a1a2e1dfe211238d4bac026e9ea67de8799d90af8586512c7ad66e51",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Milk poured by batch (mL)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Milk served by batch (mL)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Milk discarded by batch (mL)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1603",
      "name": "Cafe milk alternative inventory",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe milk alternative inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1604",
      "name": "Cafe cup-lid compatibility tally",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe cup-lid compatibility tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "24d10140f4b53afa37851be061308b4d02fbab9a9c327e3f19f37ffd1f11af1f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Single-drink takeaway orders",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Two-drink takeaway orders",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Four-drink takeaway orders",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Packaging spare allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7f9c3e11eaef8cefecab6a68f6d8436b1b2f1104b04820784f5cb9ed91f0a396",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured grinder retention (g/changeover)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Blend changeovers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Additional purge (g/changeover)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Coffee purchase price (currency/kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1607",
      "name": "Cafe roast-to-brew stock rotation",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe roast-to-brew stock rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a8d087b93369e96eaedd4f3fa2b0f34b9cbf06fffc74ae048d8b2447f8f0951f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Served single-shot drinks",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Served double-shot drinks",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Dose per shot (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Coffee discarded in purges (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Bean price (currency/kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a999dbc48ace645ce8cbd633746216fb2f277376ab22b9d778b326660aa3480b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Concentrate strength (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target beverage strength (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Serving liquid volume (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Number of servings",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1610",
      "name": "Cafe batch brewer service schedule",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe batch brewer service schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1611",
      "name": "Cafe queue abandonment scenario",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe queue abandonment scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e44a58c5b488d38ea204fef62390e5fb53add884598be6cdb1784a6bb3386ddc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Forecast drink orders",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Expected pastry attachment (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pastries initially displayed",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reserve pastry stock",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6618ed1c3f03051c48557c86c2e239c654e4ed6b02e69e67a970e1ea0c009d41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Paid visits per customer per month",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Stamps needed for one reward",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Reward fulfillment cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Expected redemption (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9fbfc1ad3af484dcaf5496e8cb1db442edd3cba639683487f541daeb752ef74a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Orders per pickup slot",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Active preparation (minutes/order)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Staff preparing orders",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Pickup slot length (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d300cd0b8200923c2c75e69b17447f1b08f1f1e9e4aff32cc1e1ce64e9c2da8d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cups issued in period",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cups returned in period",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Opening cups outstanding",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Deposit per cup (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Wash capacity (cups/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6e6e7fa757f6cf1784bd7e1d17eb62387c96f81701263cf39ee2ef060dd4cdeb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Receipts by table (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Occupied seats by table",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Occupied duration by table (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e4e011c3bc6eee1ec7734e30249c62bba5a3244c7ccd609444ae00a9d5388097",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total cafe seats",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Outlet-equipped seats",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Current seated customers",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Customers requiring an outlet",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dd0e8670e95e9fb8018da68cd929ce1c6156173c118de06f921fa0f3a207cd0d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Metered brew-water use (L/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Supplier rated cartridge capacity (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Cartridge purchase cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Planned operating days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6ebe9fe2ddb733a798753a62f5e32cd22f85c5d928594663ab54b8e8bfde7ed5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gross platform orders (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Refunded sales (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Commission on net sales (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Other supplied platform fees (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Actual payout received (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1620",
      "name": "Cafe morning prep timeline",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe morning prep timeline",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1621",
      "name": "Cafe syrups and toppings stock",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe syrups and toppings stock",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "589d18afc3304c300900e7f31da1efae647bf7c5981f191f225c22e08b24834a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Usable cup volume (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured ice displacement (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Concentrate parts in liquid recipe",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Diluent parts in liquid recipe",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1623",
      "name": "Cafe customer arrival staffing",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe customer arrival staffing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1624",
      "name": "Cafe catering urn allocation",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe catering urn allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1625",
      "name": "Cafe reusable container return rate",
      "category": "Coffee shop production and service",
      "status": "planned",
      "purpose": "Cafe reusable container return rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "12c121903758895151e7bf0c5a35bf796c0f90403811a644e7fb137e97ea84c6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured pack weights (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Declared target weight (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Ingredient cost (currency/kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1627",
      "name": "Food pack underweight sample audit",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food pack underweight sample audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c6e2091dfd87ddac6143f52d5d239c019a7736fcdef18a6ee192f6774e386be4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Planned saleable packs",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Assumed reject rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Pack pitch along film (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Packs across each film advance",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Usable roll length (m)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c44ad8bd7cfee71fac1a8ccd278b3d2273cc46acf440ee14ea82e244ba8b0ae0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tray cavities per cycle",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cycle time (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Downtime per scheduled hour (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reject rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ad26ebea6c8c323b5a476a6d1a3857da563502862a8457589b4a7d06e0daa769",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Labels issued by batch",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Labels used by batch",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Labels spoiled by batch",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Labels returned by batch",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b740d1f1bd32e78547336a672eb3baed723b8fb3325908318558ea1fba033c82",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Ingredient lot masses entering batch (kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Finished output mass (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rework transferred out (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Recorded processing loss (kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "642be3fe8a53abd607c4cbfac2f7e38e3ed9979b001711a10eccdbfeab7e0dcd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required saleable units",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Units per case",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Minimum order (cases)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1633",
      "name": "Food chill-room slot allocation",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food chill-room slot allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1634",
      "name": "Food temperature excursion summary",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food temperature excursion summary",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1635",
      "name": "Food delivery thermal test comparison",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food delivery thermal test comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1636",
      "name": "Food dispatch expiry priority",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food dispatch expiry priority",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1637",
      "name": "Food reusable crate wash capacity",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food reusable crate wash capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "9864aee21a1f7e97b3a692ef686a989ddbbb083356b2f88e1c847e4e88176c2e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rectangular item length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Item width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Item thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Seal allowance at each end (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available flat bag width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Available bag length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1639",
      "name": "Food modified-atmosphere gas inventory",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food modified-atmosphere gas inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7ce1424df2117674ae060523ed8861d583698a3aa5a087273875e91d87214c73",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gross sample weights (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Container tare weights (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured drained food weights (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1641",
      "name": "Food nutritional recipe arithmetic",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food nutritional recipe arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1642",
      "name": "Food allergen matrix coverage",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food allergen matrix coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1643",
      "name": "Food shelf-life label calendar",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food shelf-life label calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1644",
      "name": "Food recall affected-stock tally",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food recall affected-stock tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "3de814c30b48845ef77aa12a23154681184500a8d4c1d3631d1101582fa00fb4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Batches produced per day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Samples retained per batch",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Retention window (days)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Packed volume per sample (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1646",
      "name": "Food carton compression stacking worksheet",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food carton compression stacking worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e229abeeba484b1df8e11993d0758162d5b8306b71631b1014455e4f831cd527",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Alphabet symbols per batch-code character",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Characters in daily batch suffix",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Expected batches per day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Distinct date-prefix values",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9d024d37151dad0a2c8c082b499847ad87682ec28ffed53fc1a3bc3c0014d59f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Reference masses (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observed scale readings (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Allowed absolute error (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "50b01451a0381e855c41bcdee429216108966b0cfb8c99efa5ac3bc3090953e3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original ordered packs",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Original pack content (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Substitute packs delivered",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Substitute pack content (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Original price per pack (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Substitute price per pack (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1650",
      "name": "Food delivery proof completion",
      "category": "Food packing and distribution",
      "status": "planned",
      "purpose": "Food delivery proof completion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1651",
      "name": "Grocery shelf facing allocation",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery shelf facing allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "78dee2eef2dbff884e4c5585c5f415ba6579d33625da84016fea4801f2fe8909",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Units remaining by expiry cohort",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Whole selling days remaining by cohort",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Expected daily demand (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1653",
      "name": "Grocery markdown ladder simulation",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery markdown ladder simulation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1654",
      "name": "Grocery fresh delivery cadence",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery fresh delivery cadence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1655",
      "name": "Grocery produce display refill",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery produce display refill",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2ba3c813b866d8adf810cdcb6cbf15e9abd442645b1665df0d7b14b8ff7a5dca",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured container tare samples (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Configured tare (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Product sale price (currency/kg)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1657",
      "name": "Grocery checkout basket throughput",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery checkout basket throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1658",
      "name": "Grocery express lane split",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery express lane split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "25cd825c3670288b06dbac056f4ab1bc6ae8974e8eda703802e3a6496a699eb5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Customer arrival rate (customers/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Customers using a trolley (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average trolley trip duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Return/reposition lag (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available trolley fleet",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1660",
      "name": "Grocery basket-size distribution",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery basket-size distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b3001028580f29afaa3814725f10a46a076a1fbe822f46f71be41e2102f478c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Baseline daily demand (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Assumed promotion uplift (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Promotion days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Usable stock before promotion",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Confirmed receipts during promotion",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1662",
      "name": "Grocery supplier pack mismatch",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery supplier pack mismatch",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1663",
      "name": "Grocery cold cabinet energy log",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery cold cabinet energy log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1664",
      "name": "Grocery stock count valuation",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery stock count valuation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1665",
      "name": "Grocery fruit ripening batch plan",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery fruit ripening batch plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1666",
      "name": "Grocery reusable bag demand",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery reusable bag demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "45dcb20b23540f5e285e1b1dac4ec316f13446c7965036265229a129d8d444f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Average lines per collection order",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Pick time per line (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Packing time per order (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Pickers assigned to slot",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Slot duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Orders already assigned",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3d99de14b950459d888b4d3ce3d4fd37917d19efdafa35a7fc87b11ca02e1f98",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Accepted substitutions by category",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Rejected substitutions by category",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Refund value per rejected item by category (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4d7fa5222d9c31bb06e846cba28c2240d886cefb2119cdb098475a293ff29e22",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Waste losses by department (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Theft adjustments by department (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Damage losses by department (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Receiving shortage losses by department (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b858dfc122a7094cd7954e299868ccc5664e657310b41049523867d9c727889c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Starting deli product mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Trim and unusable loss (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Target portion mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Purchase cost of starting product (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "24068db4456afc78db89afcdf0d8d9ab2e7dbb1faf7a04b9ff11b04148622a1f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gross refill weights by container (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Container tares (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Refill prices (currency/kg)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1672",
      "name": "Grocery market stall stock load",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery market stall stock load",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d41e6990bddc338727651d10776eb6a093271baaf81bef4f52287a6ffd4bc042",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Changed product labels",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labels per print sheet",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Print setup (minutes/batch)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Sheets in one print batch",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Placement time (seconds/label)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1674",
      "name": "Grocery supplier rebate reconciliation",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery supplier rebate reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1675",
      "name": "Grocery donation pickup volume",
      "category": "Grocery and fresh retail operations",
      "status": "planned",
      "purpose": "Grocery donation pickup volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1676",
      "name": "Hotel room occupancy calendar",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel room occupancy calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7a98ca23112830957a18affad25981fe9bd200fe8c4686f18a05e6a5a55393dd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Room receipts by segment (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Sold room-nights by segment",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d787ba8ba8ba03b53708c5345b25e017678e79e4cc651b26ba888b62c9a14bb8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current room revenue (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Current available room-nights",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Previous room revenue (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Previous available room-nights",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "159dbefc3bb12c0947e0d03e8dc33197778fdf2c02c5326d21e87f8c0bff2f99",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current operating profit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Current available room-nights",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Comparison operating profit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Comparison available room-nights",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1680",
      "name": "Hotel housekeeping assignment",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel housekeeping assignment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1681",
      "name": "Hotel check-in desk staffing",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel check-in desk staffing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1682",
      "name": "Hotel early-check-in availability",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel early-check-in availability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e9e42fda614ee4e8f8ef19535c329625f9e4c459b4fb8a5daffe41a35b3f701c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Opening linen inventory by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "New linen received by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Recorded discarded linen by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Closing usable count by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1684",
      "name": "Hotel minibar restock",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel minibar restock",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d24451d4432d467c5d52c4bd07eb57aa32d00712e789fe72fb338f768e24a459",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Occupied rooms per night",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Forecast nights",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Average stay length (nights)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Arrival amenity packs per room",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Additional packs per occupied room-night",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Usable amenity stock",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1686",
      "name": "Hotel room upgrade inventory",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel room upgrade inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1687",
      "name": "Hotel overbooking scenario",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel overbooking scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1688",
      "name": "Hotel group block pickup",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel group block pickup",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e0fa21d6a74a76a5119d17a4aaca3de9d4e44efe752aba9c2cc1998bbfafe3db",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Booking total (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Deposit already paid (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Notice before arrival (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Full-refund cutoff (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Late-cancellation charge (% of booking)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1690",
      "name": "Hotel OTA settlement reconciliation",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel OTA settlement reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "45f2c8810c941266e10db7860aa0ae747c31ea1870d41e6a48126889dd09d9d1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Booking value (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Variable stay cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Direct acquisition cost per booking (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "OTA commission (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Expected repeat bookings per acquired direct customer",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "18310144542a541c81cc7c5f807c2a5546149f8782ada207a98b9b85d4b264fe",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Occupied rooms by day",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Average guests per occupied room",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Breakfast package uptake (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Walk-in breakfast covers by day",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1693",
      "name": "Hotel room deep-clean rotation",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel room deep-clean rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1694",
      "name": "Hotel maintenance room outage",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel maintenance room outage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "52f9325e87fe288e0f9831a323d5628e5ee4d2a48db0fc25876ada167732d51a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Available room-nights",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Candidate nightly rates (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Assumed occupancy at each rate (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Variable cost per occupied room-night (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "87fb913113e4c3f0b20d7e96258b4d5acbdacbf7d47914ba0a2595bfc2fcde5e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Long-stay nights",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Utilities per occupied night (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cleaning visits during stay",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Cost per cleaning visit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Booking commission (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Desired stay contribution (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4c1882e813e04fa599820a6c8883fa753162f701b513d85d300c1cb4c0896692",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Energy allocated to rooms (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Occupied room-nights",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Available room-nights",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Energy unit price (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1698",
      "name": "Hotel pool towel par stock",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel pool towel par stock",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1699",
      "name": "Hotel meeting-room setup turnaround",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel meeting-room setup turnaround",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1700",
      "name": "Hotel guest transfer vehicle plan",
      "category": "Hotel and accommodation operations",
      "status": "planned",
      "purpose": "Hotel guest transfer vehicle plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1701",
      "name": "Museum timed-entry capacity",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Museum timed-entry capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2f1773e825b2dfd2bc74638b71d40a27dbfd6bdbf9d3da9314802912cb7b5238",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Visitors entering per hour",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Share visiting each gallery (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Mean gallery dwell times (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Desired occupancy by gallery",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1703",
      "name": "Guided tour group rotation",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Guided tour group rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1704",
      "name": "Tour guide workload allocation",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Tour guide workload allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "cf7ebb4233d3e6e7a618132c61191773c9588f5996806f70323db823c1e40622",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Annual pass price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Single-entry price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Per-visit pass-holder fee (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Planned eligible visits",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1706",
      "name": "Attraction family ticket comparison",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Attraction family ticket comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b09080ed13071bea3694101c466f490aa5a96571286de48340387460886a2efa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Passenger party sizes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Luggage volume by party (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Bus passenger seats",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Bus usable luggage volume (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "32ef8ad474512281f08ec1caa7f237f3b9c31638741f8d02fc3c93cc8f658611",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Visitor arrivals per hour",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visitors renting an audio guide (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average rental duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Charge and clean turnaround (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Serviceable audio-guide devices",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1709",
      "name": "Visitor locker demand curve",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Visitor locker demand curve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1710",
      "name": "Attraction queue virtual-slot spacing",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Attraction queue virtual-slot spacing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "8d5538ad8d685ae75601f759373c926e88a9aef5cd771df3c9d45bdf1db4b8ee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Seats per dispatch",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Dispatch interval (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Downtime per scheduled hour (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Observed seat occupancy (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1712",
      "name": "Museum exhibition installation schedule",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Museum exhibition installation schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1713",
      "name": "Exhibition crate storage allocation",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Exhibition crate storage allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "dd5d18635f346d629a6de86d26bb0d39cd55027f1034ebeb568b3e345c40e8a5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Weather scenario probabilities (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Gross booked revenue by scenario (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Refunds by scenario (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Operating and cancellation costs by scenario (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f9ef6db2ece75986f6629fa111b384f15544bbbecc523e4b9f58d94852ed6c46",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fixed guide cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Fixed transport cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Price per participant (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Variable cost per participant (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available participant capacity",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1716",
      "name": "Tour language demand allocation",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Tour language demand allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "1843be31399a9315bc13e69830358020aeac2a33ae187120aafe82ac9590cb4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Walking leg distances (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Entered walking paces (minutes/km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Stop durations after each leg (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Additional itinerary buffer (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a11bee7bf3b27a6afe10fb5ef02cffab45f40179468998bae259462dc4f655f8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Visitors in reporting period",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Distinct donors",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Total donation receipts (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "569a2e731be7c2aacb7ebede882dbda2b5ebebab7948e0a2bebf607fcdd04343",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Attraction visitors",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Gift-shop transactions",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Gift-shop receipts (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Gift-shop goods cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3b6efd841ab52ce7be294b3f0ea29e2dcc73b7a9857dd3578b602554a703e865",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Members due for renewal by cohort",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Members renewed by cohort",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1721",
      "name": "Event exhibit power allocation",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Event exhibit power allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1722",
      "name": "Attraction accessible-session bookings",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Attraction accessible-session bookings",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1723",
      "name": "Tour operator departure manifest weight",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Tour operator departure manifest weight",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1724",
      "name": "Tour supplier payment timeline",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Tour supplier payment timeline",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1725",
      "name": "Attraction seasonal staffing calendar",
      "category": "Visitor attractions and tour operations",
      "status": "planned",
      "purpose": "Attraction seasonal staffing calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1726",
      "name": "Salon chair appointment packing",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon chair appointment packing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1727",
      "name": "Salon processing-time overlap",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon processing-time overlap",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b098dfe1571c9d58912697d7e418c208f139f8023341c54ec7fbfa1ab495d59e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required mixture batch mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Manufacturer product A ratio parts",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Manufacturer product B ratio parts",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Available product A (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available product B (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "499bc919180ea4f79abda7493cb6de3103fbace66bcc41f2d1c9a09535fb3f62",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Prepared bowl masses by service (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Applied masses by service (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Discarded masses by service (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Mixture cost (currency/g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4604fde042ec4c840cb5657e27486cc0f8ee037ad374f37c4194cfe1a8bf18c9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Service prices (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Supplies cost per service (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Occupied chair minutes per service",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "abbeab1a022959de28b19cdf4020dbf557c0791e3b4e2be1e47a9277c51cc012",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible stylist receipts (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Refunds against eligible receipts (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "First commission band cap (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Rate in first band (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Rate above first band (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1732",
      "name": "Salon appointment deposit settlement",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon appointment deposit settlement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "79ee32f76f328ded190106d9005b972dd716a51090a41a3e17e7e287740c866e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Missed service bookings",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cancelled slots refilled",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average booked service price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Avoided consumables per unserved booking (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Collected no-show fees in total (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1734",
      "name": "Salon rebooking interval calendar",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon rebooking interval calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1735",
      "name": "Salon tool sterilizer cycle scheduling",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon tool sterilizer cycle scheduling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "04a1c8ef077d013581afca4c8cc1fe70daf56e4990b3ed0b9d6f869cb636c115",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Services per operating hour",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Towels per service",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Laundry round-trip time (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Towels required ready at opening",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Towels currently serviceable",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0ca3020e5d834c159f969f2a5d62df36c88341bb64aa0325a1edf4c07060caf8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Daily retail product sales by SKU",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Daily service use by SKU",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Replenishment lead times by SKU (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Usable stock by SKU",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Desired cover after delivery (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fc57c9c8dea591f77e163f21aebb2327afcc220f62595b211bb9499cafdde611",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Practitioner gross receipts (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Fixed chair rent (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Revenue share owed to salon (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Metered extras consumed (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Included extras (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Price per excess unit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1739",
      "name": "Salon treatment room turnover",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon treatment room turnover",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "604e20c6dc48425b4705bf39921d7658759a9790c2e5674a40caae651cc6c6c9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bundle selling price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consumable cost by service (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Active staff minutes by service",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Loaded staff hourly cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Bundle discount versus separate list prices (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1741",
      "name": "Salon appointment waitlist matching",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon appointment waitlist matching",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1742",
      "name": "Salon junior-senior work allocation",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon junior-senior work allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7fd789ee1720ce435faf0355dd9943a883bccb6bb78e4b7986135f3175aceff4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Forms submitted by service",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Required fields per form by service",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Completed required fields by service",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1744",
      "name": "Salon loyalty visit reward cost",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon loyalty visit reward cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ccefaeb9333b9e26f313d0419731c9fd3b2efac3aabecc680a027bed438b17fd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Booked appointment minutes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Actual appointment minutes",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1746",
      "name": "Salon mobile visit route schedule",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon mobile visit route schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "1f9b63cb9b40e57a2111ce49c85f34f177b6e056f990b342578bfc473cc863f8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tester bottles issued",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Usable product per bottle (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured dose per trial (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Bottle purchase price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Measured handling loss per bottle (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1748",
      "name": "Salon late-arrival policy arithmetic",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon late-arrival policy arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1749",
      "name": "Salon staffing leave coverage",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon staffing leave coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1750",
      "name": "Salon service price change communication list",
      "category": "Salon and appointment businesses",
      "status": "planned",
      "purpose": "Salon service price change communication list",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e44edb2acbdd5f399d64dfbeb10cddedae55be2650f141cf84f27d43962f056c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Retainer included hours by client",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Approved rollover hours by client",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Available delivery hours this period",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Hours already used by client",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1752",
      "name": "Consultation package redemption ledger",
      "category": "Personal service business administration",
      "status": "planned",
      "purpose": "Consultation package redemption ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7e0b6c0c8d78e2f67b70f2d2f6a5793ce012e7ffd4af577eb550c8f8e395ce78",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Scheduled lesson counts by rate band",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Canceled lesson counts by rate band",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Chargeable cancellation counts by band",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Lesson prices by band (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Payments already received (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1754",
      "name": "Music teacher term lesson plan",
      "category": "Personal service business administration",
      "status": "planned",
      "purpose": "Music teacher term lesson plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1755",
      "name": "Personal trainer room schedule",
      "category": "Personal service business administration",
      "status": "planned",
      "purpose": "Personal trainer room schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d6235ef39b34ab3edcb6c3cdec7d7d7972cc2c468e2d87f0a7eec89d9ed61138",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Booked service counts by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Consumable units per service type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Already packed consumable units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplier pack size (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Additional travel-day reserve units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1757",
      "name": "Language interpreter booking buffers",
      "category": "Personal service business administration",
      "status": "planned",
      "purpose": "Language interpreter booking buffers",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "686ec10cde8e7c6865de041b8a1d885beb8e1cab38757b42c8b5921c90b2ec46",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Items to organize by room",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured items processed per worker-hour by room",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Helpers including lead organizer",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Daily productive hours per worker",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a2d9715a95fab11bbc9583c53bf5bf9b40cf834ef936d37c6767b755c66afbc2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Weekly task repetitions by client",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Minutes per task by client",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Other weekly administration (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Available working hours per week",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8192638850c7e763069513ce9a2efd92cff2b94ac2992743078d907f76fbbdeb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Images to edit by queued job",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured editing speed (images/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Editing hours available per workday",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Deadlines in working days from now",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "29d6f1995a3e35944bd107af015897fb7f2bd9d655797bdfd238dbd2cf64eafa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Supplier contract total (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Milestone installment percentages",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Payments against each milestone (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Days from today until each milestone",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1762",
      "name": "Commissioned artwork milestone billing",
      "category": "Personal service business administration",
      "status": "planned",
      "purpose": "Commissioned artwork milestone billing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "25ef5ba3ea4ec91814cd2cc1234a19f303b5c9f01c7fc4bac443de9aa5c13a03",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Diagnostic fee (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Approved repair labour (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Approved repair parts (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Diagnostic fee credit toward repair (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Diagnostic fee already paid (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "afe753e47b2992309b0de8ad630e3341f36cbe26de7480ccffd24b47933c62aa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Enrollment scenarios (students)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Tuition per student (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Teacher cost per class term (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Venue cost per class term (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Materials per student (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1765",
      "name": "Pet photographer session booking",
      "category": "Personal service business administration",
      "status": "planned",
      "purpose": "Pet photographer session booking",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "397d01a87d6f227199351b0ec21e1c21f01aa46a8524545ba481c89222b94c46",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Round-trip travel minutes by zone",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Round-trip travel expense by zone (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Lesson duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Desired return per total working hour (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Other direct lesson expenses (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bca3ef81dca2ba91126b8ad2ae0b4df02081efeea8c6ad201e5a44d80a7d5eef",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Canceled service slots",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Probability of refilling each slot (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Replacement service price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Variable cost of delivered service (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cancellation fee per unfilled slot (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e5ad11d507752f03920da68b1b65a429bae8e673b98e621879621cb51c2361cf",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unredeemed credit face values by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Days until cohort expiry",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Expected redemption before expiry by cohort (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Reporting horizon (days)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c2acbb1104d355c129536574ea5497d4673d72d372e0b769a663314aa923b90b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Additional task low estimates (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Additional task high estimates (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Hourly billing rate (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Existing accepted quote (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Daily available project hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "82ce43b2bf7481208b7be786f0da74c26a4d1ce04ec67be7da25f91ab7704c38",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Invoice face values (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Receipts allocated to invoices (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Days overdue at report date",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "08701f8ace392c030ac8fe14198ed83b9f7d515416ffd89c72ce517d5bbdc817",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Workshop participants",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Participants sharing each group kit",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Individual kits in stock",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Shared kits in stock",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Individual kit cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Shared kit cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5400d59943cfa34222f4092a2a7084d9d3970e5d2e434a2fd9379e6518f10ae4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Round-trip travel time (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visit setup time (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Billable work time (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Desired contribution per occupied hour (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Direct travel expense (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Direct job materials (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5e1715ab2a1ad163b6519ede533c21e3d34292361e6ed10034bb208015d14f68",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Booking lead times for service A (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Booking lead times for service B (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1774",
      "name": "Client project handover completeness",
      "category": "Personal service business administration",
      "status": "planned",
      "purpose": "Client project handover completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a95bb5fe2bc993d9903e8d4d92e796eb4eeda97afb8545fb5f6c979e7c058d04",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Planned nonworking weeks",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Weekly unavoidable business costs (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Weekly planned owner draw (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Expected receipts during leave (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cash already earmarked (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Saving weeks before leave",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a4bf3ad1dccd14628f0b0dfa6bb0316ebefd2ce50d61ebd5f8348817835dcf91",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Round-trip travel minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Diagnostic minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Repair labour minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Labour rate (currency/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Parts cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Fixed callout charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Included labour minutes in callout",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1777",
      "name": "Electrician point-installation workload",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Electrician point-installation workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1778",
      "name": "Decorator room masking inventory",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Decorator room masking inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "057ef75cb7622b40f4218d7d539ac0f51e9bcabf089e7a232629c5477d65ee3c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Assembly joints by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Specified fixings per joint by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Fixings per supplier pack by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Existing fixings by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1780",
      "name": "Handyman minimum-day booking",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Handyman minimum-day booking",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1781",
      "name": "Trades material pickup itinerary",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades material pickup itinerary",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "10c02acd6f7ec97bb705919899b6ba1d3bc5efbcaa23e76c0f06af9ca3a47afd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Quoted material costs by line (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Days until supplier quote expires",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Planned purchase days from today",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Assumed increase after expiry (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e5281557872b93a67205b4e2ba53b3741396c5822131c4f296d672d42480516c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured waste loads by type (tonnes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Gate fees per tonne by type (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Tickets received by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Expected tickets by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Fixed haulage total (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "11d1aa2406d5592998fa1204820b117a0143c21939d697e531d89b701c56a4d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Idle crew members",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Crew standby rate per person-hour (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Equipment standby rate per hour (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Access delay (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Unavoidable restart cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c0bb9a8b076c6181db7f25fad20ac8931e1dff86eb60c04d2664f891c9db1f91",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cumulative completed-work valuation (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Retention percentage",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Previous certified payments (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Approved current-period deductions (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1786",
      "name": "Trades retention release calendar",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades retention release calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "36addb67632c4f72bf821ef72fc6dc49eaecae11e9eec1a0c438e88292ff848e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original contract sum (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Approved variation values (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Payments already received (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Incremental labour cost of variations (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Incremental material cost of variations (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1788",
      "name": "Trades subcontractor availability",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades subcontractor availability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1789",
      "name": "Trades site delivery lift plan arithmetic",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades site delivery lift plan arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1790",
      "name": "Trades consumable kit per job",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades consumable kit per job",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1791",
      "name": "Trades apprentice supervision coverage",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades apprentice supervision coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e357babac8483df43841777bcb566d7d3a161def8ecb9d57e704e166cb4b229c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Job fees by travel zone (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Round-trip travel minutes by zone",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Work minutes per job",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Travel expense by zone (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Materials per job (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a2c0656e41bb8945f47ea455c5e601d6e0dd4f52b50c5887c1bd985673554599",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Signed labour hours by worker",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Agreed hourly rates by worker (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Materials total (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Equipment total (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Submitted daywork sheets",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Signed daywork sheets",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "932dfc7f0b7fecae17fdc9d102c7260e463d7f01b26b3907d3bf36dd386bb1f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Common line quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Option A rates by line (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Option B rates by line (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Option A fixed extras (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Option B fixed extras (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1795",
      "name": "Trades snag-list completion forecast",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades snag-list completion forecast",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1796",
      "name": "Trades tool inspection register",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades tool inspection register",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "bc1d5ea69457f430ca069b5c059e1f30ef20e81d141e899e8d8d389c2f3bc4b3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Van stock after recent usage by part",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Target replenishment levels by part",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Supplier pack sizes by part",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1798",
      "name": "Trades contract rounding reconciliation",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades contract rounding reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "89c38a251dad8c2575c1593f20a1bf52f7fcc6d92c883e475bcce4fee659239f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Original contract revenue (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Original estimated cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Approved revenue changes (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "d",
          "label": "Costs already committed (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Uncommitted remaining forecast cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1800",
      "name": "Trades weather-delay schedule scenario",
      "category": "Trades quoting and site coordination",
      "status": "planned",
      "purpose": "Trades weather-delay schedule scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f65d0694684db2b0bfd5e09a5892c3d0865ff6914c55b50d02a91aa9c2cbe8f2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cleanable areas by site (m²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Services per week by site",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured cleaning rates by site (m²/worker-hour)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d4bf237bdeae5a2251de06289a006f796e875be28459b4dca3fd38e9cf0917a3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Task counts per shift",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Minutes per task",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Paid breaks per worker (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Workers assigned",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Supervision hours per shift",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Loaded hourly labour cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1803",
      "name": "Cleaning zone assignment balance",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning zone assignment balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4446c1f85d02309c10ce0cfba7a3402ef5d607fea10c04d349c22122bc858005",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Area completed (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Total elapsed shift time (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Recorded interruptions (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Planned machine rate (m²/productive hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "451c83c5fbb6df3905365bf72d337351c50b6b3c2783f0e9b19329183c9d51c1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Usable scrubber solution tank (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured solution use (L/m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Area to clean (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Refill time (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "47a4ec09669a0ca6e8ca8c567d62edd8bbe3c97434064e57c7cbd0d12d4388bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Approved finished-solution quantities by job (L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Product label doses by job (mL/L)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Usable concentrate stock (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Concentrate bottle size (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1807",
      "name": "Cleaning microfiber colour inventory",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning microfiber colour inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1808",
      "name": "Cleaning restroom supply forecast",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning restroom supply forecast",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "aba7b9f78d320d9c29d89332939325d512335ca1f86053fd0866bf9963886568",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rectangular bin opening length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Bin opening width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Bin depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Tie allowance above rim (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Available liner lay-flat width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Available liner length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c3d3bcce4133c1837efcd4f3b01a1c9c0965bc91f04acc133e9c40981a2a67d8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bins by zone",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Bag changes per bin per day",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Minutes per bag change",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Daily access-route time (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Liners per purchased roll",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1811",
      "name": "Cleaning high-level access quote",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning high-level access quote",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "8662e4a91732977cee2c25fffb39d306be10022187a1896fbd5e9c3b9d856d5d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pane areas completed by access class (m²)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Actual task times by class (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Nonproductive access/setup times by class (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9c30bec23221d2baec6eef798cc24bd8d470df9a6473d0943113c07f7bfc1fe9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current contract price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Contract cost-component weights (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Supplied component index changes (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9a9768dc1e546cb7e96d3ceadae0547dea7b1ade426a53e70fd85f6ab3c43b07",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Inspectable zones by site",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Chosen sample fraction (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Inspection duration per zone (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Available inspection minutes",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3645aee0c27cca9206c4989d91052694eb01d7c19759c95b75a7e97f0ff725be",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Scheduled task instances by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Missed task instances by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Agreed credit per missed task (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Maximum credit for period (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1816",
      "name": "Cleaning absentee cover",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning absentee cover",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1817",
      "name": "Cleaning keyholding route",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning keyholding route",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1818",
      "name": "Cleaning carpet extraction moisture log",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning carpet extraction moisture log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1819",
      "name": "Cleaning washroom peak demand",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning washroom peak demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "10ed3c37b5709b9049ccf280ea7eb50ea2d22ba56f6326ed7beab966de8a157b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Floor area to coat (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Supplier coverage (m²/L/coat)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "User-selected coat count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Material loss allowance (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Usable material stock (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Can size (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1821",
      "name": "Cleaning periodic work calendar",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning periodic work calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7610319002097c2c592c3898c4b8789bcccb9cbe9b72916ed9e53166c2471973",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Contract cleanable area (m²)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Quoted price per m² (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Expected paid labour hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Loaded hourly wage (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Supplies for contract period (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Allocated period overhead (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "217cb5bd5e39d6764414e6459524381691e242e90292d2d349962b926a8ed780",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Clocked hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Recorded travel hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recorded paid breaks (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Recorded productive task hours",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "2fa3058d183f56cf7b1ec7e1a196812dccdaf52bd856a1ea8cc3f1d018747bd0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Opening consumable stock by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Purchases by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Recorded issues by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Physical closing count by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "e",
          "label": "Unit acquisition costs (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1825",
      "name": "Cleaning route fuel allocation",
      "category": "Commercial cleaning operations",
      "status": "planned",
      "purpose": "Cleaning route fuel allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1826",
      "name": "Rental availability conflict calendar",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental availability conflict calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "9be5ebc74d0d6007e8fb01d5f27cc602bf198c0c50ae6b461e8ea403e1c5c4d2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Elapsed rental time (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Billing-period length (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Minimum billable periods",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Charge per period (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fixed rental extras (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1828",
      "name": "Rental weekend rate comparison",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental weekend rate comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "bb39f7cda7240307cabe14502f594753ecf31742d7292415fe5e44a9e82a7a9d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Asset purchase and setup cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Rental days per year scenarios",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Rental revenue per day (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Variable cost per rented day (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Annual fixed maintenance cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1830",
      "name": "Rental cleaning turnaround capacity",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental cleaning turnaround capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "82a49fab4ab5f7fbc5645285767db75778f4209c27676f016d98ca009be8bb6a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current operating meter by asset (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Meter at last service by asset (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "User-specified service intervals (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1832",
      "name": "Rental late-return knock-on schedule",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental late-return knock-on schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1833",
      "name": "Rental delivery collection batching",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental delivery collection batching",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2a7cc6f65d0022d534b83801a42cf9960aa4bd276abdabf5f3632b8241f412af",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Deposits held by rental (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Approved deductions by rental (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Inspection completed flag by rental (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1835",
      "name": "Rental damage waiver scenario",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental damage waiver scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6550cc6f94c35f11b0295d9286a2ae2fb1e8f73d85d1ff8678adbcdeca52fb10",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Issued accessory counts by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Returned accessory counts by item",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Approved replacement charge per accessory (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Deposit available against charges (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1837",
      "name": "Rental seasonal stock sizing",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental seasonal stock sizing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "18765536969faba4d3ad4377aa4b55e0a81d55c1a806a4bb5aca0c783e987b62",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Available calendar days by asset",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Hired days by asset",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Maintenance days by asset",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9bcd178c1e993e00b23ef693e5ae6a2edaf8fc04dedbbd1ccaec01d0de049e23",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Equipment quantities by line",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Billable periods by line",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Rate per equipment-period (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Delivery and collection (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Consumables (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Alternative flat package quote (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4d57ef3f9e677f29272012f2212d2481745ac078a403bd35bf9e0493afebd909",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Consumable units purchased",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Purchase cost per unit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Units resold",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Resale price per unit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Units wasted",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b3092101268b828cf4f33063951be4d7716c9214af94c37c83e1d0a1c12b7a50",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Forecast use (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "External subhire rate (currency/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Purchase price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Expected resale proceeds after horizon (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Owned variable cost (currency/use-day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Owned fixed cost over horizon (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8052aec64795fcaf4afaefddfbc107ca3f3c1af36745ed643e8f201c31cb6f98",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Actual metered rental runtime (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Included runtime (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Overage billing increment (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Price per excess hour (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Base rental charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1843",
      "name": "Rental inspection checklist coverage",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental inspection checklist coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1844",
      "name": "Rental age-based resale scenario",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental age-based resale scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1845",
      "name": "Rental storage yard fit",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental storage yard fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "9db028e12d9f29b98c656dc3d68deaa38928b319188607a04552d2c56763c14e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Component stock counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Components required per rental kit",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Booked complete kits",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1847",
      "name": "Rental booking amendment price",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental booking amendment price",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1848",
      "name": "Rental cross-branch transfer",
      "category": "Equipment hire and rental operations",
      "status": "planned",
      "purpose": "Rental cross-branch transfer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f1ae32bc2df213f7b4c9812277fa2c13e3ef377f0b3e0e5d69c0b3df779fc630",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unpaid rental invoices (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Deposits held (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Replacement value of active rented assets (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Policy inclusion of active asset value (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Supplied customer exposure limit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "47d3bfebf8f5b58dd74aedb7bf958c0e72a551a7b44e1d6d7d7a17d61e28b013",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Downtime rental-days by cause",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Total fleet calendar asset-days",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Lost contribution per unavailable rental-day (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1851",
      "name": "Coworking desk booking overlap",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking desk booking overlap",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "1f6728cc6854079c60a01e67e1f7e91f7fc01e50eec85f5954bd2a92c18b329c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Members by plan type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Assumed daily attendance by plan (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Usable desks",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Guest desks required per day",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ecb4785b3d91d7bfb75ecb697bb51d27c84d74e8188b49c2d740d06d3e3882d1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Opening meeting credits",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New period meeting credits",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Credits expiring before bookings",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Booking charges in credits",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Maximum credits allowed to roll forward",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Cash price per excess credit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1854",
      "name": "Coworking hot-desk peak profile",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking hot-desk peak profile",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1855",
      "name": "Coworking private office density",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking private office density",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4a8d2d4d2d148a0d41165a61d04ab2688d671cac6e7f4bbfca5acdf2eff10fe9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Planned desk visits",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Single day-pass price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Visits included in one pass bundle",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Bundle price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Monthly unlimited membership (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "7d77bbc4ab796058495bf6b1f897a018f2e05cc043b11380dbd39949413b4291",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Monochrome page counts by member",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Colour page counts by member",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Monochrome charge per page (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Colour charge per page (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Total supplier printing cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "01995b9763c559a781a4cc721a0262e7d57841ce4eb0503398f77349aa9bed63",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Concurrent users by application class",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured average bandwidth per user by class (Mbps)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Usable internet link capacity (Mbps)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Assumed burst multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1859",
      "name": "Coworking locker subscription rotation",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking locker subscription rotation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "51057fc6a19de9ea0bac7c168ab326fb924d408d58de06aa86e7acaefbe295e3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cards issued to active members",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Cards returned by active members",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Cards issued to departed members",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Cards returned by departed members",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Active-member card records with no valid member match",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1861",
      "name": "Coworking cleaning demand by occupancy",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking cleaning demand by occupancy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1862",
      "name": "Coworking member visit cohorts",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking member visit cohorts",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1863",
      "name": "Coworking room acoustic booking conflicts",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking room acoustic booking conflicts",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1864",
      "name": "Coworking event conversion layout",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking event conversion layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "70ef6496cb67a6bb1d31a687d0fef78a76dce9a8f5fed8a8797946a38be19147",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Period coworking receipts (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Dedicated desks in service",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Hot desks in service",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable reporting days",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Desk receipts excluding non-desk services (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3656604366bb3fbf3247f76ce0dcdce476f8885e4a1fcc718ecc1514555209d7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tenant submeter use (kWh)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Shared unmetered use (kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Shared-load allocation weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Energy price (currency/kWh)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fixed bill charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "981c1ac07c0dd96beec68f0000215483b14b53b93beceaa7428c535831b5fff2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Excess desk demand by day",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Partner available desks by day",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Partner desk-day rates (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ac89ef6ec26e7218d31fff74042aa5230c79dd3d5495e4766e91290a4ae4392d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Guest visits by member",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Included guest visits by member",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Overage charge per guest visit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1869",
      "name": "Coworking room cancellation credits",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking room cancellation credits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c508f1c330ad06d2a63fd9429417567dad2a9ffc59b68f181338e214e461fffd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mail items received per day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Handling minutes per incoming item",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average storage duration (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Average occupied shelf volume per item (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Collection handling minutes per item",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1871",
      "name": "Coworking monitor equipment pool",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking monitor equipment pool",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "94caf5e19a523aac402dc3115a25acfad9727a338f88ab2b8310e667962fcc7b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Booked meeting durations (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "No-show indicator per booking (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Release delay for unclaimed room (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Probability released minutes are rebooked (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1873",
      "name": "Coworking upgrade proration",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking upgrade proration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "29cb44aae8936edf136bfc6e2522981b531f6c410f42959c8e34a546ae441581",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "New desks in expansion",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Assumed paid desk occupancy (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Monthly receipts per occupied desk (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Added monthly rent and fixed operations (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Monthly variable cost per occupied desk (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "One-time fit-out cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1875",
      "name": "Coworking security staffing coverage",
      "category": "Coworking and shared facilities",
      "status": "planned",
      "purpose": "Coworking security staffing coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e177f9f7d28bba0d41f238415971d7497efc774a31e70f29efd899bc478e9805",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cohort acquisition cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Net cohort contributions by month (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0d4849064c45bd30f99d674ead1933a3d8153d15351ea2f3fef625af036845f9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Prepayments by contract (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Equal service periods in each contract",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Completed service periods by contract",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1878",
      "name": "Subscription billing anniversary drift",
      "category": "Subscription product operations",
      "status": "planned",
      "purpose": "Subscription billing anniversary drift",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1879",
      "name": "Subscription pause-resume credit",
      "category": "Subscription product operations",
      "status": "planned",
      "purpose": "Subscription pause-resume credit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c711328891a98a792a183c507e3c2e983752e6073feb65a1f26f44a8c7d65770",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Legacy accounts by cohort",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Legacy monthly price by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Current monthly price by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Months until migration by cohort",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "685490afa1db7f9adefde164a9b499cca652025f0c0c637a71f0bb27a203caaa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Old plan full-cycle price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New plan full-cycle price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Days in billing cycle",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Unused billable days at migration",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "One-time migration fee (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9675a872db5df3f6337575182e1c45c9df35e1ea569fdea4e38a008923403349",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Metered usage units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Included allowance units",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "First overage tier width (units)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "First overage rate (currency/unit)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Remaining overage rate (currency/unit)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Base subscription fee (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "67be9b06414e979360121715f4f26fb05562ffd610ba7e6516402aa9be3951da",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Seat counts in successive cycle segments",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Billable days in each segment",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Committed minimum seat count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Full-cycle seat price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Seat subscription amount already invoiced (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1884",
      "name": "Subscription annual discount cash tradeoff",
      "category": "Subscription product operations",
      "status": "planned",
      "purpose": "Subscription annual discount cash tradeoff",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a290421bdbe318373adb3ed6f7f6be2fe61e404ec81c36b3d96fac4cb046b805",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initially failed charges by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Gross successful recoveries by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Retry processing fees by cohort (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Retry attempts by cohort",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1886",
      "name": "Subscription retry calendar",
      "category": "Subscription product operations",
      "status": "planned",
      "purpose": "Subscription retry calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1887",
      "name": "Subscription entitlement reconciliation",
      "category": "Subscription product operations",
      "status": "planned",
      "purpose": "Subscription entitlement reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "5fbdfa78c9a34c0030d0d21d804863f9a3b1edd5e6c5049c6bf5853c60312935",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Open invoice balances in application order (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Available credit note value (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "eb505b2cd23be1e414ca8e551ae223351c9f27cd53ca0dd9182a9b9949049d34",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Beginning recurring revenue by account (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Ending recurring revenue by account (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Reason code by account (1=seats, 2=plan, 3=other)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9e4f65bd795d6937591027acb51627a3edba9ed6f82154297ebea0f029112c4b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Beginning paid seats",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Ending paid seats",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Beginning recurring price per seat (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Ending recurring price per seat (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Beginning recurring usage charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Ending recurring usage charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0a83523998c1bee0fb1fbd19d9cc4837668797c29e8341e8d9766ba14380acfa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible coupon accounts",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Subscription price per billing cycle (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Coupon discount (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Coupon-valid billing cycles",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Assumed eligible accounts redeeming (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b621c496361323c42c936355489d147999373070573849f179e195843864963f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Committed usage units for term",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Usage already consumed",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Forecast remaining usage",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Committed unit price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Overage unit price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "62c4a95c2ffe61335d587c6f30195d8dba6c58d64d1937e13fdc286860902f48",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "One-time retention offer cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Normal monthly contribution per account (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Monthly contribution reduction during offer (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Assumed additional retained months",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d9116c6812a6ab90fe1f2baf93d5353e5ea4f6737f39f6da59b436457c128320",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Reactivated accounts by cohort",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observed cohort receipts (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Cohort support costs (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Cohort reactivation offer costs (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "caf31a053e8769fb11a532e22955654209c351e803256dc4a79d4904634fd8a4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Expected invoice totals by account (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Issued invoice totals by account (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Signed posted billing adjustments (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1896",
      "name": "Subscription service credit arithmetic",
      "category": "Subscription product operations",
      "status": "planned",
      "purpose": "Subscription service credit arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "10c2138e2dee7e06bddf8bcaf8f664f51cebfb8d7b98800817c69efdee5f00a7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Support ticket counts by subscription plan",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Mean handling time by plan (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Active accounts by plan",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Loaded support labour rate (currency/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1898",
      "name": "Subscription family-seat allocation",
      "category": "Subscription product operations",
      "status": "planned",
      "purpose": "Subscription family-seat allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c5d3c7cc7b92c1d83e674e48c0c5fc34f1f51f0518ac2fb6a394a6da8ccf1f12",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Remaining committed billing periods",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Price per remaining period (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Early-exit fee as share of remaining charges (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Unapplied prepaid balance (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Other supplied exit charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "57f6f5ba9146c0f08c09492bfbc44e837e6ea268185059d0ac7bdc5332a92162",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Renewals needing review by week",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Review minutes per renewal",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Account managers available by week",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Renewal-review hours per manager-week",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Opening overdue renewal reviews",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1901",
      "name": "Insurance deductible layer comparison",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance deductible layer comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1902",
      "name": "Insurance coinsurance split",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance coinsurance split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1903",
      "name": "Insurance aggregate limit tracking",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance aggregate limit tracking",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1904",
      "name": "Insurance replacement-versus-cash settlement",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance replacement-versus-cash settlement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1905",
      "name": "Insurance underinsurance clause arithmetic",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance underinsurance clause arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1906",
      "name": "Insurance multiple-policy contribution",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance multiple-policy contribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1907",
      "name": "Insurance waiting-period claim dates",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance waiting-period claim dates",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1908",
      "name": "Insurance daily benefit cap",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance daily benefit cap",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1909",
      "name": "Insurance claim excess recovery",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance claim excess recovery",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1910",
      "name": "Insurance premium installment total",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance premium installment total",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1911",
      "name": "Insurance cancellation short-rate refund",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance cancellation short-rate refund",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1912",
      "name": "Insurance no-claims discount scenario",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance no-claims discount scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1913",
      "name": "Insurance vehicle mileage declaration",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance vehicle mileage declaration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1914",
      "name": "Insurance contents category sublimits",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance contents category sublimits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1915",
      "name": "Insurance valuables scheduled coverage",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance valuables scheduled coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1916",
      "name": "Insurance travel delay allowance",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance travel delay allowance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1917",
      "name": "Insurance baggage depreciation worksheet",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance baggage depreciation worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1918",
      "name": "Insurance business interruption arithmetic",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance business interruption arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1919",
      "name": "Insurance claim documentation checklist",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance claim documentation checklist",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1920",
      "name": "Insurance policy overlap calendar",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance policy overlap calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1921",
      "name": "Insurance claim payment reconciliation",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance claim payment reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1922",
      "name": "Insurance premium tax arithmetic",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance premium tax arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1923",
      "name": "Insurance broker fee comparison",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance broker fee comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1924",
      "name": "Insurance renewal quote normalization",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance renewal quote normalization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1925",
      "name": "Insurance risk retention cash reserve",
      "category": "Insurance policy arithmetic",
      "status": "planned",
      "purpose": "Insurance risk retention cash reserve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e0dfcfcf97d391ef04d76f1cf5124841aee607baf72d2d9106499d9e9835e694",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Statement closing bank balance (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Deposits in transit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Outstanding issued payments (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Ledger cash balance (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "e",
          "label": "Unrecorded bank charges (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Unrecorded bank credits (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5939621ff252025e2ba50b727d8e703dd4a6a9105d0c766b23a533632d9c95f7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Authorized petty-cash float (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Physical cash counted (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supported expense vouchers (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Approved outstanding staff advances (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1928",
      "name": "Invoice tax-inclusive split",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Invoice tax-inclusive split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1929",
      "name": "Mixed-tax invoice reconciliation",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Mixed-tax invoice reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1930",
      "name": "Credit note tax reversal",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Credit note tax reversal",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1931",
      "name": "Accounts receivable aging buckets",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Accounts receivable aging buckets",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1932",
      "name": "Accounts payable payment run",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Accounts payable payment run",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1933",
      "name": "Straight-line asset depreciation schedule",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Straight-line asset depreciation schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1934",
      "name": "Declining-balance depreciation schedule",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Declining-balance depreciation schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1935",
      "name": "Units-of-production depreciation",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Units-of-production depreciation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1936",
      "name": "Asset disposal book gain",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Asset disposal book gain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1937",
      "name": "Prepaid expense amortization",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Prepaid expense amortization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1938",
      "name": "Accrued expense reversal schedule",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Accrued expense reversal schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1939",
      "name": "Foreign-currency invoice settlement",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Foreign-currency invoice settlement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1940",
      "name": "Weighted-average inventory costing",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Weighted-average inventory costing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1941",
      "name": "FIFO inventory layer consumption",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "FIFO inventory layer consumption",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1942",
      "name": "Inventory write-down scenarios",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Inventory write-down scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1943",
      "name": "Intercompany balance matching",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Intercompany balance matching",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1944",
      "name": "Cashflow statement reconciliation",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Cashflow statement reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1945",
      "name": "Accrual-to-cash receipts bridge",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Accrual-to-cash receipts bridge",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1946",
      "name": "Bookkeeping transaction duplicate finder",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Bookkeeping transaction duplicate finder",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b31678225c9724fe6a4a2461a0733a5e7c8e8090dd3f5e32cc7396bcf5512a0a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Debit line amounts (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Credit line amounts (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Allowed balance tolerance (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1948",
      "name": "Trial balance movement analysis",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Trial balance movement analysis",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1949",
      "name": "Accounting period close workload",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Accounting period close workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1950",
      "name": "Sales tax reserve ledger",
      "category": "Bookkeeping and financial records",
      "status": "planned",
      "purpose": "Sales tax reserve ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1951",
      "name": "Payroll overnight shift splitting",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll overnight shift splitting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1952",
      "name": "Payroll overtime tier allocation",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll overtime tier allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1953",
      "name": "Payroll shift differential stacking",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll shift differential stacking",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1954",
      "name": "Payroll unpaid break deduction",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll unpaid break deduction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1955",
      "name": "Payroll holiday pay average worksheet",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll holiday pay average worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1956",
      "name": "Payroll leave accrual carryover",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll leave accrual carryover",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1957",
      "name": "Payroll final-period proration",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll final-period proration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1958",
      "name": "Payroll retroactive rate adjustment",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll retroactive rate adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1959",
      "name": "Payroll commission draw reconciliation",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll commission draw reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1960",
      "name": "Payroll piecework guarantee check",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll piecework guarantee check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1961",
      "name": "Payroll split-job time allocation",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll split-job time allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1962",
      "name": "Payroll time-clock rounding impact",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll time-clock rounding impact",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1963",
      "name": "Payroll on-call allowance tally",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll on-call allowance tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1964",
      "name": "Payroll travel-time pay worksheet",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll travel-time pay worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1965",
      "name": "Payroll reimbursement mileage tiers",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll reimbursement mileage tiers",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1966",
      "name": "Payroll expense per-diem arithmetic",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll expense per-diem arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1967",
      "name": "Payroll benefit deduction cap",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll benefit deduction cap",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1968",
      "name": "Payroll pension contribution worksheet",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll pension contribution worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1969",
      "name": "Payroll bonus allocation pool",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll bonus allocation pool",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1970",
      "name": "Payroll attendance incentive rules",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll attendance incentive rules",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1971",
      "name": "Payroll salary sacrifice scenario",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll salary sacrifice scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1972",
      "name": "Payroll contractor invoice hours audit",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll contractor invoice hours audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1973",
      "name": "Payroll timesheet approval coverage",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll timesheet approval coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1974",
      "name": "Payroll staffing cost forecast",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll staffing cost forecast",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1975",
      "name": "Payroll net-pay reconciliation",
      "category": "Payroll and work-time administration",
      "status": "planned",
      "purpose": "Payroll net-pay reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1976",
      "name": "Fundraising campaign net proceeds",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising campaign net proceeds",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "cd781f7eb73b58bebe8db6b295a521150fe185ce3b0c4042a45cfcb41050158b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Eligible donor gift amounts (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Matching multiplier",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Maximum matching amount per donor (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Remaining campaign matching pool (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-1978",
      "name": "Fundraising pledge collection schedule",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising pledge collection schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1979",
      "name": "Fundraising donor retention cohorts",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising donor retention cohorts",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1980",
      "name": "Fundraising recurring donor upgrade",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising recurring donor upgrade",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1981",
      "name": "Fundraising donor acquisition payback",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising donor acquisition payback",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1982",
      "name": "Fundraising event ticket subsidy",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising event ticket subsidy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1983",
      "name": "Fundraising raffle proceeds worksheet",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising raffle proceeds worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1984",
      "name": "Fundraising auction lot performance",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising auction lot performance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1985",
      "name": "Fundraising restricted-fund allocation",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Fundraising restricted-fund allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1986",
      "name": "Nonprofit grant budget variance",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit grant budget variance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1987",
      "name": "Nonprofit grant match requirement",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit grant match requirement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1988",
      "name": "Nonprofit in-kind contribution valuation",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit in-kind contribution valuation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1989",
      "name": "Nonprofit volunteer hour value",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit volunteer hour value",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1990",
      "name": "Nonprofit programme cost per outcome",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit programme cost per outcome",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1991",
      "name": "Nonprofit overhead allocation",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit overhead allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1992",
      "name": "Nonprofit reserve runway scenarios",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit reserve runway scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1993",
      "name": "Nonprofit donor receipt reconciliation",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit donor receipt reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1994",
      "name": "Nonprofit campaign thermometer projection",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit campaign thermometer projection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1995",
      "name": "Nonprofit collection tin reconciliation",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit collection tin reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1996",
      "name": "Nonprofit beneficiary kit distribution",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit beneficiary kit distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1997",
      "name": "Nonprofit food-bank parcel balance",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit food-bank parcel balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1998",
      "name": "Nonprofit volunteer onboarding capacity",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit volunteer onboarding capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-1999",
      "name": "Nonprofit grant reporting calendar",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit grant reporting calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2000",
      "name": "Nonprofit sponsorship benefits fulfillment",
      "category": "Nonprofit and community fundraising",
      "status": "planned",
      "purpose": "Nonprofit sponsorship benefits fulfillment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2001",
      "name": "Workforce headcount bridge",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce headcount bridge",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2002",
      "name": "Workforce full-time equivalent roster",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce full-time equivalent roster",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2003",
      "name": "Workforce vacancy capacity loss",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce vacancy capacity loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2004",
      "name": "Workforce skills coverage matrix",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce skills coverage matrix",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2005",
      "name": "Workforce succession coverage",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce succession coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2006",
      "name": "Workforce training seat allocation",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce training seat allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2007",
      "name": "Workforce certification expiry calendar",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce certification expiry calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2008",
      "name": "Workforce onboarding equipment demand",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce onboarding equipment demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2009",
      "name": "Workforce office attendance scenarios",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce office attendance scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2010",
      "name": "Workforce leave conflict coverage",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce leave conflict coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2011",
      "name": "Workforce overtime dependence",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce overtime dependence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2012",
      "name": "Workforce absence frequency severity",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce absence frequency severity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2013",
      "name": "Workforce retention survival cohorts",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce retention survival cohorts",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2014",
      "name": "Workforce turnover replacement budget",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce turnover replacement budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2015",
      "name": "Workforce compensation band position",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce compensation band position",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2016",
      "name": "Workforce salary compression comparison",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce salary compression comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2017",
      "name": "Workforce pay-gap decomposition worksheet",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce pay-gap decomposition worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2018",
      "name": "Workforce promotion budget allocation",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce promotion budget allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2019",
      "name": "Workforce merit matrix funding",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce merit matrix funding",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2020",
      "name": "Workforce benefits uptake budget",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce benefits uptake budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2021",
      "name": "Workforce learning-hour allocation",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce learning-hour allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2022",
      "name": "Workforce shift preference fairness",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce shift preference fairness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2023",
      "name": "Workforce commute policy reimbursement",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce commute policy reimbursement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2024",
      "name": "Workforce meeting load audit",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce meeting load audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2025",
      "name": "Workforce team span-of-control map",
      "category": "Workforce and people operations",
      "status": "planned",
      "purpose": "Workforce team span-of-control map",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2026",
      "name": "Recruiting funnel stage yield",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting funnel stage yield",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2027",
      "name": "Recruiting required applicant volume",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting required applicant volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2028",
      "name": "Recruiting interviewer capacity",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting interviewer capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2029",
      "name": "Recruiting panel schedule matcher",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting panel schedule matcher",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2030",
      "name": "Recruiting time-to-fill decomposition",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting time-to-fill decomposition",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2031",
      "name": "Recruiting offer acceptance cohorts",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting offer acceptance cohorts",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2032",
      "name": "Recruiting agency fee scenarios",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting agency fee scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2033",
      "name": "Recruiting referral reward liability",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting referral reward liability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2034",
      "name": "Recruiting candidate travel reimbursement",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting candidate travel reimbursement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2035",
      "name": "Recruiting job advert budget allocation",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting job advert budget allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2036",
      "name": "Recruiting assessment workload",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting assessment workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2037",
      "name": "Recruiting scoring rubric aggregation",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting scoring rubric aggregation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2038",
      "name": "Recruiting interviewer agreement",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting interviewer agreement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2039",
      "name": "Recruiting take-home task completion",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting take-home task completion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2040",
      "name": "Recruiting start-date capacity plan",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting start-date capacity plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2041",
      "name": "Recruiting requisition priority matrix",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting requisition priority matrix",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2042",
      "name": "Recruiting background-check timeline",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting background-check timeline",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2043",
      "name": "Recruiting contractor conversion costs",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting contractor conversion costs",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2044",
      "name": "Recruiting hiring-plan budget bridge",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting hiring-plan budget bridge",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2045",
      "name": "Recruiting candidate pipeline aging",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting candidate pipeline aging",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2046",
      "name": "Recruiting sourcing contact workload",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting sourcing contact workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2047",
      "name": "Recruiting interview cancellation recovery",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting interview cancellation recovery",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2048",
      "name": "Recruiting talent-pool refresh schedule",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting talent-pool refresh schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2049",
      "name": "Recruiting location offer comparison",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting location offer comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2050",
      "name": "Recruiting hiring freeze scenario",
      "category": "Recruiting and talent operations",
      "status": "planned",
      "purpose": "Recruiting hiring freeze scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2051",
      "name": "Support interval staffing worksheet",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support interval staffing worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2052",
      "name": "Support Erlang C wait model",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support Erlang C wait model",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2053",
      "name": "Support backlog age distribution",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support backlog age distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2054",
      "name": "Support priority queue simulation",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support priority queue simulation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2055",
      "name": "Support SLA business-clock deadline",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support SLA business-clock deadline",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2056",
      "name": "Support first-response percentile",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support first-response percentile",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2057",
      "name": "Support resolution reopen adjustment",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support resolution reopen adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2058",
      "name": "Support concurrent-chat capacity",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support concurrent-chat capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2059",
      "name": "Support escalation workload",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support escalation workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2060",
      "name": "Support knowledge deflection estimate",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support knowledge deflection estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2061",
      "name": "Support self-service success funnel",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support self-service success funnel",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2062",
      "name": "Support channel cost allocation",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support channel cost allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2063",
      "name": "Support multilingual coverage",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support multilingual coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2064",
      "name": "Support incident surge buffer",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support incident surge buffer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2065",
      "name": "Support ticket merge reconciliation",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support ticket merge reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2066",
      "name": "Support customer satisfaction weighting",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support customer satisfaction weighting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2067",
      "name": "Support quality sampling allocation",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support quality sampling allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2068",
      "name": "Support coaching time budget",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support coaching time budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2069",
      "name": "Support shift handoff inventory",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support shift handoff inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2070",
      "name": "Support refund approval workload",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support refund approval workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2071",
      "name": "Support entitlement usage tracking",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support entitlement usage tracking",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2072",
      "name": "Support callback window scheduling",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support callback window scheduling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2073",
      "name": "Support outage credit processing",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support outage credit processing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2074",
      "name": "Support duplicate contact rate",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support duplicate contact rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2075",
      "name": "Support automation exception budget",
      "category": "Customer support operations",
      "status": "planned",
      "purpose": "Support automation exception budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2076",
      "name": "Procurement bid landed-cost normalization",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement bid landed-cost normalization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2077",
      "name": "Procurement quantity-break order choice",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement quantity-break order choice",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2078",
      "name": "Procurement supplier lead-time distribution",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement supplier lead-time distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2079",
      "name": "Procurement delivery promise accuracy",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement delivery promise accuracy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2080",
      "name": "Procurement purchase requisition approval time",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement purchase requisition approval time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2081",
      "name": "Procurement blanket order drawdown",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement blanket order drawdown",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2082",
      "name": "Procurement contract price-index adjustment",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement contract price-index adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2083",
      "name": "Procurement early-payment discount return",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement early-payment discount return",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2084",
      "name": "Procurement foreign-currency exposure",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement foreign-currency exposure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2085",
      "name": "Procurement minimum-order consolidation",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement minimum-order consolidation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2086",
      "name": "Procurement supplier allocation resilience",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement supplier allocation resilience",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2087",
      "name": "Procurement material substitution equivalence",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement material substitution equivalence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2088",
      "name": "Procurement invoice three-way match",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement invoice three-way match",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2089",
      "name": "Procurement open-order cancellation",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement open-order cancellation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2090",
      "name": "Procurement vendor rebate accrual",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement vendor rebate accrual",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2091",
      "name": "Procurement consignment stock settlement",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement consignment stock settlement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2092",
      "name": "Procurement packaging return credits",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement packaging return credits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2093",
      "name": "Procurement supplier score weighting",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement supplier score weighting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2094",
      "name": "Procurement warranty return batch",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement warranty return batch",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2095",
      "name": "Procurement spend concentration",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement spend concentration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2096",
      "name": "Procurement maverick spend audit",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement maverick spend audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2097",
      "name": "Procurement tender evaluation workload",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement tender evaluation workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2098",
      "name": "Procurement reorder lead-time buffer",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement reorder lead-time buffer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2099",
      "name": "Procurement milestone invoice exposure",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement milestone invoice exposure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2100",
      "name": "Procurement contract renewal calendar",
      "category": "Procurement and supplier management",
      "status": "planned",
      "purpose": "Procurement contract renewal calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2101",
      "name": "Ecommerce variant assortment coverage",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce variant assortment coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2102",
      "name": "Ecommerce size-run depth allocation",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce size-run depth allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2103",
      "name": "Ecommerce broken-size-run exposure",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce broken-size-run exposure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2104",
      "name": "Ecommerce attribute completeness",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce attribute completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2105",
      "name": "Ecommerce image slot coverage",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce image slot coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2106",
      "name": "Ecommerce image duplicate cluster audit",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce image duplicate cluster audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2107",
      "name": "Ecommerce product-feed freshness",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce product-feed freshness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2108",
      "name": "Ecommerce offer availability reconciliation",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce offer availability reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2109",
      "name": "Ecommerce price-feed discrepancy",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce price-feed discrepancy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2110",
      "name": "Ecommerce bundle stock capacity",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce bundle stock capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2111",
      "name": "Ecommerce promotion stacking simulator",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce promotion stacking simulator",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2112",
      "name": "Ecommerce buy-more-save-more threshold",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce buy-more-save-more threshold",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2113",
      "name": "Ecommerce return cohort profitability",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce return cohort profitability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2114",
      "name": "Ecommerce fit-related return distribution",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce fit-related return distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2115",
      "name": "Ecommerce search zero-result impact",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce search zero-result impact",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2116",
      "name": "Ecommerce internal search click depth",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce internal search click depth",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2117",
      "name": "Ecommerce filter coverage audit",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce filter coverage audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2118",
      "name": "Ecommerce assortment price ladder",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce assortment price ladder",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2119",
      "name": "Ecommerce sell-through by delivery cohort",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce sell-through by delivery cohort",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2120",
      "name": "Ecommerce preorder allocation",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce preorder allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2121",
      "name": "Ecommerce product launch readiness",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce product launch readiness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2122",
      "name": "Ecommerce catalog migration reconciliation",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce catalog migration reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2123",
      "name": "Ecommerce affiliate payout reconciliation",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce affiliate payout reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2124",
      "name": "Ecommerce collection overlap analysis",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce collection overlap analysis",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2125",
      "name": "Ecommerce recommendation diversity audit",
      "category": "Ecommerce merchandising and catalog operations",
      "status": "planned",
      "purpose": "Ecommerce recommendation diversity audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2126",
      "name": "Excavation trench spoil volume",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Excavation trench spoil volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2127",
      "name": "Excavation truck dispatch balance",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Excavation truck dispatch balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2128",
      "name": "Concrete pour truck scheduling",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Concrete pour truck scheduling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2129",
      "name": "Concrete formwork contact area",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Concrete formwork contact area",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2130",
      "name": "Concrete rebar cutting schedule",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Concrete rebar cutting schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2131",
      "name": "Concrete rebar lap material tally",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Concrete rebar lap material tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2132",
      "name": "Concrete reinforcement mesh overlap",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Concrete reinforcement mesh overlap",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2133",
      "name": "Concrete pump line priming inventory",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Concrete pump line priming inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2134",
      "name": "Concrete construction joint phasing",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Concrete construction joint phasing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2135",
      "name": "Concrete curing cover inventory",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Concrete curing cover inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2136",
      "name": "Construction scaffold bay inventory",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction scaffold bay inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2137",
      "name": "Construction temporary fence gates",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction temporary fence gates",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2138",
      "name": "Construction site welfare occupancy worksheet",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction site welfare occupancy worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2139",
      "name": "Construction temporary walkway panels",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction temporary walkway panels",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2140",
      "name": "Construction crane booking utilization",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction crane booking utilization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2141",
      "name": "Construction hoist material batches",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction hoist material batches",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2142",
      "name": "Construction dewatering observed rate",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction dewatering observed rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2143",
      "name": "Construction survey benchmark check",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction survey benchmark check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2144",
      "name": "Construction waste segregation bins",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction waste segregation bins",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2145",
      "name": "Construction labour productivity log",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction labour productivity log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2146",
      "name": "Construction plant idle cost",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction plant idle cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2147",
      "name": "Construction delivery laydown capacity",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction delivery laydown capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2148",
      "name": "Construction floor protection purchase",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction floor protection purchase",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2149",
      "name": "Construction progress quantity valuation",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction progress quantity valuation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2150",
      "name": "Construction final account reconciliation",
      "category": "Construction site estimating",
      "status": "planned",
      "purpose": "Construction final account reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2151",
      "name": "Roof batten row spacing",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof batten row spacing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2152",
      "name": "Roof tile verge cut inventory",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof tile verge cut inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2153",
      "name": "Roof ridge accessory tally",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof ridge accessory tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2154",
      "name": "Roof hip line geometry",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof hip line geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2155",
      "name": "Roof valley membrane strips",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof valley membrane strips",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2156",
      "name": "Roof flashing fold development",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof flashing fold development",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2157",
      "name": "Roof standing-seam panel layout",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof standing-seam panel layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2158",
      "name": "Roof fastener zoning tally",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof fastener zoning tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2159",
      "name": "Roof snow-guard layout arithmetic",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof snow-guard layout arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2160",
      "name": "Roof gutter bracket count",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof gutter bracket count",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2161",
      "name": "Roof downpipe fitting inventory",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof downpipe fitting inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2162",
      "name": "Masonry wall opening deductions",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry wall opening deductions",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2163",
      "name": "Masonry course height coordination",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry course height coordination",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2164",
      "name": "Masonry corner bond cut list",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry corner bond cut list",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2165",
      "name": "Masonry cavity tie quantities",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry cavity tie quantities",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2166",
      "name": "Masonry lintel bearing arithmetic",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry lintel bearing arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2167",
      "name": "Masonry brick slip cutting",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry brick slip cutting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2168",
      "name": "Masonry arch voussoir geometry",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry arch voussoir geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2169",
      "name": "Masonry coping joint layout",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry coping joint layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2170",
      "name": "Masonry repointing material volume",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Masonry repointing material volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2171",
      "name": "Facade cladding rail layout",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Facade cladding rail layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2172",
      "name": "Facade rainscreen ventilation area",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Facade rainscreen ventilation area",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2173",
      "name": "Facade sealant movement joint inventory",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Facade sealant movement joint inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2174",
      "name": "Envelope penetration collar inventory",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Envelope penetration collar inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2175",
      "name": "Roof inspection defect area tally",
      "category": "Masonry roofing and envelope details",
      "status": "planned",
      "purpose": "Roof inspection defect area tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2176",
      "name": "Plumbing pipe spool cut list",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing pipe spool cut list",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2177",
      "name": "Plumbing fitting takeoff reconciliation",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing fitting takeoff reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2178",
      "name": "Plumbing fixture demand worksheet",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing fixture demand worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2179",
      "name": "Plumbing hot-water draw profile",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing hot-water draw profile",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2180",
      "name": "Plumbing recirculation loop heat loss",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing recirculation loop heat loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2181",
      "name": "Plumbing insulation jacket quantity",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing insulation jacket quantity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2182",
      "name": "Plumbing pressure test volume",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing pressure test volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2183",
      "name": "Plumbing test gauge resolution check",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing test gauge resolution check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2184",
      "name": "Plumbing leak flow from meter",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing leak flow from meter",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2185",
      "name": "Plumbing drain gradient setting",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing drain gradient setting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2186",
      "name": "Plumbing drain invert chain",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing drain invert chain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2187",
      "name": "Plumbing stack offset geometry",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing stack offset geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2188",
      "name": "Plumbing roof drain catchment split",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing roof drain catchment split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2189",
      "name": "Plumbing sump storage cycle",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing sump storage cycle",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2190",
      "name": "Plumbing water hammer ideal estimate",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing water hammer ideal estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2191",
      "name": "Plumbing expansion vessel worksheet",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing expansion vessel worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2192",
      "name": "Plumbing backflow test record audit",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing backflow test record audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2193",
      "name": "Plumbing domestic water balance",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing domestic water balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2194",
      "name": "Plumbing condensate collection",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing condensate collection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2195",
      "name": "Plumbing rainwater first-flush quantity",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing rainwater first-flush quantity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2196",
      "name": "Plumbing sediment trap cleanout interval",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing sediment trap cleanout interval",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2197",
      "name": "Plumbing hydrant flow test arithmetic",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing hydrant flow test arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2198",
      "name": "Plumbing valve isolation coverage",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing valve isolation coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2199",
      "name": "Plumbing pipe labeling inventory",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing pipe labeling inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2200",
      "name": "Plumbing flushing water demand",
      "category": "Building plumbing and drainage quantities",
      "status": "planned",
      "purpose": "Plumbing flushing water demand",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2201",
      "name": "HVAC room ventilation worksheet",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC room ventilation worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2202",
      "name": "HVAC occupant outdoor-air worksheet",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC occupant outdoor-air worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2203",
      "name": "HVAC duct section velocity",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC duct section velocity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2204",
      "name": "HVAC equal-friction duct worksheet",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC equal-friction duct worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2205",
      "name": "HVAC duct fitting loss tally",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC duct fitting loss tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2206",
      "name": "HVAC fan duty interpolation",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC fan duty interpolation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2207",
      "name": "HVAC fan affinity adjustment",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC fan affinity adjustment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2208",
      "name": "HVAC air balancing deviation",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC air balancing deviation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2209",
      "name": "HVAC diffuser throw observation",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC diffuser throw observation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2210",
      "name": "HVAC grille free-area velocity",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC grille free-area velocity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2211",
      "name": "HVAC filter pressure-drop trend",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC filter pressure-drop trend",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2212",
      "name": "HVAC coil sensible-latent split",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC coil sensible-latent split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2213",
      "name": "HVAC cooling condensate estimate",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC cooling condensate estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2214",
      "name": "HVAC heat-recovery effectiveness",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC heat-recovery effectiveness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2215",
      "name": "HVAC economizer mixing fraction",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC economizer mixing fraction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2216",
      "name": "HVAC room heat balance worksheet",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC room heat balance worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2217",
      "name": "HVAC setback recovery log",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC setback recovery log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2218",
      "name": "HVAC thermal comfort input explorer",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC thermal comfort input explorer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2219",
      "name": "HVAC duct leakage test normalization",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC duct leakage test normalization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2220",
      "name": "HVAC refrigerant line inventory",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC refrigerant line inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2221",
      "name": "HVAC filter bank face area",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC filter bank face area",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2222",
      "name": "HVAC service access clearance",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC service access clearance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2223",
      "name": "HVAC noise level combination",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC noise level combination",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2224",
      "name": "HVAC ventilation schedule energy",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC ventilation schedule energy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2225",
      "name": "HVAC commissioning evidence completeness",
      "category": "HVAC and indoor environmental systems",
      "status": "planned",
      "purpose": "HVAC commissioning evidence completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2226",
      "name": "Electrical circuit schedule load tally",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical circuit schedule load tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2227",
      "name": "Electrical phase load balancing",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical phase load balancing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2228",
      "name": "Electrical conduit fill worksheet",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical conduit fill worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2229",
      "name": "Electrical cable tray occupancy",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical cable tray occupancy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2230",
      "name": "Electrical cable drum allocation",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical cable drum allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2231",
      "name": "Electrical conductor ampacity derating",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical conductor ampacity derating",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2232",
      "name": "Electrical protective-device margin",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical protective-device margin",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2233",
      "name": "Electrical short-circuit thermal worksheet",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical short-circuit thermal worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2234",
      "name": "Electrical fault loop impedance worksheet",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical fault loop impedance worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2235",
      "name": "Electrical earth electrode parallel model",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical earth electrode parallel model",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2236",
      "name": "Electrical RCD test log summary",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical RCD test log summary",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2237",
      "name": "Electrical insulation resistance log",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical insulation resistance log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2238",
      "name": "Electrical lighting fixture count worksheet",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical lighting fixture count worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2239",
      "name": "Electrical emergency lighting test duration",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical emergency lighting test duration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2240",
      "name": "Electrical distribution diversity scenario",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical distribution diversity scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2241",
      "name": "Electrical UPS autonomy from curve",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical UPS autonomy from curve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2242",
      "name": "Electrical UPS load growth budget",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical UPS load growth budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2243",
      "name": "Electrical generator load-step worksheet",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical generator load-step worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2244",
      "name": "Electrical power factor capacitor estimate",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical power factor capacitor estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2245",
      "name": "Electrical transformer load cycle",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical transformer load cycle",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2246",
      "name": "Electrical harmonic RMS aggregation",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical harmonic RMS aggregation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2247",
      "name": "Electrical neutral current observation",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical neutral current observation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2248",
      "name": "Electrical panel spare-way planning",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical panel spare-way planning",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2249",
      "name": "Electrical test instrument calibration calendar",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical test instrument calibration calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2250",
      "name": "Electrical installation certificate completeness",
      "category": "Electrical project estimating",
      "status": "planned",
      "purpose": "Electrical installation certificate completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2251",
      "name": "Tensile test engineering stress-strain",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Tensile test engineering stress-strain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2252",
      "name": "Tensile test true stress-strain",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Tensile test true stress-strain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2253",
      "name": "Young modulus regression window",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Young modulus regression window",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2254",
      "name": "Offset yield strength extraction",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Offset yield strength extraction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2255",
      "name": "Tensile ductility measures",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Tensile ductility measures",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2256",
      "name": "Compression specimen strength",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Compression specimen strength",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2257",
      "name": "Flexural three-point test strength",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Flexural three-point test strength",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2258",
      "name": "Flexural four-point test reduction",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Flexural four-point test reduction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2259",
      "name": "Cantilever tip deflection worksheet",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Cantilever tip deflection worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2260",
      "name": "Simply supported beam center deflection",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Simply supported beam center deflection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2261",
      "name": "Beam distributed-load reactions",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Beam distributed-load reactions",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2262",
      "name": "Beam point-load reactions",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Beam point-load reactions",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2263",
      "name": "Section second moment from rectangles",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Section second moment from rectangles",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2264",
      "name": "Composite transformed section",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Composite transformed section",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2265",
      "name": "Euler column buckling worksheet",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Euler column buckling worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2266",
      "name": "Thin-wall torsion shear worksheet",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Thin-wall torsion shear worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2267",
      "name": "Circular shaft torsion angle",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Circular shaft torsion angle",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2268",
      "name": "Spring series-parallel stiffness",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Spring series-parallel stiffness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2269",
      "name": "Fatigue cycle range counting",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Fatigue cycle range counting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2270",
      "name": "Miner damage sum worksheet",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Miner damage sum worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2271",
      "name": "Fracture stress-intensity worksheet",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Fracture stress-intensity worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2272",
      "name": "Charpy impact energy normalization",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Charpy impact energy normalization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2273",
      "name": "Hardness indentation geometry",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Hardness indentation geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2274",
      "name": "Thermal strain restraint worksheet",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Thermal strain restraint worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2275",
      "name": "Material certificate tolerance audit",
      "category": "Materials and structural laboratory measurements",
      "status": "planned",
      "purpose": "Material certificate tolerance audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2276",
      "name": "Soil gravimetric water content",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil gravimetric water content",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2277",
      "name": "Soil bulk dry density",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil bulk dry density",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2278",
      "name": "Soil void ratio porosity",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil void ratio porosity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2279",
      "name": "Soil degree of saturation",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil degree of saturation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2280",
      "name": "Soil particle specific gravity",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil particle specific gravity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2281",
      "name": "Soil sieve analysis reduction",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil sieve analysis reduction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2282",
      "name": "Soil gradation coefficients",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil gradation coefficients",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2283",
      "name": "Soil hydrometer sedimentation worksheet",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil hydrometer sedimentation worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2284",
      "name": "Soil liquid limit flow curve",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil liquid limit flow curve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2285",
      "name": "Soil plasticity index",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil plasticity index",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2286",
      "name": "Soil liquidity index",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil liquidity index",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2287",
      "name": "Soil compaction curve fit",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil compaction curve fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2288",
      "name": "Soil relative compaction",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil relative compaction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2289",
      "name": "Soil relative density",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil relative density",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2290",
      "name": "Soil falling-head permeability",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil falling-head permeability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2291",
      "name": "Soil constant-head permeability",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil constant-head permeability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2292",
      "name": "Soil consolidation settlement worksheet",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil consolidation settlement worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2293",
      "name": "Soil consolidation time factor",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil consolidation time factor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2294",
      "name": "Soil oedometer compression index",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil oedometer compression index",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2295",
      "name": "Soil direct shear envelope",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil direct shear envelope",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2296",
      "name": "Soil triaxial principal stress",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil triaxial principal stress",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2297",
      "name": "Soil effective stress profile",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil effective stress profile",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2298",
      "name": "Soil capillary rise idealization",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil capillary rise idealization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2299",
      "name": "Soil sand-cone density reduction",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil sand-cone density reduction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2300",
      "name": "Soil sample recovery ratio",
      "category": "Geotechnical laboratory arithmetic",
      "status": "planned",
      "purpose": "Soil sample recovery ratio",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2301",
      "name": "Traffic peak-hour factor",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic peak-hour factor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2302",
      "name": "Traffic directional split",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic directional split",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2303",
      "name": "Traffic heavy-vehicle equivalence",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic heavy-vehicle equivalence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2304",
      "name": "Traffic spot-speed distribution",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic spot-speed distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2305",
      "name": "Traffic travel-time reliability index",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic travel-time reliability index",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2306",
      "name": "Traffic intersection turning matrix",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic intersection turning matrix",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2307",
      "name": "Traffic signal cycle allocation worksheet",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic signal cycle allocation worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2308",
      "name": "Traffic signal pedestrian clearance worksheet",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic signal pedestrian clearance worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2309",
      "name": "Traffic queue storage length",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic queue storage length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2310",
      "name": "Traffic shockwave speed worksheet",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic shockwave speed worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2311",
      "name": "Traffic road capacity observation",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic road capacity observation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2312",
      "name": "Road horizontal sightline offset",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Road horizontal sightline offset",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2313",
      "name": "Road superelevation balance worksheet",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Road superelevation balance worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2314",
      "name": "Road vertical sight distance worksheet",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Road vertical sight distance worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2315",
      "name": "Road pavement layer quantity",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Road pavement layer quantity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2316",
      "name": "Road asphalt spread-rate audit",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Road asphalt spread-rate audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2317",
      "name": "Road line marking paint quantity",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Road line marking paint quantity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2318",
      "name": "Road sign support inventory",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Road sign support inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2319",
      "name": "Roadworks lane closure schedule",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Roadworks lane closure schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2320",
      "name": "Parking survey occupancy turnover",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Parking survey occupancy turnover",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2321",
      "name": "Parking demand accumulation",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Parking demand accumulation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2322",
      "name": "Bicycle parking rack layout",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Bicycle parking rack layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2323",
      "name": "Pedestrian flow observation",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Pedestrian flow observation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2324",
      "name": "Traffic count expansion worksheet",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Traffic count expansion worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2325",
      "name": "Transport benefit-cost worksheet",
      "category": "Civil transport measurement",
      "status": "planned",
      "purpose": "Transport benefit-cost worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2326",
      "name": "Catchment area-weighted rainfall",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Catchment area-weighted rainfall",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2327",
      "name": "Rainfall double-mass consistency",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Rainfall double-mass consistency",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2328",
      "name": "Rainfall missing-gauge estimate",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Rainfall missing-gauge estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2329",
      "name": "Rainfall event separation",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Rainfall event separation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2330",
      "name": "Hyetograph time-block aggregation",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Hyetograph time-block aggregation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2331",
      "name": "Storm moving-window maxima",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Storm moving-window maxima",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2332",
      "name": "Rational peak-flow worksheet",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Rational peak-flow worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2333",
      "name": "Time-of-concentration worksheet",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Time-of-concentration worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2334",
      "name": "Curve-number runoff scenario",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Curve-number runoff scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2335",
      "name": "Infiltration Horton fit",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Infiltration Horton fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2336",
      "name": "Infiltration Green-Ampt worksheet",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Infiltration Green-Ampt worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2337",
      "name": "Unit hydrograph convolution",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Unit hydrograph convolution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2338",
      "name": "Hydrograph baseflow separation",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Hydrograph baseflow separation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2339",
      "name": "Hydrograph volume integration",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Hydrograph volume integration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2340",
      "name": "Reservoir level-volume interpolation",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Reservoir level-volume interpolation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2341",
      "name": "Reservoir routing continuity",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Reservoir routing continuity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2342",
      "name": "Flood routing Muskingum worksheet",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Flood routing Muskingum worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2343",
      "name": "Channel flow gauging sections",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Channel flow gauging sections",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2344",
      "name": "Stage-discharge rating fit",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Stage-discharge rating fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2345",
      "name": "River flow-duration curve",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "River flow-duration curve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2346",
      "name": "Drought low-flow rolling minima",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Drought low-flow rolling minima",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2347",
      "name": "Groundwater Darcy flux",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Groundwater Darcy flux",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2348",
      "name": "Groundwater seepage velocity",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Groundwater seepage velocity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2349",
      "name": "Groundwater drawdown test fit",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Groundwater drawdown test fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2350",
      "name": "Water allocation deficit ledger",
      "category": "Hydrology and water resources",
      "status": "planned",
      "purpose": "Water allocation deficit ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2351",
      "name": "Solar array string voltage worksheet",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar array string voltage worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2352",
      "name": "Solar inverter DC-AC ratio",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar inverter DC-AC ratio",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2353",
      "name": "Solar clipping from power trace",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar clipping from power trace",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2354",
      "name": "Solar shading time-weighted loss",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar shading time-weighted loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2355",
      "name": "Solar row spacing geometry",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar row spacing geometry",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2356",
      "name": "Solar roof setback fit",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar roof setback fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2357",
      "name": "Solar bifacial gain scenario",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar bifacial gain scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2358",
      "name": "Solar degradation lifetime output",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar degradation lifetime output",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2359",
      "name": "Solar export-limit control simulation",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar export-limit control simulation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2360",
      "name": "Solar tariff change cashflow",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar tariff change cashflow",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2361",
      "name": "Solar maintenance revenue loss",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar maintenance revenue loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2362",
      "name": "Solar performance ratio audit",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar performance ratio audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2363",
      "name": "Solar weather-normalized comparison",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar weather-normalized comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2364",
      "name": "Solar cable route material budget",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Solar cable route material budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2365",
      "name": "Wind turbine power-curve yield",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Wind turbine power-curve yield",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2366",
      "name": "Wind shear height extrapolation",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Wind shear height extrapolation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2367",
      "name": "Wind turbine capacity factor",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Wind turbine capacity factor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2368",
      "name": "Wind farm wake-loss budget",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Wind farm wake-loss budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2369",
      "name": "Small hydro site power worksheet",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Small hydro site power worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2370",
      "name": "Small hydro seasonal energy",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Small hydro seasonal energy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2371",
      "name": "Renewable curtailment compensation",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Renewable curtailment compensation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2372",
      "name": "Renewable certificate inventory",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Renewable certificate inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2373",
      "name": "Renewable project discounted payback",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Renewable project discounted payback",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2374",
      "name": "Renewable repowering scenario",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Renewable repowering scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2375",
      "name": "Community energy member payout",
      "category": "Renewable energy project scenarios",
      "status": "planned",
      "purpose": "Community energy member payout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2376",
      "name": "Battery coulomb counting trace",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery coulomb counting trace",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2377",
      "name": "Battery energy counting trace",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery energy counting trace",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2378",
      "name": "Battery round-trip efficiency test",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery round-trip efficiency test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2379",
      "name": "Battery coulombic efficiency test",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery coulombic efficiency test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2380",
      "name": "Battery internal resistance pulse test",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery internal resistance pulse test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2381",
      "name": "Battery cell balance spread",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery cell balance spread",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2382",
      "name": "Battery series-parallel configuration",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery series-parallel configuration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2383",
      "name": "Battery pack fuse margin worksheet",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery pack fuse margin worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2384",
      "name": "Battery C-rate conversion",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery C-rate conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2385",
      "name": "Battery usable-window energy",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery usable-window energy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2386",
      "name": "Battery cycle equivalent count",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery cycle equivalent count",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2387",
      "name": "Battery depth-of-discharge histogram",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery depth-of-discharge histogram",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2388",
      "name": "Battery capacity fade fit",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery capacity fade fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2389",
      "name": "Battery calendar storage scenario",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery calendar storage scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2390",
      "name": "Battery thermal test heat balance",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery thermal test heat balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2391",
      "name": "Battery module cooling flow worksheet",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery module cooling flow worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2392",
      "name": "Battery balancing duration",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery balancing duration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2393",
      "name": "Battery self-discharge observation",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery self-discharge observation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2394",
      "name": "Battery open-circuit voltage lookup",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery open-circuit voltage lookup",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2395",
      "name": "Battery charger current-limit timing",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery charger current-limit timing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2396",
      "name": "Battery storage dispatch simulation",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery storage dispatch simulation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2397",
      "name": "Battery arbitrage break-even spread",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery arbitrage break-even spread",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2398",
      "name": "Battery peak-shaving capacity",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery peak-shaving capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2399",
      "name": "Battery replacement warranty tally",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery replacement warranty tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2400",
      "name": "Battery transport inventory worksheet",
      "category": "Battery characterization and storage",
      "status": "planned",
      "purpose": "Battery transport inventory worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2401",
      "name": "First-order step response",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "First-order step response",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2402",
      "name": "Second-order damping response",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Second-order damping response",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2403",
      "name": "Second-order poles from damping",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Second-order poles from damping",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2404",
      "name": "Transfer-function pole-zero map",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Transfer-function pole-zero map",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2405",
      "name": "Control DC gain",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Control DC gain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2406",
      "name": "Bode frequency response",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Bode frequency response",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2407",
      "name": "Nyquist response coordinates",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Nyquist response coordinates",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2408",
      "name": "Gain and phase margins",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Gain and phase margins",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2409",
      "name": "Root-locus sampled gains",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Root-locus sampled gains",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2410",
      "name": "Closed-loop feedback composition",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Closed-loop feedback composition",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2411",
      "name": "State-space eigenvalue stability",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "State-space eigenvalue stability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2412",
      "name": "State-space controllability rank",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "State-space controllability rank",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2413",
      "name": "State-space observability rank",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "State-space observability rank",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2414",
      "name": "State-space time response",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "State-space time response",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2415",
      "name": "Continuous-to-discrete model",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Continuous-to-discrete model",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2416",
      "name": "Discrete-to-continuous approximation",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Discrete-to-continuous approximation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2417",
      "name": "PID parallel-series conversion",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "PID parallel-series conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2418",
      "name": "PID sampled response simulation",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "PID sampled response simulation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2419",
      "name": "PID integral windup demonstration",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "PID integral windup demonstration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2420",
      "name": "Control sensor low-pass tradeoff",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Control sensor low-pass tradeoff",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2421",
      "name": "Control sample-delay phase loss",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Control sample-delay phase loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2422",
      "name": "Control deadband quantization model",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Control deadband quantization model",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2423",
      "name": "Control ramp tracking error",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Control ramp tracking error",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2424",
      "name": "Control disturbance rejection",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Control disturbance rejection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2425",
      "name": "Control actuator saturation duty",
      "category": "Control systems and dynamics",
      "status": "planned",
      "purpose": "Control actuator saturation duty",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2426",
      "name": "Signal sampling alias explorer",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal sampling alias explorer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2427",
      "name": "Signal Nyquist margin",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal Nyquist margin",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2428",
      "name": "Signal quantization noise estimate",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal quantization noise estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2429",
      "name": "Signal effective number of bits",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal effective number of bits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2430",
      "name": "Signal window coherent gain",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal window coherent gain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2431",
      "name": "Signal spectral leakage comparison",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal spectral leakage comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2432",
      "name": "Signal FFT bin interpolation",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal FFT bin interpolation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2433",
      "name": "Signal zero-padding frequency grid",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal zero-padding frequency grid",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2434",
      "name": "Signal power spectral density",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal power spectral density",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2435",
      "name": "Signal autocorrelation lag profile",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal autocorrelation lag profile",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2436",
      "name": "Signal cross-correlation delay",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal cross-correlation delay",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2437",
      "name": "Signal digital filter impulse response",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal digital filter impulse response",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2438",
      "name": "Signal FIR moving-average response",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal FIR moving-average response",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2439",
      "name": "Signal Butterworth prototype design",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal Butterworth prototype design",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2440",
      "name": "Signal notch filter design",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal notch filter design",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2441",
      "name": "Signal filter cascade response",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal filter cascade response",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2442",
      "name": "Signal group delay estimate",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal group delay estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2443",
      "name": "Signal resampling length planner",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal resampling length planner",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2444",
      "name": "Signal rational resample factors",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal rational resample factors",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2445",
      "name": "Signal overlap-add block plan",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal overlap-add block plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2446",
      "name": "Signal spectrogram time-frequency grid",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal spectrogram time-frequency grid",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2447",
      "name": "Signal chirp frequency schedule",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal chirp frequency schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2448",
      "name": "Signal clipping distortion audit",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal clipping distortion audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2449",
      "name": "Signal crest factor",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal crest factor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2450",
      "name": "Signal RMS sliding window",
      "category": "Digital signal analysis",
      "status": "planned",
      "purpose": "Signal RMS sliding window",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2451",
      "name": "RF free-space path loss",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF free-space path loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2452",
      "name": "RF link budget worksheet",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF link budget worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2453",
      "name": "RF fade margin",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF fade margin",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2454",
      "name": "RF Fresnel zone clearance",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF Fresnel zone clearance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2455",
      "name": "RF effective isotropic radiated power",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF effective isotropic radiated power",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2456",
      "name": "RF receiver noise floor",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF receiver noise floor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2457",
      "name": "RF signal-to-noise budget",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF signal-to-noise budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2458",
      "name": "RF coaxial cable attenuation",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF coaxial cable attenuation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2459",
      "name": "RF standing wave ratio",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF standing wave ratio",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2460",
      "name": "RF impedance reflection coefficient",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF impedance reflection coefficient",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2461",
      "name": "RF impedance Smith coordinates",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF impedance Smith coordinates",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2462",
      "name": "RF transmission line electrical length",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF transmission line electrical length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2463",
      "name": "RF quarter-wave transformer",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF quarter-wave transformer",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2464",
      "name": "RF stub matching worksheet",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF stub matching worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2465",
      "name": "RF dipole starting length",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF dipole starting length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2466",
      "name": "RF Yagi element scaling",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF Yagi element scaling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2467",
      "name": "RF antenna array factor",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF antenna array factor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2468",
      "name": "RF polarization mismatch",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF polarization mismatch",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2469",
      "name": "RF radar range equation worksheet",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF radar range equation worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2470",
      "name": "RF Doppler shift",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF Doppler shift",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2471",
      "name": "RF mixer frequency products",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF mixer frequency products",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2472",
      "name": "RF intermodulation intercept worksheet",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF intermodulation intercept worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2473",
      "name": "RF cascaded noise figure",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF cascaded noise figure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2474",
      "name": "RF cascaded gain compression worksheet",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF cascaded gain compression worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2475",
      "name": "RF spectrum occupancy measurement",
      "category": "Radio frequency and antennas",
      "status": "planned",
      "purpose": "RF spectrum occupancy measurement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2476",
      "name": "Logic truth table evaluator",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Logic truth table evaluator",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2477",
      "name": "Logic Karnaugh grouping worksheet",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Logic Karnaugh grouping worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2478",
      "name": "Logic Boolean equivalence checker",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Logic Boolean equivalence checker",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2479",
      "name": "Logic gate propagation path",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Logic gate propagation path",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2480",
      "name": "Logic setup-hold timing worksheet",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Logic setup-hold timing worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2481",
      "name": "Embedded timer prescaler selection",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded timer prescaler selection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2482",
      "name": "Embedded UART baud divisor",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded UART baud divisor",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2483",
      "name": "Embedded SPI transfer duration",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded SPI transfer duration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2484",
      "name": "Embedded I2C bus transaction time",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded I2C bus transaction time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2485",
      "name": "Embedded CAN frame bandwidth",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded CAN frame bandwidth",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2486",
      "name": "Embedded CAN arbitration worksheet",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded CAN arbitration worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2487",
      "name": "Embedded ADC code conversion",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded ADC code conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2488",
      "name": "Embedded DAC output conversion",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded DAC output conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2489",
      "name": "Embedded fixed-point format range",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded fixed-point format range",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2490",
      "name": "Embedded fixed-point arithmetic trace",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded fixed-point arithmetic trace",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2491",
      "name": "Embedded ring buffer sizing",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded ring buffer sizing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2492",
      "name": "Embedded DMA transfer schedule",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded DMA transfer schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2493",
      "name": "Embedded watchdog timeout budget",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded watchdog timeout budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2494",
      "name": "Embedded real-time task utilization",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded real-time task utilization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2495",
      "name": "Embedded stack usage aggregation",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded stack usage aggregation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2496",
      "name": "Embedded flash partition layout",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded flash partition layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2497",
      "name": "Embedded EEPROM wear budget",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded EEPROM wear budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2498",
      "name": "Embedded battery sleep-wake budget",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded battery sleep-wake budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2499",
      "name": "Embedded checksum playground",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded checksum playground",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2500",
      "name": "Embedded timestamp rollover",
      "category": "Digital logic and embedded systems",
      "status": "planned",
      "purpose": "Embedded timestamp rollover",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2501",
      "name": "Test suite runtime shard allocation",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Test suite runtime shard allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6e55f10b8d1798f7b11443ca0b2bf127abb44f9c3a22d0d40acf1abd64e9eb03",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Failed runs (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Total repeated runs (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Future independent runs (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "668d3ca305ebd573f4e18f14bd4516b9181a784050d9612b672e2cf7052e66db",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial failed tests (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Failures passing on retry (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Retry attempts executed (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Mean retry duration (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a878f03c5d4264ebdecd3e862aa3aca158f77a90ee7bdf7937753d3add91f7c1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Killed mutants (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Surviving mutants (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Invalid mutants (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2505",
      "name": "Test requirement coverage matrix",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Test requirement coverage matrix",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2506",
      "name": "Test pairwise configuration plan",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Test pairwise configuration plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "29d400ecb38915b3ff74795aa75eccd78a5579b2e26bf5bf610ed93b67730bc7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Inclusive numeric field minimum",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Inclusive numeric field maximum",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "c",
          "label": "Chosen boundary test step",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "99e6197f6cd4f9f610797a142b80790c61869bb57d1b2ca58284d58b8cffa9e2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Fixture cases (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Records per case (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Bytes per record (bytes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Retained fixture generations (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2509",
      "name": "Test environment concurrency budget",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Test environment concurrency budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2510",
      "name": "Test release gate reconciliation",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Test release gate reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "170f9b04b72e07aa9e5602feef40a57b3e1b663f086f153883c91a4f2930ecd0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pre-release defects by severity (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Post-release defects by severity (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2512",
      "name": "Software defect discovery curve",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Software defect discovery curve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "7d344549b2372d956c0d5f7d40b0808a13bd9ddf25a792004fd9c2425c982fc9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Failure timestamps (elapsed minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Recovery timestamps (elapsed minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2514",
      "name": "Software incident availability from events",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Software incident availability from events",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "3955b1bfe68ece0804d41a417831c97b7adb1fb6ab7acc8396930e874d577dc8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Independent component reliability (fractions)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5448cd72d4baeb9014aaac23fc406cb6c38c10473c69c1c90b235479bb1a997c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Independent component reliability (fractions)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2517",
      "name": "Software fault-tree probability",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Software fault-tree probability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a8869341a4732364b6dd378a557fc4244aaa76cfab34c8dff8d380f7eabfd995",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Canary stages (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Canary traffic share by stage (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Request arrival rate (requests/minute)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Canary error scenario (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "da6b9024fa6cd9a3f660019005d090c335050f810629610d013510842efc73ee",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Detection delay (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Decision delay (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Rollback duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Warm-up duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Affected requests (requests/minute)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5ba0203b13d7768fff75c7def3845f6cdcb2b30f0c9074c2fddff3136094d4ad",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Hosts to deploy (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Hosts per simultaneous batch (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Deployment per batch (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Validation between batches (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2521",
      "name": "Software regression selection coverage",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Software regression selection coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "de642fa92545f01e5f8603af4f57d3b0c5699ac0e17ffa9d98f8b04b3b3bf7dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Maintained tests (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Review-triggering failure frequency (failures/test/month)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Review handling time (minutes/failure)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Scheduled maintenance (minutes/test/month)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2523",
      "name": "Software chaos experiment blast radius",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Software chaos experiment blast radius",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2524",
      "name": "Software SLO multi-window alert trace",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Software SLO multi-window alert trace",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2525",
      "name": "Software backup restore acceptance",
      "category": "Software testing and reliability",
      "status": "planned",
      "purpose": "Software backup restore acceptance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2526",
      "name": "Security patch exposure days",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security patch exposure days",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2527",
      "name": "Security certificate expiry coverage",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security certificate expiry coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2528",
      "name": "Security key rotation schedule",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security key rotation schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2ea415128ab31e016e2e8aefc56bf471fcbca04bfee4ddadb2c5ffcedea8854d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Accounts to review (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Entitlements per account (count)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Review minutes per entitlement (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Reviewers (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "e",
          "label": "Review hours per reviewer per day (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2530",
      "name": "Security orphan account reconciliation",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security orphan account reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2531",
      "name": "Security privilege concentration",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security privilege concentration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2532",
      "name": "Security MFA enrollment coverage",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security MFA enrollment coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2533",
      "name": "Security log collection completeness",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security log collection completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "25a387969d88476055735e4b7062fcc173737c07f3b8679a61d10e154101680f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Incoming alerts (alerts/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Mean triage time (minutes/alert)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Concurrent analysts (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Coverage period (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Starting backlog (alerts)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "645737cd4a3e801e720926e69ead40b4cbd451515d1d2b1e3c1966711b4f35c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "False-positive alerts by category (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "True-positive alerts by category (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Review minutes per alert by category (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2536",
      "name": "Security incident timeline reconstruction",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security incident timeline reconstruction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2537",
      "name": "Security backup isolation inventory",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security backup isolation inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2538",
      "name": "Security vulnerability remediation queue",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security vulnerability remediation queue",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2539",
      "name": "Security asset inventory reconciliation",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security asset inventory reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "978a44c22b4434da55d09488e635a3065a48f2da93d502da7883325a5720f723",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Invitations by cohort (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Completed exercises by cohort (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Reported training messages by cohort (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2541",
      "name": "Security delegated-role path audit",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security delegated-role path audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2542",
      "name": "Security session timeout exposure",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security session timeout exposure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2543",
      "name": "Security API key usage attribution",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security API key usage attribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2544",
      "name": "Security firewall rule overlap audit",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security firewall rule overlap audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2545",
      "name": "Security network segmentation reachability",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security network segmentation reachability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "cf1c900e4f9fe8fa437e7df230f54398889775e4e622df6802b2ea0d4031ac8c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Record ages (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Record volumes (MB)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Retention duration (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2547",
      "name": "Security breach notification timeline",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security breach notification timeline",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2548",
      "name": "Security risk matrix aggregation",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security risk matrix aggregation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2549",
      "name": "Security tabletop exercise staffing",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security tabletop exercise staffing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2550",
      "name": "Security vendor evidence completeness",
      "category": "Security operations planning",
      "status": "planned",
      "purpose": "Security vendor evidence completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b90569eea253585d6054431fae2eb084bd50f3b65e26fddd4bf8b98472051537",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "True positives (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "False positives (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "False negatives (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "True negatives (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2552",
      "name": "Classification threshold sweep",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Classification threshold sweep",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2553",
      "name": "Classification ROC area",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Classification ROC area",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2554",
      "name": "Classification precision-recall area",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Classification precision-recall area",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2555",
      "name": "Classification calibration bins",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Classification calibration bins",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "0cb15f7b4dc68f9b220cc40ed16660efdb0cccf786ad3d6b3ffb8cfe2fc3d9d3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Predicted probabilities (fractions)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observed binary outcomes (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2557",
      "name": "Classification log loss",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Classification log loss",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2558",
      "name": "Multiclass averaging comparison",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Multiclass averaging comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6324f407a5e1b4bf8cec0e919facbbe44ca60f0156545a6de6a22fe6eb503223",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Predicted values (measurement units)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observed values (measurement units)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d95af583d4fcefc3ca09e1b645352f2b1cd5d25c3fa30e390bd37feeeadb7163",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Regression predictions (units)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observed outcomes (units)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2561",
      "name": "Ranking discounted gain",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Ranking discounted gain",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "cd9fa3f0fb6359440246dba0d51bb40ec2f56869f389fc877c344736c0d78b09",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First relevant rank per query (0 means none)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2563",
      "name": "Recommendation catalog coverage",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Recommendation catalog coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2564",
      "name": "Recommendation novelty proxy",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Recommendation novelty proxy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2565",
      "name": "Clustering silhouette score",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Clustering silhouette score",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2566",
      "name": "Clustering label agreement",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Clustering label agreement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "288a9d5af19a31cd515a0eca7b212060de6a31ef5bd105ea037755e9f6e997dc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Class example counts (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2568",
      "name": "Dataset train-test entity leakage",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Dataset train-test entity leakage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2569",
      "name": "Dataset duplicate sample audit",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Dataset duplicate sample audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2570",
      "name": "Dataset missingness pattern",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Dataset missingness pattern",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2571",
      "name": "Dataset drift histogram comparison",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Dataset drift histogram comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "53539f48defeb46d11fd215727a2686d53cb146366be23a0c4724a702773840d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured batch sizes (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured batch latency (milliseconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2573",
      "name": "Model inference cost quality frontier",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Model inference cost quality frontier",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2574",
      "name": "Model benchmark confidence bootstrap",
      "category": "Data science and machine learning evaluation",
      "status": "planned",
      "purpose": "Model benchmark confidence bootstrap",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "f336c6e05a48f82737da87bb8fc7e5daed9c9d2f5cd6dfb51e738ab94f1cd45f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Dataset sequences (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Mean sequence tokens (tokens)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Training epochs (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Packed batch capacity (tokens)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Packing utilization (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e9b854fdd34c5b73bbdd403958f4539988619076815114d55caa7c3713e41637",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Stage data timestamps (elapsed hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Current timestamp (elapsed hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Maximum permitted age (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2577",
      "name": "Data pipeline dependency schedule",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data pipeline dependency schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "9a124e805ec3298ac2a50311d8f824b3c9eaf6dbfe8ed52d745e576e8048fd6b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Event timestamps in arrival order (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Allowed lateness (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fa099dc54b7434f7926a3235fd5048ad66b43a83e7c9c2b60c8ed3a257a696e5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Event timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Arrival timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Chosen lateness buffer (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2580",
      "name": "Data deduplication key collision audit",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data deduplication key collision audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "deb8979e26c4272ba9b75d29fd0a721c748056e9ac84ee8192a52a5aab8e675a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Left rows per aligned key (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Right rows per aligned key (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2582",
      "name": "Data join explosion diagnosis",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data join explosion diagnosis",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2583",
      "name": "Data schema compatibility check",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data schema compatibility check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "88887d7960567a99a51a598e0c4facbf8a5bce644ff9a97751a395db566e9aa9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Column rows (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Distinct values (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Raw value width (bytes)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e66007ea8d8649f9ce97bb28b4ebf468dbe4cfa9ac56988ba4a0b1439b3c97b6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Partition data sizes (MB)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Heavy-partition threshold (multiple of mean)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8bd77255f9360efdef9be3eea8008fcbe4c5bcebf3d90614fc7adbe816f03b32",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Concurrent task partition sizes (MB)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "In-memory expansion factor (multiple)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Per-task overhead (MB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Worker reserved memory (MB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5ff65fbb713c8805c72e7967757679354c484c11c128f7640e446506c6836ffc",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Input file sizes (MB)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Target output file capacity (MB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Concurrent output-writing tasks (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "49c107f606a8273793ac7a7b339fbeafecdfd664b8527225b2ebbc5b1d97e338",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current file count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Consolidated file count",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Setup time per file (milliseconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Metadata cost per 1000 requests (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2589",
      "name": "Data retention tier cost",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data retention tier cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "82a4f370f36f7e37ce6a0a346364cac4d2018912ed015d2afea25c9bab545ff1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Initial full snapshot (GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Incremental changed-block volumes at successive snapshots (GB)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Incremental snapshots retained (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Snapshot cadence (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2591",
      "name": "Data replication bandwidth schedule",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data replication bandwidth schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2592",
      "name": "Data migration checksum coverage",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data migration checksum coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "437055cc305c4b798f428c13f5f1a434150943e00de3b234c480ac3ba2eb8f4b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Final uncopied delta (GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Copy throughput (GB/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Ongoing change rate (GB/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Post-copy validation (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4dd56eb3f2ec03f6f3cb8aa9780c3004e8ac4d446b006d48d803bc9e258b8d3d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Source row counts by batch",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Destination row counts by batch",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Accepted excluded rows by batch",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2595",
      "name": "Data sampling stratified allocation",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data sampling stratified allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2596",
      "name": "Data anonymization group-size audit",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data anonymization group-size audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a11eb4a11821db21f52b61b19dcf3942b02395965017d22e933825af962f2a68",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Independent attempt failure probability (fraction)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Maximum attempts including first (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Compute cost per attempt (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2598",
      "name": "Data quality rule coverage",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data quality rule coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2599",
      "name": "Data lake lifecycle dry-run",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data lake lifecycle dry-run",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2600",
      "name": "Data warehouse query concurrency",
      "category": "Data engineering and databases",
      "status": "planned",
      "purpose": "Data warehouse query concurrency",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d4739080d5e76b6bf44c7f9233e2384c99645f16d24e02328f2aadd64b720960",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Copies in each duplicate group (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Identical file size by group (MB)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Copies retained per group (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2602",
      "name": "Photo library date coverage",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Photo library date coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "c69cdf0916cfff54319a18e26dd803c5f970199c5e5dd2166e69b681d83b0eaa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Print counts by size group (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured scan-edit minutes per print (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Prints per working batch (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "24dca7440224397839a3cb1fe74dc12cc627b54b396d0786735883813055404d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Document page counts (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Printed sides per sheet (1 simplex or 2 duplex)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Feeder sheet capacity (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2605",
      "name": "Document archive box index",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Document archive box index",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2606",
      "name": "Personal file naming collision check",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal file naming collision check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "1d705cca9ca1d928ad210ac2944f6352ae7d551f00328973dd67b7163354a103",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "File paths, one per line",
          "type": "string",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        },
        {
          "key": "b",
          "label": "Supplied maximum path length (UTF-16 code units)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2608",
      "name": "Personal backup copy coverage",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal backup copy coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "508467cdab4077bf0180e8d8d35eb0d16efad69e38f8d3b52dbdeda0fe95c8bd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Media to checksum (GB, decimal)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured hashing speed (MB/second, decimal)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Verification window length (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Setup time each window (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2610",
      "name": "Personal email attachment storage",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal email attachment storage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "63fbb21b0ef1efc1aaf125ee3a739813df0b20d6e8d82f42eab07b5a48d5e4b8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Messages by cleanup category (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured review seconds per message (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Session duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "798c1e15edddb2285b04b4a88eee952587f31f08d269d1801dc7c6c3314bfeae",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "New messages each day (count/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Handling time (minutes/message)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Daily review budget (minutes/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Starting inbox backlog (count)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Days to project (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2613",
      "name": "Personal task batching schedule",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal task batching schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "21719daf48fb5dac89101523a079e0f6b062fb99176d14b9b4381782f10b8efa",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Subscription renewal offsets (days from today)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Required cancellation notice periods (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Renewal charges (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Upcoming-charge horizon (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2615",
      "name": "Personal password migration checklist",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal password migration checklist",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2616",
      "name": "Personal account deletion evidence tracker",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal account deletion evidence tracker",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6f1e9b26a3bcf7318dfcaa8c9ce19bfb7a13a0ae6b28bfc261865ed5acce8062",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Device data groups (GB, decimal)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured transfer rate (MB/second, decimal)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Sequential setup tasks (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e874c095235b460bd28f911dac480d62e20efdfaee078ddb12179148f0a4e9e3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required storage by family member (GB)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Shared plan capacity (GB)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2619",
      "name": "Personal digital inheritance inventory",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal digital inheritance inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "e95a3cdd7027bfe74f34701ab46918ce3f724cd85fe2e85d15dfed838468c436",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Tape running times (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Capture speed (source minutes per real minute)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Postprocessing time per tape (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Captured storage rate (GB/source hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3aa8e8e18bf980e730ac2b45cda007a23ceaf12dc54e3e7ca8ddd05999c590a6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Audiobook source lengths (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Playback speed by book (multipliers)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Listening session duration (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c746be40eefc443861b1f882ec5c0798a9f9713b4f51a33541e0d2b3213583c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Existing podcast backlog (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "New episodes per week (count)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Average new episode length (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Weekly listening capacity (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Projection length (weeks)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "51b277d0921e3e83b3effe970f9cd49c753c5828a8a3f48d1b3bfc99b76d485f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Estimated chapter reading times (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Available reading days (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Daily reading budget (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2624",
      "name": "Personal cloud export completeness",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal cloud export completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2625",
      "name": "Personal file retention review queue",
      "category": "Personal files and digital organization",
      "status": "planned",
      "purpose": "Personal file retention review queue",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2626",
      "name": "GIS coordinate reference compatibility",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS coordinate reference compatibility",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2627",
      "name": "GIS geographic bounding box union",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS geographic bounding box union",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2628",
      "name": "GIS polygon ring orientation",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS polygon ring orientation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2629",
      "name": "GIS polygon validity diagnostics",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS polygon validity diagnostics",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2630",
      "name": "GIS polygon hole area accounting",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS polygon hole area accounting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2631",
      "name": "GIS point-in-polygon classification",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS point-in-polygon classification",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2632",
      "name": "GIS spatial join ambiguity",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS spatial join ambiguity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2633",
      "name": "GIS buffer area approximation",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS buffer area approximation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2634",
      "name": "GIS line simplification tolerance",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS line simplification tolerance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2635",
      "name": "GIS raster cell area by latitude",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS raster cell area by latitude",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2636",
      "name": "GIS zonal raster coverage",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS zonal raster coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2637",
      "name": "GIS raster reclassification inventory",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS raster reclassification inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2638",
      "name": "GIS resampling pixel budget",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS resampling pixel budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2639",
      "name": "GIS tile pyramid count",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS tile pyramid count",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2640",
      "name": "GIS map scale at zoom",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS map scale at zoom",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2641",
      "name": "GIS vector tile payload budget",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS vector tile payload budget",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2642",
      "name": "GIS track gap detection",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS track gap detection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2643",
      "name": "GIS coordinate precision distance",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS coordinate precision distance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2644",
      "name": "GIS GPS horizontal dilution worksheet",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS GPS horizontal dilution worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2645",
      "name": "GIS positional error ellipse",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS positional error ellipse",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2646",
      "name": "GIS distance matrix batch plan",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS distance matrix batch plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2647",
      "name": "GIS hexagonal grid coverage",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS hexagonal grid coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2648",
      "name": "GIS nearest-facility assignment",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS nearest-facility assignment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2649",
      "name": "GIS catchment overlap accounting",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS catchment overlap accounting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2650",
      "name": "GIS field-survey point allocation",
      "category": "GIS and spatial data processing",
      "status": "planned",
      "purpose": "GIS field-survey point allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2651",
      "name": "Geological strike-dip plane normal",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological strike-dip plane normal",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2652",
      "name": "Geological apparent dip",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological apparent dip",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2653",
      "name": "Geological true thickness",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological true thickness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2654",
      "name": "Geological borehole intercept correction",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological borehole intercept correction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2655",
      "name": "Geological line plunge projection",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological line plunge projection",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2656",
      "name": "Geological stereonet coordinates",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological stereonet coordinates",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2657",
      "name": "Geological orientation mean vector",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological orientation mean vector",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2658",
      "name": "Geological fold interlimb angle",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological fold interlimb angle",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2659",
      "name": "Geological fault displacement components",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological fault displacement components",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2660",
      "name": "Geological stratigraphic column scale",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological stratigraphic column scale",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2661",
      "name": "Geological core tray layout",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological core tray layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2662",
      "name": "Geological sample splitting mass",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological sample splitting mass",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2663",
      "name": "Geological assay composite grade",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological assay composite grade",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2664",
      "name": "Geological assay detection-limit scenarios",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological assay detection-limit scenarios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2665",
      "name": "Geological mineral formula normalization",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological mineral formula normalization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2666",
      "name": "Geological modal mineral tally",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological modal mineral tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2667",
      "name": "Geological rock bulk density test",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological rock bulk density test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2668",
      "name": "Geological porosity saturation test",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological porosity saturation test",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2669",
      "name": "Geological grain-size phi conversion",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological grain-size phi conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2670",
      "name": "Geological sediment sorting statistics",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological sediment sorting statistics",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2671",
      "name": "Geological borehole deviation coordinates",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological borehole deviation coordinates",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2672",
      "name": "Geological resource block arithmetic",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological resource block arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2673",
      "name": "Geological cut-off grade scenario",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological cut-off grade scenario",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2674",
      "name": "Geological mass loss on ignition",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological mass loss on ignition",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2675",
      "name": "Geological sample custody reconciliation",
      "category": "Geology and mineral measurements",
      "status": "planned",
      "purpose": "Geological sample custody reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2676",
      "name": "Wave frequency-period conversion",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave frequency-period conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2677",
      "name": "Deep-water wavelength estimate",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Deep-water wavelength estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2678",
      "name": "Finite-depth wave dispersion solver",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Finite-depth wave dispersion solver",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2679",
      "name": "Wave phase-group speed",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave phase-group speed",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2680",
      "name": "Wave steepness",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave steepness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2681",
      "name": "Wave orbital velocity worksheet",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave orbital velocity worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2682",
      "name": "Wave energy density",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave energy density",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2683",
      "name": "Wave power per crest width",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave power per crest width",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2684",
      "name": "Wave significant-height sample",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave significant-height sample",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2685",
      "name": "Wave zero-crossing analysis",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave zero-crossing analysis",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2686",
      "name": "Wave tide water-level combination",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Wave tide water-level combination",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2687",
      "name": "Coastal beach profile volume change",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Coastal beach profile volume change",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2688",
      "name": "Coastal shoreline movement rate",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Coastal shoreline movement rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2689",
      "name": "Coastal longshore transport worksheet",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Coastal longshore transport worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2690",
      "name": "Coastal overtopping input checker",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Coastal overtopping input checker",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2691",
      "name": "Seawater density from supplied equation",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Seawater density from supplied equation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2692",
      "name": "Seawater sound-speed profile",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Seawater sound-speed profile",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2693",
      "name": "Ocean buoy drift vectors",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Ocean buoy drift vectors",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2694",
      "name": "Ocean current transport section",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Ocean current transport section",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2695",
      "name": "Ocean mixed-layer threshold",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Ocean mixed-layer threshold",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2696",
      "name": "Ocean thermocline gradient",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Ocean thermocline gradient",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2697",
      "name": "Ocean salinity freshwater fraction",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Ocean salinity freshwater fraction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2698",
      "name": "Ocean dissolved oxygen saturation ratio",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Ocean dissolved oxygen saturation ratio",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2699",
      "name": "Marine survey transect coverage",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Marine survey transect coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2700",
      "name": "Marine observation clock alignment",
      "category": "Ocean and coastal observations",
      "status": "planned",
      "purpose": "Marine observation clock alignment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2701",
      "name": "Ecology quadrat density estimate",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology quadrat density estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2702",
      "name": "Ecology transect encounter rate",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology transect encounter rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2703",
      "name": "Ecology occupancy naive estimate",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology occupancy naive estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2704",
      "name": "Ecology capture-recapture worksheet",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology capture-recapture worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2705",
      "name": "Ecology species richness rarefaction",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology species richness rarefaction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2706",
      "name": "Ecology Shannon diversity",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology Shannon diversity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2707",
      "name": "Ecology Simpson diversity conventions",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology Simpson diversity conventions",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2708",
      "name": "Ecology Jaccard community overlap",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology Jaccard community overlap",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2709",
      "name": "Ecology Bray-Curtis dissimilarity",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology Bray-Curtis dissimilarity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2710",
      "name": "Ecology species accumulation order",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology species accumulation order",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2711",
      "name": "Ecology survey effort allocation",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology survey effort allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2712",
      "name": "Ecology observer detection comparison",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology observer detection comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2713",
      "name": "Ecology camera-trap effort",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology camera-trap effort",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2714",
      "name": "Ecology acoustic monitoring duty cycle",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology acoustic monitoring duty cycle",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2715",
      "name": "Ecology habitat patch connectivity",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology habitat patch connectivity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2716",
      "name": "Ecology corridor area ledger",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology corridor area ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2717",
      "name": "Ecology habitat restoration plant order",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology habitat restoration plant order",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2718",
      "name": "Ecology invasive removal workload",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology invasive removal workload",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2719",
      "name": "Ecology tree canopy cover sampling",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology tree canopy cover sampling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2720",
      "name": "Ecology vegetation cover overlap",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology vegetation cover overlap",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2721",
      "name": "Ecology biomass allometry worksheet",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology biomass allometry worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2722",
      "name": "Ecology carbon stock accounting",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology carbon stock accounting",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2723",
      "name": "Ecology nest monitoring visit plan",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology nest monitoring visit plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2724",
      "name": "Ecology biodiversity data completeness",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology biodiversity data completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2725",
      "name": "Ecology volunteer survey bias audit",
      "category": "Ecology and conservation monitoring",
      "status": "planned",
      "purpose": "Ecology volunteer survey bias audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2726",
      "name": "Laboratory buffer component worksheet",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory buffer component worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2727",
      "name": "Laboratory serial transfer plate plan",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory serial transfer plate plan",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2728",
      "name": "Laboratory cell counting chamber",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory cell counting chamber",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2729",
      "name": "Laboratory cell viability count",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory cell viability count",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2730",
      "name": "Laboratory seeding density worksheet",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory seeding density worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2731",
      "name": "Laboratory passage split arithmetic",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory passage split arithmetic",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2732",
      "name": "Laboratory growth curve doubling estimate",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory growth curve doubling estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2733",
      "name": "Laboratory assay standard-curve fit",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory assay standard-curve fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2734",
      "name": "Laboratory plate normalization",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory plate normalization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2735",
      "name": "Laboratory ELISA replicate variability",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory ELISA replicate variability",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2736",
      "name": "Laboratory qPCR delta-delta worksheet",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory qPCR delta-delta worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2737",
      "name": "Laboratory qPCR efficiency curve",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory qPCR efficiency curve",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2738",
      "name": "Laboratory nucleic acid purity ratios",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory nucleic acid purity ratios",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2739",
      "name": "Laboratory nucleic acid amount",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory nucleic acid amount",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2740",
      "name": "Laboratory oligonucleotide molarity",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory oligonucleotide molarity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2741",
      "name": "Laboratory protein extinction concentration",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory protein extinction concentration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2742",
      "name": "Laboratory centrifuge RPM-RCF",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory centrifuge RPM-RCF",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2743",
      "name": "Laboratory centrifuge run batching",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory centrifuge run batching",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2744",
      "name": "Laboratory sample freezer map",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory sample freezer map",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2745",
      "name": "Laboratory aliquot freeze-thaw ledger",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory aliquot freeze-thaw ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2746",
      "name": "Laboratory reagent expiry inventory",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory reagent expiry inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2747",
      "name": "Laboratory contamination control results",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory contamination control results",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2748",
      "name": "Laboratory pipette gravimetric check",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory pipette gravimetric check",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2749",
      "name": "Laboratory plate randomization",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory plate randomization",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2750",
      "name": "Laboratory sample chain-of-custody",
      "category": "Biological laboratory operations",
      "status": "planned",
      "purpose": "Laboratory sample chain-of-custody",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2751",
      "name": "Process component mass balance",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process component mass balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2752",
      "name": "Process recycle purge balance",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process recycle purge balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2753",
      "name": "Process mixing enthalpy worksheet",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process mixing enthalpy worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2754",
      "name": "Process reaction conversion selectivity",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process reaction conversion selectivity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2755",
      "name": "Process gas compressibility correction",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process gas compressibility correction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2756",
      "name": "Process gas standard-volume conversion",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process gas standard-volume conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2757",
      "name": "Process vapour pressure interpolation",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process vapour pressure interpolation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2758",
      "name": "Process ideal flash calculation",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process ideal flash calculation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2759",
      "name": "Process binary distillation lever rule",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process binary distillation lever rule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2760",
      "name": "Process relative volatility",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process relative volatility",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2761",
      "name": "Process extraction stage mass balance",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process extraction stage mass balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2762",
      "name": "Process adsorption isotherm fit",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process adsorption isotherm fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2763",
      "name": "Process batch reaction fit",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process batch reaction fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2764",
      "name": "Process plug-flow residence time",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process plug-flow residence time",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2765",
      "name": "Process residence-time distribution",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process residence-time distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2766",
      "name": "Process CSTR dilution rate",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process CSTR dilution rate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2767",
      "name": "Process filtration cake resistance",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process filtration cake resistance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2768",
      "name": "Process drying moisture basis",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process drying moisture basis",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2769",
      "name": "Process evaporator solids balance",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process evaporator solids balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2770",
      "name": "Process crystallization theoretical recovery",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process crystallization theoretical recovery",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2771",
      "name": "Process solvent recovery economics",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process solvent recovery economics",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2772",
      "name": "Process pH strong-acid worksheet",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process pH strong-acid worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2773",
      "name": "Process pH buffer worksheet",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process pH buffer worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2774",
      "name": "Process conductivity calibration",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process conductivity calibration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2775",
      "name": "Process reagent certificate reconciliation",
      "category": "Chemical process measurements",
      "status": "planned",
      "purpose": "Process reagent certificate reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2776",
      "name": "Research participant visit schedule",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research participant visit schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "441eba3abb3873507c4b9112b51ae67ef1b2e9229bf4c0c7827ac85b7edb9533",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target study completers (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Retention at successive recruitment stages (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "21d62fd7003a612b2223a9f55b609c6046207f9cb2a045f8e69012e1c0af5514",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Participants (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Visits per participant (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Approved payment per visit (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Return travel distance per visit (km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Approved reimbursement per km (currency/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2779",
      "name": "Research study milestone dependency",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research study milestone dependency",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6d6dd560b2fcd2995481f610c23b70fb7caa7a85481c6b4278db388ddee2923c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Experiment run durations (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Instrument setup per run (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Available instrument session (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "10ac2be4b1c8c60a849bb59465830ec09c031f2d11db8c3ade90d3c9ba2ec139",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Samples to process (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Samples per batch (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Sequential stage durations per batch (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Independent fully staffed processing lanes (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2782",
      "name": "Research blinded label inventory",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research blinded label inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2783",
      "name": "Research randomization block balance",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research randomization block balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "a54de593dbdb856e37d8aaf6f10d7ec785e920618e1d027fb2b113ada16fd2ba",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Deviation events by predefined category (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Participants observed (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Participants with any deviation (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2785",
      "name": "Research consent version reconciliation",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research consent version reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2786",
      "name": "Research data collection completeness",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research data collection completeness",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2787",
      "name": "Research follow-up retention calendar",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research follow-up retention calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "eb1d086b400e1019279335ffd3f6aef0132b84584fb66c7d6d82f88be7b5dc17",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Site enrollment targets (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Enrolled participants to date (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Observed recruiting days (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fd74a3b36af6c93ee2913f08ed56967727c4eb6e1ee013af8092a352d07a74f3",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Recruitment spend by channel (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Inquiries by channel (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Eligible inquiries by channel (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Enrolled participants by channel (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c8043d3d1e07f02d7020c5d8a36f9deac9f15385a2a0fb7a0baf9fd6f2d995cb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Monthly loaded salaries by staff (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Grant effort by staff (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Funded duration (months)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "860196634fd3736e7e612b3715d92fc65ee16abb0db408e72a40fd39e78d8c4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total direct costs (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Costs excluded from indirect base (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplied indirect rate (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "44029b7aa3f03605c64786849d37b99c94547e38d657d633d66a15ceb09835e8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Booked equipment time (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Actual equipment time (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Usage tariff (currency/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Consumables (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Charge basis (0 actual, 1 booked)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "82a09add4651d9e3eb53c0ffd6285864238c3b3b42b7a8fcab01aca3f7b48a41",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Publication fees in original currencies",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Waivers or discounts (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Base-currency units per original-currency unit",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "81c84064d1c0e843c643e2783195df90a3e377f49b5c8688f343631a2c4562eb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Retrieved records (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Confirmed duplicates (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Title-abstract screening (minutes/record)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Full-text reviews (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Full-text review time (minutes/record)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Independent reviewers per record (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "g",
          "label": "Combined reviewer capacity (hours/day)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2795",
      "name": "Research reviewer assignment balance",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research reviewer assignment balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d5303d86d75945459fd5ee54e9d80ef48f2730fcbf153ed4f904b431b1410cd7",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Reviewer A inclusion decisions (0 exclude, 1 include)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Reviewer B inclusion decisions (0 exclude, 1 include)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2797",
      "name": "Research bibliography deduplication audit",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research bibliography deduplication audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2798",
      "name": "Research reproducibility artifact coverage",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research reproducibility artifact coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "353debfd833b053ec618e89a46129228a4d6cc4df659b376a06f61a3bdfc2fa8",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Approval dates (days from project origin)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Embargo durations after approval (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Final dependency clearance (day from origin)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2800",
      "name": "Research study closeout checklist",
      "category": "Academic and research administration",
      "status": "planned",
      "purpose": "Research study closeout checklist",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2801",
      "name": "Sports fixture home-away balance",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports fixture home-away balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2802",
      "name": "Sports league tie-break resolver",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports league tie-break resolver",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2803",
      "name": "Sports tournament rest-gap audit",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports tournament rest-gap audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2804",
      "name": "Sports pool crossover bracket",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports pool crossover bracket",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2805",
      "name": "Sports round scheduling by venues",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports round scheduling by venues",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2806",
      "name": "Sports match official allocation",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports match official allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "58c811fb733b0ef9aaa28625c6022c8798c5f2cf099bcd7e33f31fc9aa46f63c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Return travel distances by match (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Match officiating fees (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Approved distance rate (currency/km)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "418f1dde0dd90209cbfa31eac1313990f1140fc2ed755c03f49e209b1dab8ed4",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Registrations by member category (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Standard category fees (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Category discounts (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Equal installments (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "94358eedc76efeca831f74a2f787cde75ad2ae9b9f55dd8053af5d26487acfdd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required kits by size (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Available kits by size (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "65337316517b5f2bcea4950fe3abd914105d1c22444dc0f01ab846f85cd8da98",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total facility opening hours (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Closure time within opening hours (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Non-overlapping booked playable hours (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2811",
      "name": "Sports pitch renovation downtime",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports pitch renovation downtime",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ec441674c59e200a598fcef94812cee30d3f36b9127b747f8761f4660b3eb892",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Entrants per declared pace group (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Wave capacity (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Time between wave starts (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2813",
      "name": "Sports race timing chip reconciliation",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports race timing chip reconciliation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "56ee3f68754766c70289d0c800949039fcbeff640f7b9f1158a667188b415d38",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Checkpoint cumulative distances (km)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Checkpoint cutoff times (minutes from start)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Planned cumulative arrival times (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2815",
      "name": "Sports relay leg assignment",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports relay leg assignment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2816",
      "name": "Sports handicap result worksheet",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports handicap result worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "87cd036612efadd98bcb43edfeb37cd0b530894c9544fb87871977d95880c173",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Wins (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Losses (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Draws (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Points per win",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Points per draw",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "54b59d1536cd744533f6d8bf0f2205ad07886fc4945f89567de7f598ba2a4e21",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current standings points",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Remaining fixtures (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Points per win",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Points per draw",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Target points",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2819",
      "name": "Sports tournament prize tax worksheet",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports tournament prize tax worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2820",
      "name": "Sports event volunteer station coverage",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports event volunteer station coverage",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2ff43a2090dafaaaa7444bcc61a2c6bb4c7918664a9f5845ab225f85169edd36",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Expected participants served by station (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "User-chosen servings per participant by station",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Serving cup capacity (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Inventory reserve (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2822",
      "name": "Sports finish-line throughput",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports finish-line throughput",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2823",
      "name": "Sports spectator gate assignment",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports spectator gate assignment",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2824",
      "name": "Sports club membership renewal cohorts",
      "category": "Sports competition administration",
      "status": "planned",
      "purpose": "Sports club membership renewal cohorts",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4a9c3fbcb37e37bc6e881c5cb33780881e388f8dc9642c940a6b48ae46d0e429",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Period length (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Elapsed wall time since period start (minutes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Completed clock pauses within elapsed time (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2826",
      "name": "Miniature building wall cut list",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature building wall cut list",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2827",
      "name": "Miniature room furniture fit",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature room furniture fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "76bb40949f9d233e2db24f2eb1b03f7dffd0064f20559252f74f55a4579111fd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Texture surface width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Texture surface height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Brick module width including mortar (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Brick course height including mortar (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ac38f09b2c36cba9597294c72fd9040529ef057f80f32817a54714ea1275a4c5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Miniature roof slope width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Roof slope length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Shingle width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Exposed height per course (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "724473e831ba798dc835d428182d59ee2f03773c4a1fa370ea5ff7f07d5b3882",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Total miniature stair rise (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Total miniature stair run (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Equal steps (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Tread material thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2831",
      "name": "Miniature scenic tree distribution",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature scenic tree distribution",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2832",
      "name": "Miniature terrain foam stack",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature terrain foam stack",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "65549ad8ab1c156737a6ab090cbf948ce79bb4ad759fc51203dd4ea66aa2f832",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Miniature mold cavity volumes (mL)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Embedded object displacement (mL)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured transfer loss (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Maximum prepared batch (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2834",
      "name": "Miniature paint thinning by label",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature paint thinning by label",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2835",
      "name": "Miniature paint coverage test scaling",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature paint coverage test scaling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2836",
      "name": "Miniature spray booth filter log",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature spray booth filter log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "19aaecd20781700e50afd7fb4cc301aa291c5a7ab0193466720b259bc92ad247",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cabinet usable height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Tallest displayed model including base (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Clearance above model (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Shelf thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Models fitting across each shelf (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e1bcdadd65408b45a7928f59be5f4a8684c54945b5b18e42170fab17038c9a8c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Item counts by collection category",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Recorded unit acquisition cost (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "User-declared unit current value (currency)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "4bd5710c8d9340bd65d2d79479e29c20c74cc5217fa7a9dd8e6992f272735e98",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Assembly joints by model group (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Specified magnet pairs per joint (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Available magnets (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f8ae7b476ae94d9e68f48e437988993ca6e50c90da1956badc2643144eaffcb5",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Decal width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Decal height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Sheet width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sheet height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Margin on every sheet edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Gap between decals (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Decals required (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2841",
      "name": "Miniature sculpting putty batch",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature sculpting putty batch",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "645c2a447eb155e6b4bcc38e38beb841b8160ddcee0c5cea813083dfe1f00ae1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Inner tube outside diameters (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Outer tube outside diameters (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Outer tube wall thicknesses (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Required radial clearance (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "89990df989dc85a3d8f49071d4889306e3d830b0a54d1b9543e1ec2e85212f3e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Reference object sizes (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Desired apparent distance multipliers",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "09cc1b514366aa7c6e4d35b1925523d4f2a1252a1025173e54e8850412967f70",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Depth range to cover (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Measured usable focus increment (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Desired increment overlap (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2845",
      "name": "Miniature transport foam cells",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature transport foam cells",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "da2b1720978b21d62572fdc230e916c40421a70a8ac9863706f44dde10f52eb6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Unit quantities (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "User-supplied points per unit",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Army point cap",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "User-supplied maximum quantities",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2847",
      "name": "Miniature tournament roster audit",
      "category": "Miniature models and tabletop terrain",
      "status": "planned",
      "purpose": "Miniature tournament roster audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2aec35dc54ca5ad629723999cd7f15f3ded668bd31bd912a954316b60582c67c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Table length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Table width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Terrain footprint areas (square cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Measured repeated overlap area (square cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5f8d14b6aa2ea6e69ff127e8975befe26d95a3311569fa8d71fd69de17b5e03e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Available base-edge path length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Measured letter widths (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Margin at each end (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Desired minimum interletter gap (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "93e320fff4052db340fa4c9fe31483b398fc981d325f8292e67ac28df06a6366",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Model counts by complexity group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured work hours per model",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Available painting hours per workday",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Due day offsets by group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2851",
      "name": "Canvas stretcher cut list",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Canvas stretcher cut list",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b6a77d0255ff14456bebed887a6796dea43ca9d12afd7c3de1e88f7459ab3448",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Canvas frame width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Canvas frame height (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Frame depth (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Rear grip margin per edge (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "72bd6c6fa0b550d235362676d770119609690973d156b5175dccd4c995b5f66f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Canvas surface area (square metres)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Tested primer coverage per litre per coat (square metres/L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Primer coats (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Primer container size (L)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Price per container (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3024342d4cc69ac6f3b38a00892d8c79d20fae74ed2dbdf250c32401dd84bdfb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Chosen paint proportions (parts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Total paint batch (mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2855",
      "name": "Artist pigment tinting test scale",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Artist pigment tinting test scale",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "daee2b01f0e0695bfac430d30bdc77befcd306ffad766daf02c4c4e15127da84",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Paint colours (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Swatch cell width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Swatch cell height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Sheet columns (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2857",
      "name": "Artist perspective vanishing worksheet",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Artist perspective vanishing worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "2bb1cebd0c84c335bef45d2666dc1432c9c9daff321f4824939e24f0145d8c7f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Artwork width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Artwork height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Equal grid divisions per axis (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bda2cd6a56394babe713eb062f8ea0d3c3aa4b83e1706bc180572312704ef8bb",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Reference image width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Reference image height (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Mural width (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Mural height (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Reference grid square side (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2860",
      "name": "Artist mural paint zone estimate",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Artist mural paint zone estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2861",
      "name": "Artist studio easel clearance",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Artist studio easel clearance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6e032c134cad2d87b161f0521a5d960c9414c3de3a60dd729348e89e259dce4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Numbered edition size (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Artist proofs outside numbered edition (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Reserved numbered copies (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Sold numbered copies (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1efcc36eec0d7a5dcd66d36d52e52a6b041fd2ba58aba1220273807c6bb12f9a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Print sale price (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Gallery commission (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Production cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Artist-paid shipping (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "654c0febdad3c1c45fcf3db20a5b60e2ceae1bd6eb56894c41a3fa7070bfb056",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Works consigned (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Works sold (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Works returned (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Total sold-work receipts (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Consignment commission (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Paid artist advance (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f8f2220ed14c260ab7780365c6bf80a535477df50723e3cde7ffbf8176ed6718",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Usable uninterrupted wall length (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Artwork widths in hanging order (cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Preferred gap between artworks (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Minimum end margin (cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "27f1be96357cf22967d890fa61836cb03c6c66b0e03f4d519f2cc02fa2220715",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Artwork width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Artwork height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Artwork overlap under mat on each edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Frame opening width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Frame opening height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2867",
      "name": "Artist glazing sheet allocation",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Artist glazing sheet allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2868",
      "name": "Artist varnish batch volume",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Artist varnish batch volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "5bb2f8a2a1138083d054ab4d45c9f44f3852eb6e688207349d94269cde7caf88",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Artwork ready-to-handle times from now (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Total rack slots (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "c",
          "label": "Future observation offset (hours)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "428b97604b3f037c8cfcd38a4e8356d1f7cb0678b308120123e11ca86fcc8eb2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Commission fee (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Upfront material spend (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Milestone payment shares (%)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Milestone dates (days from start)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ab55c97bcc2cc2f4622463eae67c8aef746fedca018f1e5be18a42aa362b5353",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Travel expense (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Housing per day (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Residency duration (days)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Studio charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Materials budget (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Confirmed grants and support (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "83af6051cb89417ee637330638a8b9d9e84d6622835db2e4fab631225cdfec54",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Shared studio period rent (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Occupied area per participant (square metres)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Usage days per participant (days)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Agreed allocation weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2873",
      "name": "Artist inventory insurance valuation",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Artist inventory insurance valuation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "bf559f6675b6302b8eb7121353b3a34c35a651d59c725588914aa61f2c59b822",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Portfolio image widths (pixels)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Portfolio image heights (pixels)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Maximum export long edge (pixels)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Estimated bytes per exported pixel",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Upload batch byte limit (bytes)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2875",
      "name": "Artist workshop material kits",
      "category": "Visual arts and painting practice",
      "status": "planned",
      "purpose": "Artist workshop material kits",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2876",
      "name": "Ceramic total shrinkage stages",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic total shrinkage stages",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2877",
      "name": "Ceramic mold enlargement",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic mold enlargement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2878",
      "name": "Ceramic clay slab mass",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic clay slab mass",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2879",
      "name": "Ceramic slab box template",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic slab box template",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2880",
      "name": "Ceramic thrown cylinder clay estimate",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic thrown cylinder clay estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2881",
      "name": "Ceramic mug handle length",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic mug handle length",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2882",
      "name": "Ceramic glaze test batch scaling",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic glaze test batch scaling",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2883",
      "name": "Ceramic glaze dry-wet conversion",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic glaze dry-wet conversion",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2884",
      "name": "Ceramic glaze slurry density",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic glaze slurry density",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2885",
      "name": "Ceramic glaze application uptake",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic glaze application uptake",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2886",
      "name": "Ceramic dip tank displacement",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic dip tank displacement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2887",
      "name": "Ceramic glaze recipe cost",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic glaze recipe cost",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2888",
      "name": "Ceramic kiln shelf packing",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic kiln shelf packing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2889",
      "name": "Ceramic kiln vertical stacking",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic kiln vertical stacking",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2890",
      "name": "Ceramic kiln firing energy log",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic kiln firing energy log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2891",
      "name": "Ceramic firing schedule duration",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic firing schedule duration",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2892",
      "name": "Ceramic kiln cooling observation",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic kiln cooling observation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2893",
      "name": "Ceramic studio firing fee allocation",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic studio firing fee allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2894",
      "name": "Ceramic clay reclaim mass balance",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic clay reclaim mass balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2895",
      "name": "Ceramic casting slip fill volume",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic casting slip fill volume",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2896",
      "name": "Ceramic casting mold turnaround",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic casting mold turnaround",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2897",
      "name": "Ceramic test tile label inventory",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic test tile label inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2898",
      "name": "Ceramic warpage measurement",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic warpage measurement",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2899",
      "name": "Ceramic glaze defect frequency",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic glaze defect frequency",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2900",
      "name": "Ceramic packaging breakage audit",
      "category": "Pottery and ceramic studios",
      "status": "planned",
      "purpose": "Ceramic packaging breakage audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d57866f826d10a841ff12c30d903cf1061f637ee1451e929327357916d22e4c0",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target ring inside diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Ring stock thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Additional joint finishing allowance (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2902",
      "name": "Jewelry ring size chart mapping",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry ring size chart mapping",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "01fd45c187ca1ba65574f32cd0cb0231431213efb36d5b883332329eea5e499d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Current ring circumference (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Target ring circumference (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Rectangular section width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Rectangular section thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Supplied metal density (g/cubic cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1c74d830d41dff652cae691daeb9a5755d87d6455685d97da6d849f9875e571e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured wire diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Wire stock length (metres)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplied material density (g/cubic cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Supplied price per gram (currency/g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2905",
      "name": "Jewelry chain link material",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry chain link material",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4fa259e4540afbf520bc5c498398c688d348086a99f19f2b389b56d5ef990d4d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Jump-ring inside diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Actual wire diameter (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2907",
      "name": "Jewelry jump ring coil yield",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry jump ring coil yield",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "6116e0a511dd3295707bd0642a51ade5c9f7659796bf97bbacfdedfc3e819b57",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target strand length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Uniform bead width along strand (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Spacer width between beads (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Clasp and end findings combined length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2909",
      "name": "Jewelry bracelet fit allowance",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry bracelet fit allowance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2910",
      "name": "Jewelry necklace multi-strand layout",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry necklace multi-strand layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "366cc3d5b5dddedfb9644857a6ce86a40c266c515d07c49a8fa7004073adc1ff",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Gemstone counts by parcel group",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured unit gemstone weight (carats)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2912",
      "name": "Jewelry gemstone volume estimate",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry gemstone volume estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2913",
      "name": "Jewelry bezel strip blank",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry bezel strip blank",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "4fb72be05af889d664933712774a865a88624b87f3179a55a7e76d9ce2d1c14b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Round stone outline radius (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Chosen radial prong offset (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Equally spaced prongs (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "First prong angle (degrees)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified"
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "14711bc884c01de4221e249b893064622f0546ec3f4f82f871e829ba89dd181f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "First metal mass (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "First metal assay (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Second metal assay (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Target blend assay (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "bce117d27c8a1ab6f830bbdf76dc1d336387cb5a5f6276514209e695d7eaa717",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Scrap mass (grams)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Supplied recoverable-metal assay (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Entered metal price (currency/gram)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Refiner percentage deduction (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Fixed refining charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "aa16cd0c86e17952aa661fa8833f3d30e0038e20963dd90f809aa0d6374c3340",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Joint counts by solder type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured solder consumption per joint (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Available solder by type (g)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2918",
      "name": "Jewelry casting tree mass",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry casting tree mass",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "9c056a0f91b5fe22a83347a37e47c62005ef6d1516d6c607dfd0664f3aabe425",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Wax master dimensions (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured linear process shrinkage (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "37b88b1edc09de0cbd318c8fbf7bd0efaa5ec119ce26cb96ddb6ff9e8c1b0930",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Pieces in hallmark batch (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "b",
          "label": "Supplied fixed batch fee (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Supplied assay fee per piece (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Supplied stamping fee per piece (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Shipping and handling for batch (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "ccec66e9412248676288cd79c54f9d8ee8cdf963687c0624dd10a31cd71b4c1c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Stone-setting counts by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured minutes per setting by type",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Available bench hours per day",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Quoted labour rate (currency/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "89b15b39dae86a77722a3840872b7e4fa3591bb218feb9334da5b4e29e66213e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Mass before polishing (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Mass after polishing (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Recovered matching metal dust (g)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1bcf3671c2491bffbb3206ad0c5481a001388adb295741a9dc774914d0e1950f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Repair parts cost (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Labour stage times (minutes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Labour rate (currency/hour)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Fixed service charge (currency)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Markup on parts and labour (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2924",
      "name": "Jewelry commission deposit exposure",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry commission deposit exposure",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2925",
      "name": "Jewelry display tray packing",
      "category": "Jewelry and small metal crafts",
      "status": "planned",
      "purpose": "Jewelry display tray packing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "181a6aa870eb6909f0256bf90b7baaf194b9710a084c0d8cb7d1a514c3f5d733",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Belt fit length to center hole (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Buckle fold-back allowance (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Tail beyond center hole (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Hole pitch (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Holes on each side of center (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dfc5d398b0375261e0c8efaf0b9cd5c3c631f0efc90de9c9681c38ec2ae4a3d1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Smallest desired belt fit (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Largest desired belt fit (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Chosen hole pitch (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f9c9c068f9c88547496f93de2dbd4fc3c8f1b2467d637c311191372c1b6e5ae6",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Leather layer calipers (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Layer repetitions at thickest fold",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Additional lining and adhesive total (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Measured compression (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6a3d1792335091df3db5dfb3d286cfa4a1dbb3d434e5f74388b57875c4ec632c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rounded panel outer width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Rounded panel outer height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Panel corner radius (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Gusset seam-end overlap (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Finished gusset depth (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Seam allowance along each strip edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "043d2b7367cd82a8eca52458fa0863a2076ce039479538a07cbb366dd4a1ed10",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Seam lengths (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Stitch pitch (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Start offset (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "End offset (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d2760d840dcc20dc78e41528a57bc1c5c2f5253844ec6b19f3d4b8de74288a0e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Saddle-stitched seam lengths (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured thread use per seam length (multiple)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Needle-end allowance per end (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2932",
      "name": "Leather lacing material estimate",
      "category": "Leatherwork and bookbinding",
      "status": "planned",
      "purpose": "Leather lacing material estimate",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "53cbde089ff61fc27094db33f065133dec0c29556123da661e478f7c7c2c0a03",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Strap starting width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Strap ending width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Taper length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Stock blank width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2934",
      "name": "Leather hide usable yield",
      "category": "Leatherwork and bookbinding",
      "status": "planned",
      "purpose": "Leather hide usable yield",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "3b3327c6e744820339828df233d7a73a6800e8740798b1caac2c3aa47b01471e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Leather exposed edge lengths (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Corresponding leather thicknesses (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured spread coverage (square mm/mL)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Edge-paint coats (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2936",
      "name": "Leather dye bath inventory",
      "category": "Leatherwork and bookbinding",
      "status": "planned",
      "purpose": "Leather dye bath inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "542d9a14ca2f6c896fde2b6e0c35e50e73bd741fc7ad41efad3266623abc32e2",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Leather layer thicknesses (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Rivet minimum grip by candidate (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Rivet maximum grip by candidate (mm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2938",
      "name": "Leather snap placement allowance",
      "category": "Leatherwork and bookbinding",
      "status": "planned",
      "purpose": "Leather snap placement allowance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "8c7e41eeec046274c8ac4d57ca063b25934e042d911bb4cb6a617eac600bce11",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Zipper tape total width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Desired visible zipper opening width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Panel seam allowance (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Finished opening length (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "End allowance at each end (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8512726894843fbdb59e178d665515ec3d43002d96459b7ecbe4a73d069daf04",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Target wrist loop circumference (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Watch case span along wrist (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Buckle contribution to loop (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Extra long-strap overlap (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Short-strap share of net loop (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a64608a0df70dc25db7a3ac70f654ddea57a1669a59f88a2a5263f8a6804aa9f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rectangular damage width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Rectangular damage height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Chosen patch overlap on each side (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Usable hide width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Usable hide height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "fe1a782ae6d7d46616f7e3d56f68aaff690f947b08ba8d86f890d52c02524482",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Textblock height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Sewing stations (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 2
        },
        {
          "key": "c",
          "label": "Head margin (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Tail margin (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e8cee325ee861466a318eaa3feb62729cfcebda734d159efb4cc7859ae61125d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Signatures to sew (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "b",
          "label": "Textblock spine height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured method thread factor (multiple)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Additional starting and finishing thread total (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5a8148d46437794c02909a38f8f1126a200948d5d27b950ed9babdbc2c97889c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Textblock width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Textblock height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Fore-edge and head-tail square (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Board inset from textblock spine edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Textblock spine thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "f",
          "label": "Board thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f0a500aaf9c2e2bf6d4d64941be735a479e30cd1216bc947c310fa6a8619035a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Cover board width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Cover board height (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Spine strip width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "Joint gap on each side of spine (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Cloth turn-in on each outside edge (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "dafceb38eb0e0e6d8e56fcbfc567c38597f996fcd2f31dc723e716d8f109964a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Paper sheet caliper (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Successive folds (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Folded sheets stacked (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1
        },
        {
          "key": "d",
          "label": "Observed stack compression (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "b0e3881efb6764c182b5a16f99d45880fd7a0998e178e12509434c127649c21a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Spine width (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Endband stitch pitch (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "c",
          "label": "Measured thread use per stitch (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "d",
          "label": "First colour stitch share (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "e",
          "label": "Starting-finishing allowance per colour (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e50aa8bcb7b37c3df8178f63c3e64f099d9797e5c6a167b2445e8780201e0b5b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Bookbinding adhesive areas (square cm)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Tested wet adhesive spread (grams/square cm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Measured adhesive handling loss (%)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "15305aa10dd02f7c63c0059eea5db9b12d3c4361d4ec2b5febae75f52e9ea986",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Closed book thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "b",
          "label": "Pressing board thickness (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Clear press opening (mm)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Books awaiting pressing (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2950",
      "name": "Bookbinding repair material ledger",
      "category": "Leatherwork and bookbinding",
      "status": "planned",
      "purpose": "Bookbinding repair material ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2951",
      "name": "Grow light daily light integral",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow light daily light integral",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2952",
      "name": "Grow light uniformity grid",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow light uniformity grid",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2953",
      "name": "Grow light photon efficacy",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow light photon efficacy",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2954",
      "name": "Grow tent canopy space allocation",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow tent canopy space allocation",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2955",
      "name": "Grow shelf tray clearance",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow shelf tray clearance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2956",
      "name": "Grow room appliance heat input",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow room appliance heat input",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2957",
      "name": "Grow room humidity removal log",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow room humidity removal log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2958",
      "name": "Grow irrigation runoff fraction",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow irrigation runoff fraction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2959",
      "name": "Grow substrate container water capacity",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow substrate container water capacity",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2960",
      "name": "Grow substrate dryback log",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow substrate dryback log",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2961",
      "name": "Grow reservoir top-up balance",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow reservoir top-up balance",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2962",
      "name": "Grow nutrient label mixing worksheet",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow nutrient label mixing worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2963",
      "name": "Grow nutrient elemental label tally",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow nutrient elemental label tally",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2964",
      "name": "Grow reservoir conductivity correction",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow reservoir conductivity correction",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2965",
      "name": "Grow propagation light schedule",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow propagation light schedule",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2966",
      "name": "Grow seedling hardening calendar",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow seedling hardening calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2967",
      "name": "Grow transplant plug spacing",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow transplant plug spacing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2968",
      "name": "Grow seed germination timing",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow seed germination timing",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2969",
      "name": "Grow germination trial comparison",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow germination trial comparison",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2970",
      "name": "Grow plant support string inventory",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow plant support string inventory",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2971",
      "name": "Grow pruning biomass ledger",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow pruning biomass ledger",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2972",
      "name": "Grow pest monitoring card counts",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow pest monitoring card counts",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2973",
      "name": "Grow soil-test trend worksheet",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow soil-test trend worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2974",
      "name": "Grow watering task calendar",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow watering task calendar",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2975",
      "name": "Grow propagation saleable yield",
      "category": "Indoor growing and garden diagnostics",
      "status": "planned",
      "purpose": "Grow propagation saleable yield",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "id": "CC-2976",
      "name": "Touch target spacing audit",
      "category": "Accessibility and product usability measurements",
      "status": "planned",
      "purpose": "Touch target spacing audit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "0a610fa3ac64a61c7dcd0a0b22736fcb6f38a441fd96d83fd7f3ad3616915207",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Control center x-coordinates (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Control center y-coordinates (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Viewport width (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "d",
          "label": "Viewport height (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 1e-9
        },
        {
          "key": "e",
          "label": "Chosen reach-zone left edge (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "f",
          "label": "Chosen reach-zone top edge (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "g",
          "label": "Chosen reach-zone right edge (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "h",
          "label": "Chosen reach-zone bottom edge (CSS pixels)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "f12e582be5cf7bc2f0b717422d8cef160c8e3b06acffec37fd5cd6ebc597f947",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required interactive element IDs (positive integers)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observed keyboard focus traversal IDs",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "d6f77703baab0f42a146f983bb2d40d9a4e3db20be9a1b196151080491cdf97a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured field-entry times (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Fields included in selected conditional path (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Navigation and submission time for path (seconds)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "8f093514f771197b4293fa3a2d37d7e0f9568dff27a9f32720fb24bd7a0bebb9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Observed form-error recovery durations (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Corrected fields for each recovery event (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Additional interaction steps per recovery event",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "a07a447e22d6a4919d5dd4ec9647c370e818d07d6f6410379111c16c261d8b4a",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Control accessible-name present (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Control requires instructions (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Instruction reference resolves (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "3bb2cd04854c47564c1432045d01dd9063640ddaa7c0a1fd682af60238e60958",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Heading levels in document order (1 through 6)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Present main landmarks (count)",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "6212931dd5688a424d8e4e0e021eb800deaca8601702bc7094515ac0ec30346e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required header associations per data cell (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Verified resolving header associations per cell (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "9cc1e1807d283871f0133751857da77071a8a69d68f65778a2263fb0fde29d53",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Caption word counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Caption display durations (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "User-chosen review threshold (words/minute)",
          "type": "number",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2985",
      "name": "Caption line-length layout",
      "category": "Accessibility and product usability measurements",
      "status": "planned",
      "purpose": "Caption line-length layout",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "b9e510dac99ebb6c1feba18e6a497aabe11ab92d923fdd9a692d8cdd2bc5decd",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Caption start timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Caption end timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Matching speech start timestamps (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c92a10c77650469f2b63b074129a012f3e14804898718924225ed04f66079665",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Reference audio segment durations (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Verified transcript-covered duration per segment (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0d05b878982d0e37def87350e546fac73160ebff538bb4f66992a934b0a4337b",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required media alternatives bitmask (captions=1, transcript=2, description=4)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Available media alternatives bitmask (same codes)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "e869e9c85e01a6e6ef22c80bcc6a388e373ddb9f346aca57778ca386b70d8e16",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Animated component IDs",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "IDs with verified reduced-motion variants",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2990",
      "name": "Flashing content event worksheet",
      "category": "Accessibility and product usability measurements",
      "status": "planned",
      "purpose": "Flashing content event worksheet",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "ccebf574330dfee43469fb8421ba40782c0b04da27cf23a84ca00541414f31a9",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Measured container widths at zoom observations (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Measured content widths at zoom observations (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Measured container heights at zoom observations (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Measured content heights at zoom observations (CSS pixels)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2992",
      "name": "Responsive breakpoint content fit",
      "category": "Accessibility and product usability measurements",
      "status": "planned",
      "purpose": "Responsive breakpoint content fit",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "d17da04d28accb28a2a9dd6510d582df1e33813238654522414a9189d6ac210c",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Rendered text line lengths (characters)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Preferred minimum characters per line",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "minimum": 0
        },
        {
          "key": "c",
          "label": "Preferred maximum characters per line",
          "type": "integer",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "0ae765b7d26928194737508dec9ab7e08faa3a6885bb2aa430eef04b26eb8f1f",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Observed action counts by task",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Shortest valid successful path counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Task success flags (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "19521107caa559baca5ebbaa64b5b4014f18bf6f2c993016cb5924bf3c64229d",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Document title present (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Document language set (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Document tagging verified (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "c5832948915e0acfa5bf464645768ab0fe760229a5de297a199fe700d717a99e",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Expected reading order element IDs",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Observed PDF reading order element IDs",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "id": "CC-2997",
      "name": "Usability task success confidence",
      "category": "Accessibility and product usability measurements",
      "status": "planned",
      "purpose": "Usability task success confidence",
      "executable": false,
      "contract_status": "not_implemented",
      "inputs": null,
      "outputs": null,
      "dependencies": null,
      "example_questions": [],
      "url": null
    },
    {
      "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": "5bd307f351ac7a12c846bb5816a3187af77174f73293f8a1d41927059add68d1",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Group A task durations (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Group A completion flags (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Group B task durations (seconds)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "d",
          "label": "Group B completion flags (0 or 1)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "5512a797651754128345e05aee8a065740d50cb8731fd61334bf627ac64aa082",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Observed issue frequency counts",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "User-assessed severity weights",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Estimated repair effort (hours)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    },
    {
      "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": "1e42a29478cb08b37688c53c6a4315b43c30646359999617a95e06f5e6636433",
      "engine_version": "bfd2f61880d47b086ad70e01724754df1b9d429409863c04a618597725a2af3f",
      "executable": false,
      "contract_status": "metadata_only",
      "inputs": [
        {
          "key": "a",
          "label": "Required regression checks per component-state (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "b",
          "label": "Executed checks per component-state (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        },
        {
          "key": "c",
          "label": "Failing checks per component-state (counts)",
          "type": "array",
          "required": true,
          "unit": null,
          "unit_status": "not_qualified",
          "items": {
            "type": "number"
          },
          "minItems": 1,
          "maxItems": 1000
        }
      ],
      "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 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": [],
      "retrieval_phrases": [],
      "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"
      }
    }
  ]
}