Skip to main content
Glama

Explain Cost

explain_cost
Read-onlyIdempotent

Explain what a priced calculation costs and why, in one short structured answer. Use it first once a calculation has succeeded. Returns the unit, total and setup cost, the prediction band and confidence, the cost categories, the machine used, how many times each machine clamps the part, work the drawing asks for that is not in the price, and the top cost drivers: the cost categories with their share of the unit cost first, then the features. The drivers show what to change in the design or to challenge in a quote. For the itemised line items, use get_cost_breakdown. For the status of a calculation that is still running, use get_calculation. Read-only and free.

Input Schema

NameRequiredDescriptionDefault
detailNoHow many cost drivers to list: 'concise' (the default) lists the top 3 cost categories and the top 3 features (an assembly's top 3 rows), 'detailed' the top 10.concise
calculation_idYesId of a calculation, as upload_and_quote, quote_part or list_calculations return it.

Output Schema

NameRequiredDescriptionDefault
nameNo
errorNoWhy this calculation produced no price, in one sentence, when its status is terminal (failed / cancelled). Absent while it is still running and on a priced calculation.
routeNoEvery machine / work centre the priced route runs on, in order — the same chain get_process_plan lists. One entry on a single-machine quote; e.g. [bandsaw, lathe] when the blank is sawn first. Empty when the calculation carries no process plan.
timesNoTime per category behind the cost lines — programming, inspection, finishing, deburring, packaging, and the machine-side phases. Every line except material, tooling and outsourced work is time x rate, so this is the basis the money is struck on. Absent on a calculation that recorded no time breakdown.
statusYes
machineNoMachine the part was priced on.
coverageNoPresent only when status is 'blocked': the calculation was created but not run because the organization has no included calculations left, has reached its monthly overage cap, or has its billing paused. Carries {reason, message, remaining, used, included, tier_slug, window}: 'reason' says which, 'message' states it in a sentence. The part is saved; a later calculation of it runs once the block is lifted. Never a 402.
currencyNoThe calculation's currency. EVERY money figure on this result is stated in it — unit_cost, offer_price, total_cost, setup_cost, the band, every cost_breakdown line and every driver.
guidanceYesWhat to do next to act on or reduce the cost.
lot_sizeNo
materialNoMaterial, when known.
unpricedNoWork the drawing requires that no machine in this environment can do, so it is not in the price. Each entry names the process and why. Absent when the route covers what the drawing asks for.
clampingsNoHow many times each machine on the route clamps the part, in route order — the same count the route was costed on. Absent when the route did not state a count.
cost_bandNo[low, high] prediction band for the unit cost.
unit_costNoUnit cost per part: direct cost plus overhead_var and overhead_fixed. Where the costing environment states no Material-/Fertigungsgemeinkosten, overhead_var is the flat variable overhead the environment states (none by default); once it states them, those overheads sit above unit_cost as cost-sheet rungs, with administration and selling, margin and the other surcharges. Not the price to quote: that is offer_price, equal to unit_cost only where no surcharges are stated.
confidenceNoQuote-trust signal: calibrated to the shop, or a model estimate — read together with the prediction band.
setup_costNoOne-time setup cost of the lot, on the same basis as unit_cost (below the cost-sheet rungs).
total_costNounit_cost for the whole lot (unit_cost x lot_size), on the same basis as unit_cost; the lot at the offer price is offer_price x lot_size.
offer_priceNoThe offer price per unit — unit_cost plus the cost-sheet surcharges the costing environment states (scrap, overheads, administration and selling, freight, duty, mark-up). Equal to unit_cost when no sheet is stated; this is the figure the tenant's cost sheet and the calculation's own analytics headline as the price. This is the authoritative price: quote from it, not from cost_breakdown.angebotspreis, which is the cost sheet's own total and can differ from it. Absent on older calculations.
top_driversNoWhat drives the cost, largest first. On a part: the cost categories first (setup, subcontract, material, machine …), each with its cost and its share of unit_cost, and an 'other' row with the categories not listed, so these rows add up to unit_cost; then the features (pocket, hole, slot), which split the run-time categories (machine, labour, finishing) and so are part of those rows, never added to them. A part with no machined features (a flat pattern) lists the categories alone; one priced before the cost sheet existed, the features alone. On an assembly: its components and its own joining. The top 3 categories and the top 3 features (an assembly's top 3 rows), or 10 with detail 'detailed'.
unit_time_sNoTotal time per unit in seconds, every work system: the machine run, the finishing pass and the bench work (deburring, packaging) under the allowance, plus the per-unit shares of programming and inspection. Excludes the lot setup (setup_time_s).
cycle_time_sNoMachining cycle time per unit, in seconds.
needs_reviewNo
setup_time_sNoOne-time setup time for the whole lot, in seconds (NOT per unit; divide by the lot size for the per-unit share). Time and cost side by side, for quoting / scheduling / capacity planning.
material_noteNoPlain-language material assumption (which grade was priced, or that a default was used).
calculation_idYes
cost_breakdownNoCost figures per unit, keyed by line, all in `currency` (the calculation's currency — the same basis as unit_cost and offer_price, so the lines add up to the headline). The LINES that sum to unit_cost are material_cost, machine_cost, labour_cost, programming_cost, tooling_cost, finishing_cost, inspection_cost, subcontract_cost, overhead_var and overhead_fixed. Six keys RESTATE money already inside those lines and must not be added again: machine_setup_cost and labour_setup_cost are the setup shares machine_cost and labour_cost already include (the tenant's cost sheet shows the same money as a separate 'setup' row and correspondingly smaller machine and labour rows); transfer_cost is the inter-machine hand-off charge on a composed route, which is priced inside overhead_fixed; and material_purchased_cost and remnant_credit derive material_cost, which is material_purchased_cost minus remnant_credit — the stock bought, less what its reusable remnant is worth back in stock (0 unless the costing environment credits remnants). scrap_credit is what the scrap fetches (0 unless the environment credits scrap): a cost-sheet rung SUBTRACTED inside herstellkosten, before scrap_cost and material_overhead are struck on the net material. direct_unit_cost, herstellkosten, selbstkosten, barverkaufspreis and zielverkaufspreis are SUBTOTALS; angebotspreis is the cost sheet's own offer-price total — offer_price is the authoritative price and the one to quote from, and the two can differ; scrap_cost, material_overhead, production_overhead, sga_cost, packaging_cost, freight_cost, duty_cost, margin (the profit mark-up on selbstkosten), cash_discount, sales_commission and customer_discount are the cost-sheet rungs between unit_cost and offer_price. cost_categories holds the sheet's buckets as the page shows them (setup separate); for the itemised sheet with the tiers beneath each line use get_cost_breakdown.
machine_time_sNoMachine time per unit in seconds: the billed run plus the finishing pass, under the allowance — the time one piece occupies the machine, and the t_e the product's cost sheet states.
review_reasonsNo
cost_categoriesNoThe cost sheet's own buckets per unit (material, setup, machine, labour, programming, tooling, finishing, overheads …) in the quote's currency — exactly the lines the product shows, setup as its own line. On an assembly: its roll-up terms (components_cost, joining_cost, …) and the cost-sheet rungs above them, the same map get_cost_breakdown states, adding up to offer_price. Absent on calculations priced before the sheet existed.
drawing_pairingNoWhether the drawing sent with this calculation describes its model: {status (matched | suspect | mismatched | unverified), drawing_excluded, checks[{name, status}]}. When drawing_excluded is true the drawing describes another part and was left out — the price is the model's alone. Absent when no drawing was paired.
material_pricedNoThe material this calculation was priced as, by its short name — the environment's default material when material_resolved is false. On an assembly whose components name their own materials, each one, comma-separated.
material_sourceNoWhere material_priced came from: 'request', 'drawing_title_block' (the part's drawing), 'step_material_property' (the material its STEP file names), 'assembly_parts_list' (the assembly drawing's parts-list row naming the component), 'assembly_drawing_title_block', 'assembly_parts_list_dominant' (the grade most of that list's made rows name, inferred for a component no row names) or 'environment_default'. The first that names a material wins, in that order: request, drawing, parts-list row, assembly drawing or dominant grade, STEP file, environment default.
material_resolvedNoFalse when no material grade resolved and the part was priced on the environment's default — set material_ref and re-run to correct.
selection_failureNoThe same refusal as data when no machine in the costing environment could make the part: the requirement that stopped it, the machine that came closest with its measured values, and how much of the fleet shares the blocker. Absent unless that is why it failed.
price_completenessNo'partial' when `unpriced` lists work the price leaves out — then unit_cost is a LOWER BOUND for the drawing, not a price for it; 'complete' when the price covers everything. Absent on a calculation from before the contract and on one without a price.
assembly_completenessNoASSEMBLIES ONLY. Whether `unit_cost` is a price or a LOWER BOUND. Carries {n_unique, n_priced, n_pending, n_unpriced, n_excluded, n_partial, total_is_lower_bound, priced_complete, unpriced[], partial[], unpriced_steps[]}, where each unpriced entry has a closed-enum `reason_code`, a `by_design` flag and, where one exists, a `remedy`. `priced_complete` and `total_is_lower_bound` cover the COMPONENTS only (the BOM rows counted in n_unique): `priced_complete` is true when every component priced, and when `total_is_lower_bound` is true a component is missing, so `unit_cost` is a lower bound, not a complete price. `unpriced_steps` lists the assembly's own route steps that carry no price, with their reason, worded as get_process_plan words them (e.g. 'Straightening — unpriced (straightening_shop_specific)'); they are not in `unit_cost` whatever the two flags say. A `by_design` reason (a part budget, a plan quota, a cancellation) is a configured limit, not a processing error.
costing_environment_idNoThe costing environment this was priced in: the machines, rates and overheads behind these numbers (list_environments names it).
inputs_changed_since_runNoNull when this price reflects every input on its part revision. Otherwise {roles, corrections, latest_at}: files attached and corrections applied to the part after the run read its inputs, which a new calculation reads and this one did not.
environment_changed_since_runNoNull when this price was computed on its costing environment as it stands. Otherwise {latest_at}: the environment was edited after the run read it, and a new calculation prices with the current setup while this result does not.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedOutput schema / properties / assembly_completeness / description
      Previous value: -"ASSEMBLIES ONLY. Whether `unit_cost` is a price or a LOWER BOUND. Carries {n_unique, n_priced, n_pending, n_unpriced, total_is_lower_bound, priced_complete, unpriced[], unpriced_steps[]}, where each unpriced entry has a closed-enum `reason_code`, a `by_design` flag and, where one exists, a `remedy`. `priced_complete` and `total_is_lower_bound` cover the COMPONENTS only (the BOM rows counted in n_unique): `priced_complete` is true when every component priced, and when `total_is_lower_bound` is true a component is missing, so `unit_cost` is a lower bound, not a complete price. `unpriced_steps` lists the assembly's own route steps that carry no price, with their reason, worded as get_process_plan words them (e.g. 'Straightening — unpriced (straightening_shop_specific)'); they are not in `unit_cost` whatever the two flags say. A `by_design` reason (a part budget, a plan quota, a cancellation) is a configured limit, not a processing error."New value: +"ASSEMBLIES ONLY. Whether `unit_cost` is a price or a LOWER BOUND. Carries {n_unique, n_priced, n_pending, n_unpriced, n_excluded, n_partial, total_is_lower_bound, priced_complete, unpriced[], partial[], unpriced_steps[]}, where each unpriced entry has a closed-enum `reason_code`, a `by_design` flag and, where one exists, a `remedy`. `priced_complete` and `total_is_lower_bound` cover the COMPONENTS only (the BOM rows counted in n_unique): `priced_complete` is true when every component priced, and when `total_is_lower_bound` is true a component is missing, so `unit_cost` is a lower bound, not a complete price. `unpriced_steps` lists the assembly's own route steps that carry no price, with their reason, worded as get_process_plan words them (e.g. 'Straightening — unpriced (straightening_shop_specific)'); they are not in `unit_cost` whatever the two flags say. A `by_design` reason (a part budget, a plan quota, a cancellation) is a configured limit, not a processing error."
    • addedOutput schema / properties / drawing_pairing
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": true,
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Whether the drawing sent with this calculation describes its model: {status (matched | suspect | mismatched | unverified), drawing_excluded, checks[{name, status}]}. When drawing_excluded is true the drawing describes another part and was left out — the price is the model's alone. Absent when no drawing was paired."
      +}
    • changedOutput schema / properties / material_source / description
      Previous value: -"Where material_priced came from: 'request', 'drawing_title_block' (the part's drawing), 'step_material_property' (the material its STEP file names), 'assembly_drawing_title_block' or 'environment_default'. The first that names a material wins, in that order: request, drawing, STEP file, environment default."New value: +"Where material_priced came from: 'request', 'drawing_title_block' (the part's drawing), 'step_material_property' (the material its STEP file names), 'assembly_parts_list' (the assembly drawing's parts-list row naming the component), 'assembly_drawing_title_block', 'assembly_parts_list_dominant' (the grade most of that list's made rows name, inferred for a component no row names) or 'environment_default'. The first that names a material wins, in that order: request, drawing, parts-list row, assembly drawing or dominant grade, STEP file, environment default."
    • addedOutput schema / properties / price_completeness
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "complete",
      +        "partial"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "'partial' when `unpriced` lists work the price leaves out — then unit_cost is a LOWER BOUND for the drawing, not a price for it; 'complete' when the price covers everything. Absent on a calculation from before the contract and on one without a price."
      +}
    • changedOutput schema / properties / unpriced / anyOf
      Previous value: -[
      -  {
      -    "items": {
      -      "description": "Work the drawing requires that no machine here can do.",
      -      "properties": {
      -        "process": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "The manufacturing process, in plain words."
      -        },
      -        "reason": {
      -          "anyOf": [
      -            {
      -              "type": "string"
      -            },
      -            {
      -              "type": "null"
      -            }
      -          ],
      -          "default": null,
      -          "description": "Why this work is not in the price."
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "items": {
      +      "description": "Work the drawing requires that no machine here can do — one gap of a\npartial price, in words and as the codes an agent acts on.",
      +      "properties": {
      +        "disabled_capable_machines": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "additionalProperties": true,
      +                "type": "object"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "Switched-off machines of this environment that could do the work ({name, machine_class})."
      +        },
      +        "feature_count": {
      +          "anyOf": [
      +            {
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "Features the work covers."
      +        },
      +        "process": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "The manufacturing process, in plain words."
      +        },
      +        "process_class": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "Stable code for the process; `process` is its label."
      +        },
      +        "reason": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "Why this work is not in the price."
      +        },
      +        "remedies": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "What would put this work into the price, as codes in the order to try them: enable_machine (a switched-off machine here can do it — see disabled_capable_machines), add_machine_class, relax_callout, subcontract; on an assembly's welding, attach_weld_drawing and confirm_weld_scope."
      +        },
      +        "requirement": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": true,
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "The callout left out ({kind, value, unit, and gdt_kind naming a gdt callout's characteristic}) when the gap is a requirement rather than a process."
      +        },
      +        "review_code": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "The review reason this gap twins."
      +        },
      +        "violation": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ],
      +          "default": null,
      +          "description": "Stable code for the requirement the closest machine failed."
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "type": "array"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed12 schema fields changed
    • addedInput schema / properties / calculation_id / format
      Added value: +"uuid"
    • changedInput schema / properties / detail / description
      Previous value: -"How many cost drivers to list: 'concise' (the default) lists the top 3, 'detailed' the top 10."New value: +"How many cost drivers to list: 'concise' (the default) lists the top 3 cost categories and the top 3 features (an assembly's top 3 rows), 'detailed' the top 10."
    • addedOutput schema / properties / clampings
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "description": "How many times one machine clamps the part.",
      +        "properties": {
      +          "count": {
      +            "anyOf": [
      +              {
      +                "type": "integer"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "default": null,
      +            "description": "Clampings on that machine — the count its handling was costed on."
      +          },
      +          "machine": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "default": null,
      +            "description": "Machine / work centre, by the name it is known by."
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "How many times each machine on the route clamps the part, in route order — the same count the route was costed on. Absent when the route did not state a count."
      +}
    • addedOutput schema / properties / material_priced
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "The material this calculation was priced as, by its short name — the environment's default material when material_resolved is false. On an assembly whose components name their own materials, each one, comma-separated."
      +}
    • addedOutput schema / properties / material_source
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Where material_priced came from: 'request', 'drawing_title_block' (the part's drawing), 'step_material_property' (the material its STEP file names), 'assembly_drawing_title_block' or 'environment_default'. The first that names a material wins, in that order: request, drawing, STEP file, environment default."
      +}
    • changedOutput schema / properties / top_drivers / description
      Previous value: -"What drives the cost, largest first: a part's features (pocket, hole, slot), or an assembly's components and its own joining. 3 drivers, or 10 with detail 'detailed'."New value: +"What drives the cost, largest first. On a part: the cost categories first (setup, subcontract, material, machine …), each with its cost and its share of unit_cost, and an 'other' row with the categories not listed, so these rows add up to unit_cost; then the features (pocket, hole, slot), which split the run-time categories (machine, labour, finishing) and so are part of those rows, never added to them. A part with no machined features (a flat pattern) lists the categories alone; one priced before the cost sheet existed, the features alone. On an assembly: its components and its own joining. The top 3 categories and the top 3 features (an assembly's top 3 rows), or 10 with detail 'detailed'."
    • addedOutput schema / properties / top_drivers / items / properties / category
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Set on a cost-category row: its key in cost_categories (setup, subcontract, material, machine …), or 'other' on the row that holds every category not listed. Absent on a feature or component row."
      +}
    • changedOutput schema / properties / top_drivers / items / properties / cost / description
      Previous value: -"Cost contribution per unit, in the calculation's currency (the result's `currency`) — the DIRECT run-time cost the feature consumes (machine, labour and finishing time), before any setup, programming, tooling or overhead is spread onto it. The tenant's cost-driver card can show the same rows fully loaded, so its per-feature figure is higher than this by one uniform factor; the ranking and the relative shares are identical on both bases."New value: +"Cost contribution per unit, in the calculation's currency (the result's `currency`). On a cost-category row it is that line of the cost sheet. On a feature row it is the DIRECT run-time cost the feature consumes (machine, labour and finishing time), before any setup, programming, tooling or overhead is spread onto it. The tenant's cost-driver card can show the feature rows fully loaded, so its per-feature figure is higher than this by one uniform factor; the ranking and the relative shares are identical on both bases."
    • changedOutput schema / properties / top_drivers / items / properties / cost_share_pct / description
      Previous value: -"Share of unit cost, 0–100, on the same direct basis as cost. Sum the listed rows against attributed_cost_share_pct, not against 100."New value: +"Share of unit cost, 0–100, on the same basis as cost. The category rows, 'other' included, add up to 100. The feature rows add up to the share the named features explain (attributed_cost_share_pct where the result states it), not to 100."
    • changedOutput schema / properties / top_drivers / items / properties / rank / description
      Previous value: -"1 = the largest driver."New value: +"1 = the largest driver. Cost categories and features are ranked separately; null on the row that holds the categories not listed."
    • changedOutput schema / properties / unit_cost / description
      Previous value: -"Unit cost per part: direct cost plus overhead_var and overhead_fixed. Where the costing environment states no Material-/Fertigungsgemeinkosten, overhead_var is the flat variable overhead (platform default 15 % of direct cost); once it states them, that default is 0 and those overheads sit above unit_cost as cost-sheet rungs, with administration and selling, margin and the other surcharges. Not the price to quote: that is offer_price, equal to unit_cost only where no surcharges are stated."New value: +"Unit cost per part: direct cost plus overhead_var and overhead_fixed. Where the costing environment states no Material-/Fertigungsgemeinkosten, overhead_var is the flat variable overhead the environment states (none by default); once it states them, those overheads sit above unit_cost as cost-sheet rungs, with administration and selling, margin and the other surcharges. Not the price to quote: that is offer_price, equal to unit_cost only where no surcharges are stated."
    • addedOutput schema / properties / unpriced
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "description": "Work the drawing requires that no machine here can do.",
      +        "properties": {
      +          "process": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "default": null,
      +            "description": "The manufacturing process, in plain words."
      +          },
      +          "reason": {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "default": null,
      +            "description": "Why this work is not in the price."
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Work the drawing requires that no machine in this environment can do, so it is not in the price. Each entry names the process and why. Absent when the route covers what the drawing asks for."
      +}
  3. Changed2 schema fields changed
    • changedOutput schema / properties / assembly_completeness / description
      Previous value: -"ASSEMBLIES ONLY. Whether `unit_cost` is a price or a LOWER BOUND. Carries {n_unique, n_priced, n_pending, n_unpriced, total_is_lower_bound, priced_complete, unpriced[]}, where each unpriced entry has a closed-enum `reason_code`, a `by_design` flag and, where one exists, a `remedy`. When `total_is_lower_bound` is true, `unit_cost` is a lower bound, not a complete price. A `by_design` reason (a part budget, a plan quota, a cancellation) is a configured limit, not a processing error."New value: +"ASSEMBLIES ONLY. Whether `unit_cost` is a price or a LOWER BOUND. Carries {n_unique, n_priced, n_pending, n_unpriced, total_is_lower_bound, priced_complete, unpriced[], unpriced_steps[]}, where each unpriced entry has a closed-enum `reason_code`, a `by_design` flag and, where one exists, a `remedy`. `priced_complete` and `total_is_lower_bound` cover the COMPONENTS only (the BOM rows counted in n_unique): `priced_complete` is true when every component priced, and when `total_is_lower_bound` is true a component is missing, so `unit_cost` is a lower bound, not a complete price. `unpriced_steps` lists the assembly's own route steps that carry no price, with their reason, worded as get_process_plan words them (e.g. 'Straightening — unpriced (straightening_shop_specific)'); they are not in `unit_cost` whatever the two flags say. A `by_design` reason (a part budget, a plan quota, a cancellation) is a configured limit, not a processing error."
    • changedOutput schema / properties / cost_categories / description
      Previous value: -"The cost sheet's own buckets per unit (material, setup, machine, labour, programming, tooling, finishing, overheads …) in the quote's currency — exactly the lines the product shows, setup as its own line. Absent on calculations priced before the sheet existed."New value: +"The cost sheet's own buckets per unit (material, setup, machine, labour, programming, tooling, finishing, overheads …) in the quote's currency — exactly the lines the product shows, setup as its own line. On an assembly: its roll-up terms (components_cost, joining_cost, …) and the cost-sheet rungs above them, the same map get_cost_breakdown states, adding up to offer_price. Absent on calculations priced before the sheet existed."
  4. Changed4 schema fields changed
    • addedInput schema / properties / calculation_id / description
      Added value: +"Id of a calculation, as upload_and_quote, quote_part or list_calculations return it."
    • addedInput schema / properties / detail / description
      Added value: +"How many cost drivers to list: 'concise' (the default) lists the top 3, 'detailed' the top 10."
    • changedOutput schema / properties / costing_environment_id / description
      Previous value: -"The costing environment this was priced in. get_cost_factors takes it and reads the adjustable factors behind these numbers, their range and where each one is saved."New value: +"The costing environment this was priced in: the machines, rates and overheads behind these numbers (list_environments names it)."
    • addedOutput schema / properties / top_drivers / description
      Added value: +"What drives the cost, largest first: a part's features (pocket, hole, slot), or an assembly's components and its own joining. 3 drivers, or 10 with detail 'detailed'."
  5. Changed2 schema fields changed
    • changedOutput schema / properties / costing_environment_id / description
      Previous value: -"The costing environment this was priced in — pass it to get_cost_factors to read the adjustable factors behind these numbers, their range and where each one is saved."New value: +"The costing environment this was priced in. get_cost_factors takes it and reads the adjustable factors behind these numbers, their range and where each one is saved."
    • changedOutput schema / properties / coverage / description
      Previous value: -"Present only when status is 'blocked': the calc was created but NOT run because the organization is out of included calculations, has reached a monthly overage cap, or is payment-blocked. Carries {reason, message, remaining, used, included, upgrade_url} — 'reason' says which, and 'message' says how to unblock it. Resolve that, then re-run the saved part. Never a 402; the part is not lost."New value: +"Present only when status is 'blocked': the calculation was created but not run because the organization has no included calculations left, has reached its monthly overage cap, or has its billing paused. Carries {reason, message, remaining, used, included, tier_slug, window}: 'reason' says which, 'message' states it in a sentence. The part is saved; a later calculation of it runs once the block is lifted. Never a 402."
  6. Changed2 schema fields changed
    • changedOutput schema / properties / confidence / anyOf
      Previous value: -[
      -  {
      -    "description": "Quote-trust headline — is this number calibrated to the shop, or a model\nestimate? The signal a procurement / supplier persona reads alongside the\nprediction band before trusting a should-cost.",
      -    "properties": {
      -      "calibrated": {
      -        "anyOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "True when a calibration to your shop's actuals moved this price. Recorded when the calculation ran — the same flag the comparison tools report — so publishing or retiring a calibration later does not change it. Null on a calculation priced before the platform recorded this: unknown, not uncalibrated."
      -      },
      -      "headline": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "Trust headline: high | medium | low."
      -      },
      -      "state": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "default": null,
      -        "description": "green = calibrated to your actuals; grey = uncalibrated estimate with a prediction band; white = uncalibrated model estimate."
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "description": "Quote-trust headline — is this number calibrated to the shop, or a model\nestimate? The signal a procurement / supplier persona reads alongside the\nprediction band.",
      +    "properties": {
      +      "calibrated": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "True when a calibration to your shop's actuals moved this price. Recorded when the calculation ran — the same flag the comparison tools report — so publishing or retiring a calibration later does not change it. Null on a calculation priced before the platform recorded this: unknown, not uncalibrated."
      +      },
      +      "headline": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Trust headline: high | medium | low."
      +      },
      +      "state": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "green = calibrated to your actuals; grey = uncalibrated estimate with a prediction band; white = uncalibrated model estimate."
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / confidence / description
      Previous value: -"Quote-trust signal (calibrated vs model estimate) — read it with the band before trusting the number."New value: +"Quote-trust signal: calibrated to the shop, or a model estimate — read together with the prediction band."
  7. Added

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/destructive/idempotent, so the bar is met cheaply, but the description adds "free" (a quota/billing trait not present in annotations) and spells out the response contents in domain terms. The one gap is that it doesn't warn what happens on an unpriced or failed calculation, so it stops short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and well ordered (purpose, trigger, returns, alternatives), but the return-value enumeration is a long run-on sentence that restates what the output schema already declares. It is longer than the decision it supports requires.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, read-only reader with a full output schema and complete annotations, the description covers purpose, trigger condition, return semantics at a domain level, and sibling routing. Nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the enum's own description already explains concise (top 3 categories/features) vs detailed (top 10). The description only implies the default via "one short structured answer" and adds no syntax or edge-case guidance for calculation_id beyond what the schema states, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and object ("explain what a priced calculation costs and why") and immediately bounds the output shape ("one short structured answer"). It is clearly distinguishable from get_cost_breakdown (line items) and suggest_cost_savings (savings), both of which appear as siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit ordering rule ("Use it first once a calculation has succeeded") and names two siblings with the condition that selects each: get_cost_breakdown for itemised line items, get_calculation for a still-running calculation. Nothing about when-to-use is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.