{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/arcnm-io/json-schema/arcnm-io-calculation-detail-response-schema.json",
  "title": "CalculationDetailResponse",
  "description": "Full single-calculation view for ``GET /calculations/{id}``.\n\n``analytics`` is a free-form object whose keys are not part of the\nversioned contract. Cost/time outputs are ``None`` until the calc succeeds;\n``error`` is ``None`` unless the run failed.",
  "x-generated": "2026-11-01",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/arcnm-io-openapi.yml#/components/schemas/CalculationDetailResponse",
  "properties": {
    "id": {
      "type": "string",
      "title": "Id",
      "description": "UUID of the calculation."
    },
    "part_id": {
      "type": "string",
      "title": "Part Id",
      "description": "UUID of the part this calculation belongs to."
    },
    "part_revision_id": {
      "type": "string",
      "title": "Part Revision Id",
      "description": "UUID of the part revision that was priced."
    },
    "costing_environment_id": {
      "type": "string",
      "title": "Costing Environment Id",
      "description": "UUID of the costing environment used for pricing."
    },
    "derived_from_calculation_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Derived From Calculation Id",
      "description": "UUID of the calculation this one was re-run from (priced again after a drawing was attached, or from its results page); null on a first run. The re-run is its own calculation and this names what it supersedes."
    },
    "region": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Region",
      "description": "Region key used to price this calc; null when the environment's default region was used. Echoed so a recalculate preserves it instead of falling back to the environment default."
    },
    "dataset_link_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Dataset Link Id",
      "description": "UUID of the dataset link (source geometry / drawing set) this calculation used. Echoed so a recalculate reuses the same dataset instead of the environment default."
    },
    "material_is_provided": {
      "type": "boolean",
      "title": "Material Is Provided",
      "description": "True when the customer supplies the raw material (beigestellt) and the material cost line is zero. Echoed so a recalculate keeps it instead of billing the material.",
      "default": false
    },
    "nestable": {
      "type": "boolean",
      "title": "Nestable",
      "description": "Whether this calculation can join a job nest: a finished sheet-metal price, with its layout stored, on material the shop buys. False otherwise.",
      "default": false
    },
    "provided_stock_kind": {
      "type": "string",
      "enum": [
        "none",
        "near_net_profile",
        "near_net_casting",
        "sawn_blank"
      ],
      "title": "Provided Stock Kind",
      "description": "Shape of the customer-supplied stock; 'none' when the material is bought. Echoed so a recalculate keeps it.",
      "default": "none"
    },
    "surface_treatments": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Surface Treatments",
      "description": "Surface treatments stated when this calculation was created (only `POST /calculations/batch` accepts them); empty when none were. Part of its cache identity, not of its price."
    },
    "language": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Language",
      "description": "BCP 47 language this calculation's context was captured in. Echoed so a recalculate keeps it."
    },
    "stock_format_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Stock Format Id",
      "description": "The stock format this calculation was asked to be priced on — `stock_format_id` as requested, or kept from the calculation it re-runs — as the version current when it was created; null when none was asked for. Whether that format priced the part is in `analytics.pipeline_notes`: `stock_format_pin_unavailable` when it did not."
    },
    "full_stock_charge": {
      "type": "string",
      "title": "Full Stock Charge",
      "description": "The lot rule's override this calculation was priced under — `full_stock_charge` as requested, or kept from the calculation it re-runs: `auto` (the environment's threshold), `full`, `full_no_credit` or `share`. What the rule did at the ordered lot is `material_detail.lot_rule` on the cost sheet.",
      "default": "auto"
    },
    "stock_format_mm": {
      "anyOf": [
        {
          "$ref": "#/$defs/StockFormatMm"
        },
        {
          "type": "null"
        }
      ],
      "description": "The sheet size this calculation was asked to be priced on — `stock_format_mm` as requested, or kept from the calculation it re-runs; null when none was stated."
    },
    "nest_item_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Nest Item Id",
      "description": "The job-nest line this calculation's material was priced on — `nest_item_id` as requested, or kept from the calculation it re-runs; null when the part was priced on its own sheet. An assembly component priced on the sheets its assembly shares states it with the Nesting add-on only."
    },
    "nest_revision": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Nest Revision",
      "description": "The revision of that line's sheets this calculation reads: the one current when it was created, or its parent's on a re-run. A later revision of the job nest never changes it."
    },
    "status": {
      "type": "string",
      "title": "Status",
      "description": "Current lifecycle state: queued, running, succeeded, failed, cancelled, timed_out, or 'blocked' (created but not started — the org is out of included calculations; see ``coverage``)."
    },
    "coverage": {
      "anyOf": [
        {
          "$ref": "#/$defs/CalculationCoverage"
        },
        {
          "type": "null"
        }
      ],
      "description": "Populated only when ``status='blocked'``: why the calc is parked and how to resume it after topping up. ``null`` for every other state. Surfaced as a typed field (not just inside ``analytics``) so API/MCP clients see it without the analytics allow-list stripping it."
    },
    "engine": {
      "type": "string",
      "title": "Engine",
      "description": "Pricing engine used for this calculation."
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Name",
      "description": "Human-readable label for the calculation."
    },
    "lot_size": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Lot Size",
      "description": "Number of identical parts produced per batch."
    },
    "annual_volume": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Annual Volume",
      "description": "Expected yearly quantity used to amortize setup cost."
    },
    "currency": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Currency",
      "description": "ISO 4217 currency code for the cost figures."
    },
    "material_grade_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Material Grade Id",
      "description": "UUID of the linked material grade; null when no grade is set."
    },
    "material_ref": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Material Ref",
      "description": "Material reference (URN) of the linked grade; null when no grade is set."
    },
    "unit_cost": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Unit Cost",
      "description": "Unit cost per part in the quote's currency: direct cost plus the variable and fixed overhead per part. Where the environment states no Material-/Fertigungsgemeinkosten the variable overhead is the flat one 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. Null until pricing completes. The headline price is analytics.offer_price — equal to unit_cost where the environment states no surcharges, the figure the comparison ranks on and the list returns as offer_price and sorts on with sort=offer_price."
    },
    "total_cost": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Total Cost",
      "description": "unit_cost for the full lot (unit_cost x lot_size) in the quote's currency, on the same basis as unit_cost; null until pricing completes. The lot at the offer price is analytics.offer_price x lot_size."
    },
    "setup_cost": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Setup Cost",
      "description": "One-time setup cost of the lot in the quote's currency: the cost sheet's setup line times the lot size, on the same basis as unit_cost, below the cost-sheet rungs; null until pricing completes."
    },
    "unit_time_s": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Unit Time S",
      "description": "Production time per part in seconds, including per-part shares of programming and inspection but excluding the one-time lot setup; null until pricing completes."
    },
    "total_time_s": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Total Time S",
      "description": "Total production time for the lot in seconds: one-time setup plus lot size × per-part time; null until pricing completes."
    },
    "offer_price": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "title": "Offer Price",
      "description": "The headline price per part: the offer price, or unit_cost where the run states none; null until priced and on an assembly priced only in part. The same figure the list row returns as offer_price."
    },
    "attempt_count": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Attempt Count",
      "description": "Real execution attempts consumed (retry budget usage), as on the list row."
    },
    "max_attempts": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Max Attempts",
      "description": "Retry budget for this row; retries 409 once exhausted. As on the list row."
    },
    "analytics": {
      "anyOf": [
        {
          "$ref": "#/$defs/PublicCalculationAnalytics"
        },
        {
          "type": "null"
        }
      ],
      "title": "Analytics",
      "description": "Cost breakdown and value-engineering detail for a priced calculation; null until the calculation succeeds."
    },
    "error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Error",
      "description": "Failure message; null unless the run failed."
    },
    "needs_human_review": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Needs Human Review",
      "description": "True when the analysis flagged this calculation for human review (low confidence, prompt-injection suspicion, or conflicting sources); surfaced at the top level so API consumers can gate on it."
    },
    "review_reasons": {
      "anyOf": [
        {
          "items": {
            "type": "string"
          },
          "type": "array"
        },
        {
          "type": "null"
        }
      ],
      "title": "Review Reasons",
      "description": "Plain-language reasons the calculation was flagged for review; empty when not flagged."
    },
    "confidence": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "title": "Confidence",
      "description": "Quote-trust signal: {state: green|grey|white, headline: high|medium|low, reason_code, calibrated}. Green = a calibration to your actuals moved this price; grey = uncalibrated estimate with a prediction band; white = uncalibrated model estimate. Recorded when the calculation ran: publishing or retiring a calibration later does not change it (re-run to price under the current one). calibrated is null on a calculation priced before the platform recorded this — unknown, the same verdict the comparison states for it. Null until the calc is priced."
    },
    "started_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Started At",
      "description": "ISO 8601 timestamp when the run started; null before it begins. A calculation answered from an identical earlier one (not charged again) states when it was answered: its figures are that one's, priced from the same files, corrections and environment."
    },
    "finished_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Finished At",
      "description": "ISO 8601 timestamp when the run finished; null before it completes."
    },
    "created_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Created At",
      "description": "ISO 8601 timestamp when the calculation was created."
    },
    "assembly_role": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Assembly Role",
      "description": "'assembly' on a decomposed multi-part calculation, 'component' on one of its priced parts, null on an ordinary single part."
    },
    "parent_calculation_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Parent Calculation Id",
      "description": "For a component: the assembly calculation it belongs to."
    },
    "assembly_state": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Assembly State",
      "description": "Assembly roll-up progress state; null on a single part."
    },
    "price_completeness": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Price Completeness",
      "description": "'partial' when the price leaves out work the drawing asks for — then unit_cost is a lower bound and analytics.process_plan.unpriced lists the work with its remedies; 'complete' when the price covers everything; null on a calculation from before the contract and on one without a price."
    },
    "assembly_context": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "title": "Assembly Context",
      "description": "For a component: its key in the bill of materials (`component_key`), its position, quantity per assembly, effective lot, cost share and a link back to the assembly. Null otherwise."
    },
    "inputs_changed_since_run": {
      "anyOf": [
        {
          "$ref": "#/$defs/InputsChangedSinceRun"
        },
        {
          "type": "null"
        }
      ],
      "description": "Null when this result reflects every input on its part revision. Otherwise the roles (drawing_2d, mesh, rfq_text) whose active file was attached after the run read its inputs, and the number of corrections applied to the part since — the next run reads them, this result does not."
    },
    "environment_changed_since_run": {
      "anyOf": [
        {
          "$ref": "#/$defs/EnvironmentChangedSinceRun"
        },
        {
          "type": "null"
        }
      ],
      "description": "Null when this result was priced on its costing environment as it stands. Otherwise the environment was edited after this run read it (`latest_at`); the edit may or may not move the price — a new calculation prices with the current setup, this result does not."
    }
  },
  "type": "object",
  "required": [
    "id",
    "part_id",
    "part_revision_id",
    "costing_environment_id",
    "status",
    "engine"
  ],
  "$defs": {
    "CalculationCoverage": {
      "properties": {
        "reason": {
          "type": "string",
          "title": "Reason",
          "description": "Machine code for the block: 'quota_exhausted' (no included calculations left and this plan cannot bill overage) | 'payment_method_required' (included volume used; add a card to continue at the overage rate) | 'wallet_empty' (included volume used and the prepaid balance cannot cover the next calculation) | 'past_due' (billing suspended) | 'spend_cap' (the calling API key's monthly overage cap is reached) | 'org_spend_cap' (the organization's monthly overage cap is reached) | 'run_spend_cap' (it would cost more past the plan's included calculations than the run's own max_overage_cents allows)."
        },
        "message": {
          "type": "string",
          "title": "Message",
          "description": "Human-readable, surface-ready explanation of the block and the fix."
        },
        "remaining": {
          "type": "integer",
          "title": "Remaining",
          "description": "Calculations still available before this block lifts: the included volume left in the window (0 when parked on quota). Sizing a batch on this number is always correct."
        },
        "used": {
          "type": "integer",
          "title": "Used",
          "description": "Calculations used in the current window."
        },
        "included": {
          "type": "integer",
          "title": "Included",
          "description": "Calculations included for the current window: the plan's volume plus any carried-over and granted extras, so included - used = remaining while the included volume lasts."
        },
        "tier_slug": {
          "type": "string",
          "title": "Tier Slug",
          "description": "The organization's current plan slug."
        },
        "window": {
          "type": "string",
          "title": "Window",
          "description": "Quota window the counts refer to: 'month' | 'year'."
        },
        "upgrade_url": {
          "type": "string",
          "title": "Upgrade Url",
          "description": "Where to go to unblock the parked calculations. Resolved per reason: the wallet page when funding is what is missing, the billing page when a plan, a cap or a payment needs attention."
        }
      },
      "type": "object",
      "required": [
        "reason",
        "message",
        "remaining",
        "used",
        "included",
        "tier_slug",
        "window",
        "upgrade_url"
      ],
      "title": "CalculationCoverage",
      "description": "Why a calculation is parked (``status='blocked'``) and how to unblock it.\n\nPresent on submit responses whenever a calc could NOT be started because the\norg has no included calculations left this window (or a failed subscription\npayment / an API-key spend cap blocks it). Carries the exact numbers a UI,\nAPI, or MCP client needs to tell the user how many parts can still run and\nwhat to do — instead of a bare 402. ``null`` on the happy (enqueued) path."
    },
    "EnvironmentChangedSinceRun": {
      "properties": {
        "latest_at": {
          "type": "string",
          "title": "Latest At",
          "description": "ISO 8601 timestamp of the latest change to the costing environment."
        }
      },
      "type": "object",
      "required": [
        "latest_at"
      ],
      "title": "EnvironmentChangedSinceRun",
      "description": "The costing environment changed AFTER this run read it."
    },
    "InputsChangedSinceRun": {
      "properties": {
        "roles": {
          "items": {
            "type": "string"
          },
          "type": "array",
          "title": "Roles",
          "description": "Roles whose active file post-dates the run: drawing_2d, mesh or rfq_text. The next run reads them; this one did not. Empty when only corrections changed."
        },
        "latest_at": {
          "type": "string",
          "title": "Latest At",
          "description": "ISO 8601 timestamp of the newest such file or correction."
        },
        "corrections": {
          "type": "integer",
          "title": "Corrections",
          "description": "Corrections applied to the part revision's recognised geometry after this run read its inputs, whichever way they were applied. The next run prices the corrected part; this one did not. 0 when only files changed.",
          "default": 0
        }
      },
      "type": "object",
      "required": [
        "roles",
        "latest_at"
      ],
      "title": "InputsChangedSinceRun",
      "description": "Inputs added to the priced revision AFTER this run read them. On an\nassembly, its components' changes count as its own: their roles join\nthe assembly's, ``latest_at`` is the newest of them, and\n``corrections`` is the sum of the components' corrections."
    },
    "PublicAllowanceDerivation": {
      "description": "The two allowances behind the per-unit allowance factor.",
      "properties": {
        "verteilzeit_pct": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Distribution allowance — the interruptions a working hour contains, as a fraction."
        },
        "erholzeit_pct": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Recovery allowance, as a fraction."
        },
        "npf": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The factor the two compose to (multiplicatively), applied to the operator's recurring per-unit time. Machine-occupying time carries the Verteilzeit alone.",
          "title": "Npf"
        }
      },
      "title": "PublicAllowanceDerivation",
      "type": "object"
    },
    "PublicAssembly": {
      "description": "The assembly view: composition, per-component pricing (BOM), the\nroll-up identity and the assembly route.",
      "properties": {
        "n_occurrences": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of placed parts in the assembly.",
          "title": "N Occurrences"
        },
        "n_unique": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of unique parts.",
          "title": "N Unique"
        },
        "n_sub_assemblies": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Sub-assembly nodes the CAD file states below the root (0 on a flat file).",
          "title": "N Sub Assemblies"
        },
        "n_priced": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Unique parts priced (fan-out is capped).",
          "title": "N Priced"
        },
        "capped": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when the fan-out cap truncated pricing.",
          "title": "Capped"
        },
        "lot_size": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Assembly lot size.",
          "title": "Lot Size"
        },
        "rollup": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAssemblyRollup"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "bom": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicAssemblyBomRow"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Bom"
        },
        "route": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicAssemblyRouteStep"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Route"
        },
        "completeness": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAssemblyCompleteness"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "unpriced": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicUnpricedWork"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The assembly's own work the price leaves out — welding no weld symbol or joint shows — each with why and the remedies that put it in. Absent when the assembly's own work is priced.",
          "title": "Unpriced"
        },
        "price_completeness": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "``partial`` when ``unpriced`` lists the assembly's own work the price leaves out — then the total is a lower bound. Absent otherwise.",
          "title": "Price Completeness"
        }
      },
      "title": "PublicAssembly",
      "type": "object"
    },
    "PublicAssemblyBomRow": {
      "description": "One unique component of the assembly with its priced contribution.",
      "properties": {
        "position": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "BOM position number.",
          "title": "Position"
        },
        "label": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Component name.",
          "title": "Label"
        },
        "part_number": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The component's part number (Sachnummer), from `part_number_source`. Null when the CAD file states none.",
          "title": "Part Number"
        },
        "part_number_source": {
          "anyOf": [
            {
              "enum": [
                "drawing_part_number",
                "step_product_id",
                "drawing_number",
                "file_stem"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Where `part_number` comes from: `step_product_id` (the CAD file's product id), `drawing_part_number` or `drawing_number` (its paired drawing), or `file_stem` (the file name).",
          "title": "Part Number Source"
        },
        "designation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The component's designation (Benennung): the CAD file's description, else its name where that is one a person gave.",
          "title": "Designation"
        },
        "qty_per": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Occurrences per assembly.",
          "title": "Qty Per"
        },
        "scrap_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Scrap fraction added to this component's lot (0..1).",
          "title": "Scrap Pct"
        },
        "effective_lot": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The lot this component was actually priced at (assembly lot × quantity per assembly × (1 + scrap), rounded up).",
          "title": "Effective Lot"
        },
        "unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Component unit cost at its effective lot, as the assembly charges it: the component's own price less any treatment the assembly's order covers (treatments_covered).",
          "title": "Unit Cost"
        },
        "extended_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Contribution to ONE assembly (qty × unit cost).",
          "title": "Extended Cost"
        },
        "treatments_covered": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicAssemblyCoveredTreatment"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Treatments this component's drawing states that the assembly's identical order on the joined body covers. Absent when none.",
          "title": "Treatments Covered"
        },
        "cost_share": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Share of the priced component total (0..1).",
          "title": "Cost Share"
        },
        "unit_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "This component's time per piece, in seconds.",
          "title": "Unit Time S"
        },
        "status": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "succeeded | failed | capped | queued | running | purchased (a bought component).",
          "title": "Status"
        },
        "child_calculation_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The component's own calculation; none for a bought component — nothing is manufactured.",
          "title": "Child Calculation Id"
        },
        "machine_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Primary machine the component was priced on.",
          "title": "Machine Name"
        },
        "needs_human_review": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The component quote carries review reasons.",
          "title": "Needs Human Review"
        },
        "assembly_path": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The sub-assembly nodes above this component in the CAD file's own product structure, outermost first; empty at the top level.",
          "title": "Assembly Path"
        },
        "standard_part": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAssemblyStandardPart"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Set when the CAD names this body as a bought part with a pricing role (a bolt, nut or washer by standard number or noun, a rivet, a rivet nut …)."
        },
        "procurement": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAssemblyProcurement"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Made or bought as the CAD file states it, and on what basis. A bought component is never priced as a machined part."
        },
        "sourcing": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How the component is costed: `make` (its own calculation), `catalogue` (a catalogue part at its purchase price) or `excluded` (taken out of this calculation — no price and no gap in the total). The component override where set, else `procurement.decision`.",
          "title": "Sourcing"
        },
        "purchased_assembly": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAssemblyPurchasedAssembly"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Set when the row is a sub-assembly bought as one unit."
        },
        "price_source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Where a catalogue part's price came from: `tenant_catalogue` (the override's price), `customer_supplied` (a stated price of 0: the customer's part, installed here) or `platform_fastener_catalogue` (the platform's sourced catalogue line for the part's role at its size).",
          "title": "Price Source"
        },
        "price_notes": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Closed codes qualifying a catalogue price: `standard_part_size_unknown_priced_at_reference`, `fastener_size_outside_price_anchors`, `catalogue_wheel_finishing_unpriced`.",
          "title": "Price Notes"
        }
      },
      "title": "PublicAssemblyBomRow",
      "type": "object"
    },
    "PublicAssemblyCompleteness": {
      "description": "Is the assembly total a price or a lower bound — and why. The same\nderivation the BOM endpoint and the MCP breakdown read, so the three\ncannot disagree; an agent reading only this payload can tell a\ndisclosed limit from a gap without parsing prose.",
      "properties": {
        "n_unique": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Unique components.",
          "title": "N Unique"
        },
        "n_priced": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Components with a price.",
          "title": "N Priced"
        },
        "n_pending": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Components still being priced.",
          "title": "N Pending"
        },
        "n_unpriced": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Components that settled without a price.",
          "title": "N Unpriced"
        },
        "n_excluded": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Components taken out of this calculation: in the bill of materials, not in the total, and no gap in it.",
          "title": "N Excluded"
        },
        "total_is_lower_bound": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True whenever anything is missing from the total — by design or not. A number to qualify, never to quote as a price.",
          "title": "Total Is Lower Bound"
        },
        "priced_complete": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Every component priced: the roll-up is the price.",
          "title": "Priced Complete"
        },
        "n_partial": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Priced components whose own price is partial; each makes the total a lower bound even when every component priced.",
          "title": "N Partial"
        },
        "unpriced": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicAssemblyUnpricedComponent"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Unpriced"
        },
        "partial": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicAssemblyPartialComponent"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Partial"
        }
      },
      "title": "PublicAssemblyCompleteness",
      "type": "object"
    },
    "PublicAssemblyCoveredTreatment": {
      "description": "A treatment the component's drawing states that the assembly's own\norder covers — the assembly drawing states the identical treatment, and\nit is performed once, on the joined body.",
      "properties": {
        "family": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Treatment family: coating or heat_treatment.",
          "title": "Family"
        },
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The treatment (e.g. powder_coat, stress_relieve).",
          "title": "Kind"
        },
        "stage": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Where the process route performs it: joined_body — on the assembly, after joining.",
          "title": "Stage"
        },
        "covered_by": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "covered_by_assembly_order: the assembly's own order for the identical treatment is the one charge.",
          "title": "Covered By"
        },
        "cost_per_part": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What left this component's contribution, per component, in the calculation's currency: the treatment's work and its share of the order's minimum and fee. The component's own calculation keeps its price; unit_cost on the row is that price less these amounts.",
          "title": "Cost Per Part"
        }
      },
      "title": "PublicAssemblyCoveredTreatment",
      "type": "object"
    },
    "PublicAssemblyPartialComponent": {
      "description": "A component priced in part: its own ``routing.unpriced`` lists the\nwork its price leaves out.",
      "properties": {
        "position": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "BOM position number.",
          "title": "Position"
        },
        "label": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Component name.",
          "title": "Label"
        }
      },
      "title": "PublicAssemblyPartialComponent",
      "type": "object"
    },
    "PublicAssemblyProcurement": {
      "description": "Whether a component is made to drawing or a catalogue part, as its CAD\nfile states it — read from its names, its shape and the file's product\nstructure. The component override outranks it (`sourcing` on the row is\nhow the component is costed now).",
      "properties": {
        "decision": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "`make`: costed from its geometry along a manufacturing route. `buy`: a catalogue part, priced at its purchase price and never routed.",
          "title": "Decision"
        },
        "basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What decided it. Closed enum: standard_number, designation, supplier, film_geometry, purchased_assembly, step_make_or_buy, make_designation, semi_finished_standard, no_evidence.",
          "title": "Basis"
        },
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "For a bought component: standard_part, catalogue_part or purchased_assembly.",
          "title": "Kind"
        },
        "category": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "For a bought component: fastener, rivet, threaded_insert, pin_key_ring, bearing, seal, spring_damper, drive, fluid, electrical, operating, marking, glazing, other.",
          "title": "Category"
        },
        "standard": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The product standard its name states, e.g. `ISO 4017`.",
          "title": "Standard"
        },
        "nominal_m": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Metric thread size its name states (`M8` → 8).",
          "title": "Nominal M"
        }
      },
      "title": "PublicAssemblyProcurement",
      "type": "object"
    },
    "PublicAssemblyPurchasedAssembly": {
      "description": "A sub-assembly bought as one unit: one row for all the parts it holds.",
      "properties": {
        "n_parts": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Bodies in one unit.",
          "title": "N Parts"
        }
      },
      "title": "PublicAssemblyPurchasedAssembly",
      "type": "object"
    },
    "PublicAssemblyRollup": {
      "description": "The assembly cost identity, term by term, as shown: components +\njoining + assembly ops + amortised setup + variable overhead + fixed\noverhead + rounding = unit cost.",
      "properties": {
        "n": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Assembly lot size.",
          "title": "N"
        },
        "components_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Sum of component extended costs per assembly.",
          "title": "Components Cost"
        },
        "joining_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Joining (welding) cost per assembly.",
          "title": "Joining Cost"
        },
        "ops_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Assembly-level operations (heat treatment, coating, marking).",
          "title": "Ops Cost"
        },
        "setup_cost_amortised": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per-lot fixed cost divided by the lot size.",
          "title": "Setup Cost Amortised"
        },
        "overhead": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Overhead on the assembly's own value added.",
          "title": "Overhead"
        },
        "overhead_fixed": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Fixed overhead absorbed once per assembly, outside the value-added base the variable rate applies to.",
          "title": "Overhead Fixed"
        },
        "rounding": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the terms above, each rounded once, leave of the unit cost rounded once: one explicit line, so the terms add up to the unit cost without moving it. 0 when they already do.",
          "title": "Rounding"
        },
        "unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cost per assembly.",
          "title": "Unit Cost"
        },
        "total_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cost for the lot.",
          "title": "Total Cost"
        },
        "priced_complete": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "False when one or more components could not be priced.",
          "title": "Priced Complete"
        },
        "components_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Σ component unit times per assembly, in seconds.",
          "title": "Components Time S"
        },
        "own_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The assembly's own work per unit — fixturing, tacking, joining, fastening — in seconds.",
          "title": "Own Time S"
        },
        "unit_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Time per assembly in seconds: components + own work.",
          "title": "Unit Time S"
        },
        "total_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Time for the lot in seconds.",
          "title": "Total Time S"
        }
      },
      "title": "PublicAssemblyRollup",
      "type": "object"
    },
    "PublicAssemblyRouteStep": {
      "description": "One step of the assembly route — the work on the joined body only.\n\nSteps that exist but are unpriced are shown as such, never omitted.",
      "properties": {
        "key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Step (fixture, tack, join, straighten, stress_relieve, post_join_machining, surface_treatment, inspection).",
          "title": "Key"
        },
        "din_group": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "DIN 8580 group.",
          "title": "Din Group"
        },
        "din_codes": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "DIN 8580 / DIN 8593 process codes for this step (e.g. 4.1, 4.3), for a routing sheet. A step can span several. An empty list means the standard numbers no process for it (inspection, straightening, fixture preparation) or the step is not that process here (an unwelded assembly's tack and join). Null means the route was computed before this field existed.",
          "title": "Din Codes"
        },
        "priced": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether this step carries a computed cost.",
          "title": "Priced"
        },
        "cost_per_unit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cost per assembly for this step.",
          "title": "Cost Per Unit"
        },
        "lot_minimum_eur": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per-order minimum charged once per lot.",
          "title": "Lot Minimum Eur"
        },
        "rank": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Technological order of the step within the route (ascending).",
          "title": "Rank"
        },
        "time_s_per_unit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "In-house seconds this step takes per assembly (fixturing, tacking, fastening). Null on a bought-in step — a vendor line is priced per order, not in seconds — and on an unpriced step.",
          "title": "Time S Per Unit"
        },
        "disclosures": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Why an unpriced step is unpriced.",
          "title": "Disclosures"
        }
      },
      "title": "PublicAssemblyRouteStep",
      "type": "object"
    },
    "PublicAssemblyStandardPart": {
      "description": "What the component's CAD name says it is, when it names a bought part\nwith a pricing role (by standard number or noun).",
      "properties": {
        "role": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "bolt | nut | washer price from the platform's fastener line; every other role (rivet, lock_washer, rivet_nut, press_in_nut, weld_nut, weld_stud, bearing, retaining_ring, pin, key, …) carries no catalogue price: the component asks for its purchase price.",
          "title": "Role"
        },
        "standard": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Normalised standard number, e.g. `ISO 4032`.",
          "title": "Standard"
        },
        "nominal_m": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Metric nominal read off `M24` / `M8x30`.",
          "title": "Nominal M"
        }
      },
      "title": "PublicAssemblyStandardPart",
      "type": "object"
    },
    "PublicAssemblyUnpricedComponent": {
      "description": "One component of the assembly that carries no price, and why —\nthe closed ``reason_code`` enum a client may switch on, whether the\nplatform did this on purpose, and the remedy in the user's terms.\nThe engine's own measurement behind the decision stays first-party.",
      "properties": {
        "position": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "BOM position number.",
          "title": "Position"
        },
        "label": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Component name.",
          "title": "Label"
        },
        "reason_code": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Closed enum: `capped_by_capacity`, `quota_exhausted`, `run_spend_cap`, `cancelled`, `no_feasible_machine`, `unresolved_geometry`, `extraction_failed`.",
          "title": "Reason Code"
        },
        "by_design": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when this is the platform working as intended (a fan-out budget, a plan quota, a cancellation), never to be read as a defect.",
          "title": "By Design"
        },
        "remedy": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What would change the answer, in the user's terms.",
          "title": "Remedy"
        },
        "violation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "On no_feasible_machine: the requirement the closest machine failed, as a stable code.",
          "title": "Violation"
        },
        "remedy_code": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The remedy as a code a client localises: enable_machine, add_machine_class or relax_callout; null when none applies.",
          "title": "Remedy Code"
        }
      },
      "title": "PublicAssemblyUnpricedComponent",
      "type": "object"
    },
    "PublicAssumptions": {
      "description": "The named inputs this price was computed from.\n\nA should-cost is only as checkable as the inputs behind it. These are\nthe ones a quoter argues about — the wage, the stock price, whether\nscrap and remnants are credited against it, the machine, the lot\nsize, and the surcharges the environment states — read off the run\nthat produced the price, not re-derived. Money is in\n``rate_currency``, the currency the environment's rates are stated\nin; percentages are fractions (0.12 = 12 %).",
      "properties": {
        "rate_currency": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Currency the rates below are stated in.",
          "title": "Rate Currency"
        },
        "currency_factor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What every amount on this calculation was multiplied by to carry it from rate_currency into the calculation's currency; 1.0 when the two are the same. A cost-sheet line's amount is the arithmetic its label_params state — mass x price per kilogram, a charge per lot shared over the lot, time x rate — times this factor, and times the calibration the line was charged at on a calibrated environment. Absent where the conversion cannot be recovered from the calculation.",
          "title": "Currency Factor"
        },
        "labour_rate_per_hour": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Labour rate charged, per hour.",
          "title": "Labour Rate Per Hour"
        },
        "labour_rate_source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "'environment_rate_row' when a rate you entered supplied the wage; 'environment_default' when the environment's own setting did.",
          "title": "Labour Rate Source"
        },
        "machine_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machine the part was priced on.",
          "title": "Machine Name"
        },
        "machine_klass": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Class slug of that machine, e.g. milling.3axis_vmc.",
          "title": "Machine Klass"
        },
        "machine_rate_per_hour": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "That machine's hourly rate.",
          "title": "Machine Rate Per Hour"
        },
        "material_price_per_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Price charged for the stock, per kilogram.",
          "title": "Material Price Per Kg"
        },
        "material_price_source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Where that price came from — an environment rate of yours, or a platform category / family rate.",
          "title": "Material Price Source"
        },
        "material_price_basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The platform bucket a platform price came from (e.g. cast_iron); null when a specific rate row priced it.",
          "title": "Material Price Basis"
        },
        "scrap_credit_stated": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when the calculation credits what the part's scrap sells for (cost_decomposition.scrap_credit): the environment states that it sells its scrap or states a flat return per kg, the part leaves scrap of a kind a scrap dealer buys (sheet skeleton, chips, cut-offs), and the stock is not the customer's. A class no price was found for is credited nothing — see scrap_prices.",
          "title": "Scrap Credit Stated"
        },
        "remnant_credit_stated": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when the material line credits the reusable remnant the part leaves: the environment states that it returns remnants to stock, the part is cut from sheet or from bar or tube bought by length, and the stock is not the customer's. The credit is 0 where the stock leaves no remnant large enough to reuse.",
          "title": "Remnant Credit Stated"
        },
        "scrap_prices": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicScrapPrice"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The price each class of the part's scrap was credited at. Present only when scrap_credit_stated is true.",
          "title": "Scrap Prices"
        },
        "remnant_value_factor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What a reusable remnant is worth against new stock, as a fraction (0.8 = 80 % of the material price). Present only when remnant_credit_stated is true.",
          "title": "Remnant Value Factor"
        },
        "lot_size": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Quantity this price was computed for.",
          "title": "Lot Size"
        },
        "overhead_variable_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Variable overhead surcharge, as a fraction.",
          "title": "Overhead Variable Pct"
        },
        "overhead_variable_basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cost base that surcharge is charged on: direct, material, labour or conversion.",
          "title": "Overhead Variable Basis"
        },
        "overhead_fixed_per_part": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Fixed overhead charged per part.",
          "title": "Overhead Fixed Per Part"
        },
        "material_overhead_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Material overhead (Materialgemeinkosten) surcharge on direct material cost, as a fraction.",
          "title": "Material Overhead Pct"
        },
        "production_overhead_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Residual production overhead (Rest-Fertigungsgemeinkosten) surcharge on production wages, as a fraction. Residual because the machine-dependent overhead is already inside the machine-hour rate.",
          "title": "Production Overhead Pct"
        },
        "sga_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Administration and selling overhead surcharge on manufacturing cost (Herstellkosten), as a fraction.",
          "title": "Sga Pct"
        },
        "margin_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Profit mark-up (Gewinnzuschlag) on total cost (Selbstkosten), as a fraction. A mark-up on cost, not a margin on price: 0.25 here is a 20 % share of the price.",
          "title": "Margin Pct"
        },
        "cash_discount_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Customer cash discount (Kundenskonto) priced into the offer 'im Hundert', as a fraction of the target price (Zielverkaufspreis).",
          "title": "Cash Discount Pct"
        },
        "sales_commission_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Sales commission (Vertreterprovision) priced into the offer 'im Hundert', as a fraction of the target price (Zielverkaufspreis).",
          "title": "Sales Commission Pct"
        },
        "customer_discount_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Customer discount (Kundenrabatt) priced into the offer 'im Hundert', as a fraction of the list price (the offer price).",
          "title": "Customer Discount Pct"
        },
        "reject_rate_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Reject rate the quote allows for, as a fraction.",
          "title": "Reject Rate Pct"
        },
        "reject_rate_base": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the reject rate is charged on: 'material' (the stock drawn for the parts that fail) or 'herstellkosten' (the whole part before scrap). One method, never both; cost_decomposition.scrap_base states the amount it comes to.",
          "title": "Reject Rate Base"
        },
        "scrap_credit_per_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The environment's flat return per kg of scrap, net of the cost of selling it, in the environment's currency (0 = none stated). Paid on the scrap a scrap dealer buys — sheet skeleton, chips, cut-offs — wherever no scrap price is stated for that kind of scrap; never on a reusable remnant.",
          "title": "Scrap Credit Per Kg"
        },
        "subcontract_overhead_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Procurement overhead on subcontract work, as a fraction of the subcontract cost.",
          "title": "Subcontract Overhead Pct"
        },
        "margin_base": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the profit mark-up is charged on: 'selbstkosten' (total cost) or 'netto_selbstkosten' (total cost without packaging, freight and duty).",
          "title": "Margin Base"
        }
      },
      "title": "PublicAssumptions",
      "type": "object"
    },
    "PublicAxesFacts": {
      "description": "The oblique work behind an axis-count refusal.",
      "properties": {
        "oblique_clusters": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Distinct oblique face directions on the part.",
          "title": "Oblique Clusters"
        },
        "required_axes": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Simultaneous axes that work needs.",
          "title": "Required Axes"
        },
        "indexable_axes": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Axes the closest machine can index.",
          "title": "Indexable Axes"
        }
      },
      "title": "PublicAxesFacts",
      "type": "object"
    },
    "PublicBlockerMeasurement": {
      "description": "The two numbers behind a blocker, without any prose around them.\n\n``detail`` says the same thing as an English sentence; this is the pair a\nclient can format in its own locale and its own words.",
      "properties": {
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the part requires.",
          "title": "Value"
        },
        "threshold": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the machine offers.",
          "title": "Threshold"
        },
        "unit": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Physical unit of both numbers; null when they are a count.",
          "title": "Unit"
        }
      },
      "title": "PublicBlockerMeasurement",
      "type": "object"
    },
    "PublicCalculationAnalytics": {
      "description": "A calculation's analytics: the cost breakdown, times, prediction band,\nlot-size curve, optimization findings, secondary operations, machine\nselection, extraction counts, cost drivers, and review status.",
      "properties": {
        "cost_decomposition": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicCostDecomposition"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "cost_sheet": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicCostSheet"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "offer_price": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Offer Price"
        },
        "lot_size_curve": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicLotSizeCurve"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "optimization": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicOptimization"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "secondary_route": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicSecondaryOperation"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Secondary Route"
        },
        "time_breakdown": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicTimeBreakdown"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "process_plan": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicProcessPlan"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "unit_cost_interval": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicUnitCostInterval"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "selection": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicSelection"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "extraction": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicExtraction"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "cost_drivers": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicCostDrivers"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "review": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicReview"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "drawing_pairing": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicDrawingPairing"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "material_resolution": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicMaterialResolution"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "assumptions": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAssumptions"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "part_requirements": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicPartRequirements"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "selection_failure": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicSelectionFailure"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "pipeline_notes": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicPipelineNote"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "title": "Pipeline Notes"
        },
        "assembly": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAssembly"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "stage_timings": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicStageTimings"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "title": "PublicCalculationAnalytics",
      "type": "object"
    },
    "PublicCapableMachine": {
      "description": "A machine of this environment that is switched off and could do the\nwork — the first remedy to try.",
      "properties": {
        "name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Name of the machine.",
          "title": "Name"
        },
        "machine_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Its machine class, e.g. milling.3axis_vmc.",
          "title": "Machine Class"
        }
      },
      "title": "PublicCapableMachine",
      "type": "object"
    },
    "PublicClamping": {
      "description": "How many times one machine clamps the part.",
      "properties": {
        "machine": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machine / work centre, by the name it is known by.",
          "title": "Machine"
        },
        "count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Clampings on that machine — the count its handling was costed on. A machine that did not state a count is left out.",
          "title": "Count"
        }
      },
      "title": "PublicClamping",
      "type": "object"
    },
    "PublicCostDecomposition": {
      "description": "Cost line items per unit — material, machine time, labour, programming,\ntooling, inspection and finishing, plus the overhead split, the cost-sheet\nsurcharges built on top of those lines, and the totals they build.\n\nTHE BASIS. Every amount on this model is in the calculation's own\ncurrency, on the same basis as the calculation's unit_cost: material_cost\n+ machine_cost + labour_cost + programming_cost + tooling_cost +\ninspection_cost + finishing_cost + subcontract_cost + overhead_var +\noverhead_fixed reproduces unit_cost. Each line is the amount the\ncalculation's cost sheet charges for it: on a calibrated environment\nevery line carries the calibration of the cost it is driven by — machine\ntime, labour, overheads — and material carries none, unless the\ncalibration is one factor on the whole price. Five fields are\nrestatements of money already inside those lines and must NOT be added\nagain:\nmachine_setup_cost and labour_setup_cost (inside machine_cost /\nlabour_cost), transfer_cost (inside overhead_fixed), and the two the\nmaterial line is made of — material_cost = material_purchased_cost -\nremnant_credit. direct_unit_cost is the sum of the eight direct lines.\nscrap_credit is not inside any of them: it is a cost-sheet rung that\nherstellkosten subtracts.\n\nTHE OFFER PRICE THIS CALCULATION RETURNS is ``analytics.offer_price``.\nUse that one to quote from. The three totals below — herstellkosten,\nselbstkosten and angebotspreis — are the cost sheet's own arithmetic over\nthe lines above, published so a caller never has to re-derive the ladder.",
      "properties": {
        "material_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Material cost per unit: the stock bought less the remnant credit.",
          "title": "Material Cost"
        },
        "material_purchased_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The stock bought for one unit, at the material price, before any credit — on an environment calibrated by one factor on the whole price, that factor too. A RESTATEMENT of material_cost, which is this figure less remnant_credit — not a line of its own.",
          "title": "Material Purchased Cost"
        },
        "remnant_credit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the reusable remnant one unit leaves — a rest of the sheet, an end of the bar or tube — is worth back in stock, per unit, taken off the stock bought. Zero unless the environment states that it returns remnants to stock.",
          "title": "Remnant Credit"
        },
        "machine_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machine-time cost per unit.",
          "title": "Machine Cost"
        },
        "labour_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Labour cost per unit.",
          "title": "Labour Cost"
        },
        "programming_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "CAM programming cost per unit.",
          "title": "Programming Cost"
        },
        "tooling_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Tooling cost per unit.",
          "title": "Tooling Cost"
        },
        "inspection_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Inspection cost per unit.",
          "title": "Inspection Cost"
        },
        "finishing_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finishing cost per unit.",
          "title": "Finishing Cost"
        },
        "subcontract_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Outsourced secondary-process cost per unit (plating, heat-treat, welding), including each supplier's per-order minimum amortised over the lot. Included in direct_unit_cost; the per-operation split is on secondary_route[].cost_per_part. When the fleet has no saw for the blank, or a sheet part's plate is ordered cut to size, this line also carries the supplier's cut-to-size service — see the cut_to_size_provision pipeline note for that amount. Where that note's at_floor is true — always for a plate, and for a saw cut that would cost less than the service's minimum charge — the amount is that minimum charge, not a price for the cut.",
          "title": "Subcontract Cost"
        },
        "machine_setup_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Amortised machine-time share of the one-time lot setup, per unit. Included in machine_cost (audit split, not extra money): setup per unit = machine_setup_cost + labour_setup_cost.",
          "title": "Machine Setup Cost"
        },
        "labour_setup_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Amortised operator share of the one-time lot setup, per unit. Included in labour_cost (audit split, not extra money).",
          "title": "Labour Setup Cost"
        },
        "direct_unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Direct and machine cost per unit before overhead.",
          "title": "Direct Unit Cost"
        },
        "overhead_var": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Variable overhead per unit.",
          "title": "Overhead Var"
        },
        "overhead_fixed": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Fixed overhead per unit. On a route split across two or more machines this figure also carries the inter-machine transfer charge — transfer_cost states how much of it that is.",
          "title": "Overhead Fixed"
        },
        "transfer_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Moving the lot between the machines that made it, per unit: a per-order logistics charge, amortised over the lot. A RESTATEMENT of money already inside overhead_fixed — that is the line it is priced in — so it is not a line of its own and must not be added to the others; it is neither machine burden nor shop overhead, so the cost sheet shows it on its own row. Zero on a single-machine route, which is most of them.",
          "title": "Transfer Cost"
        },
        "scrap_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cost of the parts rejected in production, carried by the good ones, per unit: scrap_base x r / (1 - r) at reject rate r. The environment charges it by ONE method, never both — on the material drawn for the rejects, or on the whole part before scrap, excluding the lot's one-off costs, which a reject does not repeat. assumptions.reject_rate_base names the method and scrap_base states the amount. Zero when the environment books no scrap.",
          "title": "Scrap Cost"
        },
        "scrap_base": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The amount scrap_cost is struck on, per unit: material_cost when the reject rate is charged on material; the whole part before scrap, excluding the lot's one-off costs, when it is charged on the whole part. A basis, not a charge — it is already inside the lines above and must not be added to them. Zero when the environment books no scrap.",
          "title": "Scrap Base"
        },
        "material_overhead": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Procurement and storage surcharge on the net material (material_cost less scrap_credit, plus the scrap allowance where scrap is charged on material), per unit. Zero unless the environment states the surcharge.",
          "title": "Material Overhead"
        },
        "production_overhead": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Surcharge on production wages, per unit. Zero unless the environment states the surcharge.",
          "title": "Production Overhead"
        },
        "sga_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Administration and selling surcharge on manufacturing cost, per unit. Zero unless the environment states the surcharge.",
          "title": "Sga Cost"
        },
        "freight_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Outbound freight per unit. Zero unless the environment states it.",
          "title": "Freight Cost"
        },
        "duty_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Customs duty per unit. Zero unless the environment states it.",
          "title": "Duty Cost"
        },
        "packaging_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Packaging material per unit (Sondereinzelkosten des Vertriebs; the packing labour is on the labour line). Zero unless the environment states it.",
          "title": "Packaging Cost"
        },
        "margin": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Profit mark-up (Gewinnzuschlag) per unit, struck on total cost (selbstkosten). Zero unless the environment states one — without it the figure is a should-cost, not a price.",
          "title": "Margin"
        },
        "cash_discount": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Customer cash discount (Kundenskonto) priced into the offer per unit, 'im Hundert' of the target price (zielverkaufspreis). Zero unless the environment states a rate.",
          "title": "Cash Discount"
        },
        "sales_commission": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Sales commission (Vertreterprovision) priced into the offer per unit, 'im Hundert' of the target price (zielverkaufspreis). Zero unless the environment states a rate.",
          "title": "Sales Commission"
        },
        "customer_discount": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Customer discount (Kundenrabatt) priced into the offer per unit, 'im Hundert' of the list price (angebotspreis). Zero unless the environment states a rate.",
          "title": "Customer Discount"
        },
        "scrap_credit": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Scrap credit per unit (Reststoffgutschrift): what the scrap one unit leaves behind — the sheet skeleton, chips, cut-offs — sells for, net of the cost of selling it, never more than material_cost. Each kind of scrap is credited at the environment's scrap price for it, else at the environment's flat return per kg. A reusable remnant is not scrap: it is remnant_credit, inside material_cost. A positive amount that herstellkosten SUBTRACTS; the material overhead and a material scrap allowance are charged on material_cost less this credit. Zero unless the environment states that it sells its scrap or states a return per kg.",
          "title": "Scrap Credit"
        },
        "subcontract_overhead": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Procurement overhead on subcontract work per unit: subcontract_cost x the environment's stated rate, inside herstellkosten. Zero unless the environment states a rate.",
          "title": "Subcontract Overhead"
        },
        "herstellkosten": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Manufacturing cost per unit on the cost sheet: the direct lines plus the overhead split, plus scrap, the material, production and subcontract surcharges, less the scrap credit. A cost-sheet total for checking the lines above add up — unit_cost is NOT derived from it. unit_cost is direct_unit_cost + overhead_var + overhead_fixed, so it matches this figure only on an environment that states no reject rate and no material or production surcharge.",
          "title": "Herstellkosten"
        },
        "selbstkosten": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Total cost per unit: manufacturing cost plus administration and selling, packaging, freight and duty. Equal to herstellkosten unless the environment states those surcharges.",
          "title": "Selbstkosten"
        },
        "barverkaufspreis": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cash price per unit: total cost plus the profit mark-up — what the supplier receives after every deduction the customer may take. Equal to selbstkosten unless the environment states a mark-up.",
          "title": "Barverkaufspreis"
        },
        "zielverkaufspreis": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Target price per unit: the cash price plus the cash discount and the sales commission. Equal to barverkaufspreis unless the environment states either.",
          "title": "Zielverkaufspreis"
        },
        "angebotspreis": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Offer price per unit on the cost sheet — the list price (Listenverkaufspreis netto): the target price plus the customer discount. Equal to barverkaufspreis unless the environment states a cash discount, commission or customer discount. The cost sheet's own total over the lines above; the amount this calculation returns is analytics.offer_price — see the basis note on this model.",
          "title": "Angebotspreis"
        }
      },
      "title": "PublicCostDecomposition",
      "type": "object"
    },
    "PublicCostDriver": {
      "description": "One ranked cost driver: a feature with its cost contribution, its\nshare of cost and machining time, and the reasons it is costly.",
      "properties": {
        "rank": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "1-based rank by contribution to unit cost.",
          "title": "Rank"
        },
        "feature_kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Feature type, e.g. pocket or hole.",
          "title": "Feature Kind"
        },
        "label": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Human label for the driver.",
          "title": "Label"
        },
        "cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cost attributed to this driver, per unit, in the calculation's currency on the same basis as its unit_cost — cost_share x unit_cost.",
          "title": "Cost"
        },
        "cost_share": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Share of unit cost, 0–1.",
          "title": "Cost Share"
        },
        "time_share": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Share of machining time, 0–1.",
          "title": "Time Share"
        },
        "time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machining time attributed to this driver, per unit, in seconds — time_share x total_machining_time_s. The same seconds the per-operation rows in time_breakdown.operations state, attributed to the feature. Absent on older calculations.",
          "title": "Time S"
        },
        "reasons": {
          "description": "Why this driver is costly.",
          "items": {
            "type": "string"
          },
          "title": "Reasons",
          "type": "array"
        }
      },
      "title": "PublicCostDriver",
      "type": "object"
    },
    "PublicCostDrivers": {
      "description": "The ranked value-engineering result: the cost drivers by contribution,\nplus how much of the unit cost is shared rather than attributable to a\nsingle driver. Every money figure is in the calculation's currency on\nthe same basis as its unit_cost.",
      "properties": {
        "attributed_cost_share": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Share of unit cost attributed to named drivers, 0–1.",
          "title": "Attributed Cost Share"
        },
        "shared_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Unattributed shared cost, per unit, in the calculation's currency on the same basis as its unit_cost — shared_cost_share x unit_cost.",
          "title": "Shared Cost"
        },
        "shared_cost_share": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Share of unit cost that is shared, 0–1.",
          "title": "Shared Cost Share"
        },
        "total_machining_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machining time per unit the driver shares are shares of, in seconds: the charged cutting and positioning time of every operation (productive plus air time, under the allowance). Absent on older calculations.",
          "title": "Total Machining Time S"
        },
        "offer_price": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The offer price per unit this part is quoted at, in the calculation's currency. The shares above are shares of the MANUFACTURING cost, which is what the attribution reconciles to; this is here so a driver can also be stated against the price. Equal to the unit cost unless the environment states a cost sheet. Absent on older calculations.",
          "title": "Offer Price"
        },
        "drivers": {
          "items": {
            "$ref": "#/$defs/PublicCostDriver"
          },
          "title": "Drivers",
          "type": "array"
        }
      },
      "title": "PublicCostDrivers",
      "type": "object"
    },
    "PublicCostSheet": {
      "properties": {
        "lines": {
          "items": {
            "$ref": "#/$defs/PublicCostSheetLine"
          },
          "type": "array",
          "title": "Lines",
          "description": "The cost lines, in display order."
        },
        "total": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Total",
          "description": "Sum of the top-level lines, in the currency below."
        },
        "currency": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Currency",
          "description": "Currency of every amount on this sheet."
        },
        "lot_size": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Lot Size",
          "description": "Lot size this sheet was built for."
        },
        "quantity_basis": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Quantity Basis",
          "description": "Quantity this sheet is exact at. On a sheet attached to a point of the lot-size curve the deeper tiers are the ones that really are local to that quantity; setup, programming and supplier minimums re-amortise and are stated at the top level only."
        },
        "reconciled": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "title": "Reconciled",
          "description": "Whether every tier added up to the line above it."
        },
        "residual": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Residual",
          "description": "Largest amount a tier was out by, in the currency above. Absent when the sheet reconciled."
        },
        "notes": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicCostSheetNote"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "title": "Notes",
          "description": "What this sheet states about itself — for example that it was reconstructed from the figures the run stored and therefore carries the cost lines and the surcharge ladder but not the per-machine, per-clamping or per-operation detail, which is recorded only while pricing. Every amount is the amount charged either way."
        },
        "version": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Version",
          "description": "Version of this sheet's shape."
        }
      },
      "type": "object",
      "title": "PublicCostSheet",
      "description": "The itemised cost sheet: every cost line, the tiers beneath it, and the\ntime and rate each one is built from.\n\nOne tree, exact at one quantity: the top level is the cost breakdown for\nthe lot this sheet was built for, and every tier under a line adds up to\nit. ``reconciled`` says whether it did — a sheet that could not be made to\nadd up drops the tier it could not stand behind and says so rather than\npresenting a total that does not follow from its rows."
    },
    "PublicCostSheetDoor": {
      "properties": {
        "route": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Route",
          "description": "Method and path of the endpoint that writes this line's factor, e.g. 'PATCH /machines/{machine_id}'."
        },
        "params": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Params",
          "description": "Values that identify the record to write, plus ``field`` — the name of the field on that record which holds this line's number — ``current_value``, what it holds now, and ``factor``, the adjustable factor that number is the value of. The line's own ``rate`` is what the work was CHARGED at and is usually a different figure; writing back the charged rate would change the price."
        }
      },
      "type": "object",
      "title": "PublicCostSheetDoor",
      "description": "Where a change to this line is made — the endpoint that owns the number."
    },
    "PublicCostSheetEvidence": {
      "properties": {
        "source_quality": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Source Quality",
          "description": "How well founded the numbers behind this line are: 'sourced' from published reference data, 'stated' by your own environment, 'learned' from your own reported outcomes, 'placement' a documented working value, 'unsourced' neither."
        },
        "observation_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Observation Count",
          "description": "How many of your reported outcomes a 'learned' value was derived from."
        }
      },
      "type": "object",
      "title": "PublicCostSheetEvidence",
      "description": "What the platform is willing to claim about a line's inputs."
    },
    "PublicCostSheetLine": {
      "properties": {
        "bucket": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Bucket",
          "description": "Stable slug of this line's cost category, dotted for a tier below the top level, e.g. 'setup', 'setup.machine'."
        },
        "label_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Label Id",
          "description": "Message id for this line's name."
        },
        "label_params": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Label Params",
          "description": "Values the label and the formula refer to — the machine name, the clamping number, the base and percentage of a surcharge. Keys depend on ``label_id``. Money among them — a price per kilogram, a charge per lot — is in the environment's rate currency (``assumptions.rate_currency``); the line's amount carries the conversion into the calculation's currency, ``assumptions.currency_factor``."
        },
        "amount": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Amount",
          "description": "What this line costs per unit, in the calculation's currency, as shown: the lines of a tier add up exactly to the line above them, the categories to the calculation's unit_cost and the surcharge lines with them to its offer_price."
        },
        "exact": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Exact",
          "description": "This line's amount before it was rounded for display: the engine's figure. ``amount`` is within one unit of its last decimal of it. A per-lot figure is ``exact`` times the lot, rounded once."
        },
        "line_kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Line Kind",
          "description": "How the amount arises: 'priced' (a stated or calculated amount with its own formula — mass x price, an external price, a share of a tool's life) or 'derived' (a percentage of the lines above it). ABSENT means 'timed' — a duration billed at a rate, which is most of the sheet, so the field is omitted there. Only a timed line has a duration; on the other two an absent ``time_s`` is the answer, not a gap."
        },
        "time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Time S",
          "description": "Time this line bills, in seconds, on the basis below. Absent on a line that is not time-driven."
        },
        "time_basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Time Basis",
          "description": "What ``time_s`` is per: 'per_part', 'per_lot' (a one-time figure spread over the lot), or 'per_setup' (per clamping)."
        },
        "rate": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicCostSheetRate"
            },
            {
              "type": "null"
            }
          ]
        },
        "terms": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicCostSheetTerm"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "title": "Terms",
          "description": "The time components this line adds up, when it has more than one."
        },
        "formula_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Formula Id",
          "description": "Message id for the shape of the arithmetic."
        },
        "factors": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "title": "Factors",
          "description": "Adjustable factors that move this line, by name. A factor is listed only where this line carries what is needed to evaluate it."
        },
        "evidence": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicCostSheetEvidence"
            },
            {
              "type": "null"
            }
          ]
        },
        "children": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicCostSheetLine"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "title": "Children",
          "description": "The tier below this line; they sum to it."
        },
        "op_refs": {
          "anyOf": [
            {
              "items": {
                "type": "integer"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "title": "Op Refs",
          "description": "Positions in ``time_breakdown.operations`` of the process steps this line bills, 0-based."
        },
        "door": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicCostSheetDoor"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "type": "object",
      "title": "PublicCostSheetLine",
      "description": "One row of the cost sheet, at any depth.\n\nThe top level is the cost breakdown — material, setup, machine, labour and\nthe surcharge ladder — and ``children`` hold the tiers beneath it: one\ngroup per machine, then the clamping, the work elements, the operations.\nEvery amount is in the calculation's currency and is the figure charged, so\na tier always adds up to the line above it.\n\n``label_id`` is a message id rather than a rendered sentence, with the\nvalues in ``label_params``, so an integration can render the line in its\nown language. ``formula_id`` names the shape of the arithmetic\n(time x rate, base x percentage, mass x price) the same way."
    },
    "PublicCostSheetNote": {
      "properties": {
        "code": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Code",
          "description": "Machine-readable name for what this note says."
        },
        "bucket": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Bucket",
          "description": "The cost line it is about; absent or empty when it is about the whole sheet."
        },
        "residual": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Residual",
          "description": "Amount the note is worth, in the sheet's currency. Zero when the note is not about an amount."
        }
      },
      "type": "object",
      "title": "PublicCostSheetNote",
      "description": "Something the sheet states about itself."
    },
    "PublicCostSheetRate": {
      "properties": {
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Value",
          "description": "The rate itself, in the unit below."
        },
        "unit": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Unit",
          "description": "What the rate is per: 'eur_per_h' an hour of occupancy, 'eur_per_part' a piece, 'eur_per_kg' a kilogram, 'fraction' a share of a base (0.10 = 10 %)."
        },
        "currency": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Currency",
          "description": "What ``value`` is denominated in — the costing environment's own rate currency, which the amounts on the sheet are not necessarily in."
        },
        "operator_wage_in_rate": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Operator Wage In Rate",
          "description": "The operator wage already inside the machine's hourly rate and taken out of the charged rate, so it is billed once. Machine rates only."
        },
        "burden": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Burden",
          "description": "The capital burden added on top of the operator-net hour. Machine rates only."
        }
      },
      "type": "object",
      "title": "PublicCostSheetRate",
      "description": "The rate one line's arithmetic multiplied by.\n\nStated in the costing environment's own rate currency, which is not\nnecessarily the currency of the amounts on the sheet — the conversion is\npart of the amount, not of the rate. The calculation states it as\n``assumptions.currency_factor``.\n\nA MACHINE rate is what the machine's time was CHARGED at, which is not\nthe hourly rate recorded on the machine: the operator's wage is taken\nout of it (it is billed on the labour line instead) and the capital\nburden is added. ``operator_wage_in_rate`` and ``burden`` are those two\nterms, so the charged rate can be reconstructed from the machine's own\nhourly rate — ``max(0, hourly_rate - operator_wage) + burden`` — and a\nchange to that rate can be costed without guessing. Both are absent on\na rate where the relation does not hold."
    },
    "PublicCostSheetTerm": {
      "properties": {
        "time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Time S",
          "description": "Duration of this component in seconds, on the basis below."
        },
        "basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Basis",
          "description": "What the duration is per: 'per_lot' for a one-time figure spread over the lot, 'per_setup' per clamping. Absent means per part."
        },
        "rate_value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Rate Value",
          "description": "The rate this component is billed at when it differs from the line's own rate — setup and run hours are charged differently. In the environment's rate currency, per hour."
        },
        "factor_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Factor Key",
          "description": "Name of the adjustable factor this component's duration responds to, as listed by the environment's factor endpoint. Absent when no single factor moves it."
        }
      },
      "type": "object",
      "title": "PublicCostSheetTerm",
      "description": "One additive time component of a line — a duration billed at a rate.\n\nThe components a line was built from, in the order the engine added them.\nThey are stated before the currency conversion and before any calibration\nthe environment carries, so they explain the line rather than re-derive\nit: the line's own ``amount`` is what is charged."
    },
    "PublicDeburrDerivation": {
      "description": "What deburring is made of — one operation per part, on the model the\npart's own process implies.",
      "properties": {
        "model": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "'hand_edge' (broken by hand along the edge), 'belt_pass' (one pass through a brush or slat machine), or 'none'.",
          "title": "Model"
        },
        "charged": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "False on a machine that is not the one charged for the part-level work, so the operation is billed once per part.",
          "title": "Charged"
        },
        "edge_length_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Burr-forming edge length broken by hand.",
          "title": "Edge Length Mm"
        },
        "n_holes": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Hole entrances broken at the bench.",
          "title": "N Holes"
        },
        "tau_per_mm": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds per millimetre of edge."
        },
        "tau_per_hole": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds per hole entrance."
        },
        "belt_mm_per_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Belt feed of the deburring machine."
        },
        "handling_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Load and unload at the deburring machine."
        },
        "pass_len_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Length that travels the belt in one pass.",
          "title": "Pass Len Mm"
        },
        "seconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Deburr seconds per part.",
          "title": "Seconds"
        },
        "parts": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicDeburrDerivation"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per-machine entries on a multi-machine route.",
          "title": "Parts"
        }
      },
      "title": "PublicDeburrDerivation",
      "type": "object"
    },
    "PublicDrawingPairing": {
      "description": "Whether the drawing sent with this calculation describes its model.\nPresent only when a drawing was paired with a model.",
      "properties": {
        "status": {
          "description": "``matched``: the checks that ran agree. ``suspect``: one disagrees — the drawing is used and the quote is flagged for review. ``mismatched``: the drawing describes another part. ``unverified``: nothing could be compared.",
          "enum": [
            "matched",
            "suspect",
            "mismatched",
            "unverified"
          ],
          "title": "Status",
          "type": "string"
        },
        "drawing_excluded": {
          "description": "True when the drawing was left out and the price is computed from the model alone (the ``drawing_excluded`` review reason says the same).",
          "title": "Drawing Excluded",
          "type": "boolean"
        },
        "checks": {
          "items": {
            "$ref": "#/$defs/PublicDrawingPairingCheck"
          },
          "title": "Checks",
          "type": "array"
        }
      },
      "required": [
        "status",
        "drawing_excluded"
      ],
      "title": "PublicDrawingPairing",
      "type": "object"
    },
    "PublicDrawingPairingCheck": {
      "description": "One check of whether the attached drawing describes the uploaded\nmodel.",
      "properties": {
        "name": {
          "description": "Which check: ``overall_dims`` (the drawing's dimensions against the model's size), ``part_number`` (the article numbers the files carry), ``material`` or ``weight``. New names may appear.",
          "title": "Name",
          "type": "string"
        },
        "status": {
          "description": "``pass`` or ``fail``; ``skipped`` when one side carries nothing to compare.",
          "enum": [
            "pass",
            "fail",
            "skipped"
          ],
          "title": "Status",
          "type": "string"
        }
      },
      "required": [
        "name",
        "status"
      ],
      "title": "PublicDrawingPairingCheck",
      "type": "object"
    },
    "PublicExtraction": {
      "description": "Headline extraction counts: features detected, dimensions and\ntolerances read, manufacturability flags raised, and fields where the\n3D model and the 2D drawing disagreed.",
      "properties": {
        "feature_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of machinable features detected.",
          "title": "Feature Count"
        },
        "pmi_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of dimensions / tolerances read.",
          "title": "Pmi Count"
        },
        "dfm_issue_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of manufacturability flags raised.",
          "title": "Dfm Issue Count"
        },
        "fusion_conflict_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of fields where the 3D model and the 2D drawing disagreed.",
          "title": "Fusion Conflict Count"
        },
        "partial": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when the model and the drawing were read but the run produced no price: the counts here describe what was read, and no cost accompanies them. Absent on a priced calculation.",
          "title": "Partial"
        }
      },
      "title": "PublicExtraction",
      "type": "object"
    },
    "PublicFinishingDerivation": {
      "description": "What the finishing time is made of: the operations' own finishing\nphase plus the sweeps over the machined faces.",
      "properties": {
        "op_finishing_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finishing seconds the routed operations carry themselves (a ground face, for example).",
          "title": "Op Finishing S"
        },
        "sweeps": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicFinishingSweep"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "One entry per finishing sweep.",
          "title": "Sweeps"
        },
        "seconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finishing seconds per part.",
          "title": "Seconds"
        },
        "parts": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicFinishingDerivation"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per-machine entries on a multi-machine route.",
          "title": "Parts"
        }
      },
      "title": "PublicFinishingDerivation",
      "type": "object"
    },
    "PublicFinishingSweep": {
      "description": "One finishing sweep over a machined face — area over feed × stepover.",
      "properties": {
        "area_mm2": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Face area swept.",
          "title": "Area Mm2"
        },
        "ra_um": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Surface finish the sweep holds, in micrometres. The drawing's callout where there is one, else your shop's default.",
          "title": "Ra Um"
        },
        "tool_d_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cutter diameter.",
          "title": "Tool D Mm"
        },
        "teeth": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cutter teeth.",
          "title": "Teeth"
        },
        "a_e_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stepover per pass.",
          "title": "A E Mm"
        },
        "v_f_mm_min": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Resulting table feed, mm/min.",
          "title": "V F Mm Min"
        },
        "seconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds for this sweep.",
          "title": "Seconds"
        },
        "hardness_time_factor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Time multiplier applied to this sweep for the grade's hardness against its workpiece group's band; 1 when none applied.",
          "title": "Hardness Time Factor"
        }
      },
      "title": "PublicFinishingSweep",
      "type": "object"
    },
    "PublicGradePair": {
      "description": "The ISO 286 grade the drawing calls out against the finest one the\nclosest machine holds.",
      "properties": {
        "required": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Called out, e.g. IT6.",
          "title": "Required"
        },
        "achievable": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finest grade that machine holds, e.g. IT9.",
          "title": "Achievable"
        }
      },
      "title": "PublicGradePair",
      "type": "object"
    },
    "PublicHoldsButCannot": {
      "description": "Machines that hold the part but cannot do its work: the holders and\nthe missing processes as codes, beside the fragments older clients\nread.",
      "properties": {
        "machines": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The holders, as a phrase (e.g. '3 machines').",
          "title": "Machines"
        },
        "missing_process": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The missing processes, as a phrase.",
          "title": "Missing Process"
        },
        "machine_names": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Names of the machines that hold the part.",
          "title": "Machine Names"
        },
        "machine_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How many hold it.",
          "title": "Machine Count"
        },
        "missing_process_classes": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable codes for the processes none of them performs.",
          "title": "Missing Process Classes"
        }
      },
      "title": "PublicHoldsButCannot",
      "type": "object"
    },
    "PublicInspectionDerivation": {
      "description": "What inspection time is made of: how many characteristics, how long\neach takes, and how often they are re-checked after the first article.",
      "properties": {
        "n_elements": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Characteristics the price counts — the drawing's callouts after duplicates are collapsed and non-inspection notes dropped.",
          "title": "N Elements"
        },
        "n_elements_weighted": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The same count with form/position frames and NDT callouts weighted up: the figure the full check is charged on.",
          "title": "N Elements Weighted"
        },
        "n_gdt_frames": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Form and position frames, checked on every part.",
          "title": "N Gdt Frames"
        },
        "n_ndt": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Non-destructive test callouts, on every part.",
          "title": "N Ndt"
        },
        "tau_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds to check one characteristic."
        },
        "w_gdt": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How much longer a form/position frame takes."
        },
        "w_ndt": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How much longer an NDT callout takes."
        },
        "spc_share": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Share of the plain dimensions re-checked on each part after the first article, as a fraction.",
          "title": "Spc Share"
        },
        "batch_size": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Lot the first article is amortised over.",
          "title": "Batch Size"
        },
        "first_article_in_setup": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when your environment books the first article on the setup line instead, and this figure is the per-part re-checks alone.",
          "title": "First Article In Setup"
        },
        "full_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds for one complete first-article check.",
          "title": "Full S"
        },
        "recurring_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds of re-check on one further part, at the full rate. NOT what a part is charged: the first article is one piece of the lot and does not pay it again, so the charged share is this times (1 − 1 / batch_size) — on a lot of 100 the sheet's sample row reads 99 % of this figure. `seconds` is what is charged.",
          "title": "Recurring S"
        },
        "seconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Inspection seconds per part — what this line is charged, the first-article share and the re-checks blended over the lot.",
          "title": "Seconds"
        },
        "parts": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicInspectionDerivation"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per-machine entries on a multi-machine route.",
          "title": "Parts"
        }
      },
      "title": "PublicInspectionDerivation",
      "type": "object"
    },
    "PublicLoadUnloadDerivation": {
      "description": "What load/unload is made of: one handling cycle per clamping, plus the\npallet change each re-orientation costs, shared by the pieces that go in\ntogether.\n\nOn a route spanning several machines the clampings add up but the per-\nclamping seconds do not compose into one, so ``tau_s`` is null and each\nentry in ``parts`` carries its own.",
      "properties": {
        "n_setups": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Clampings per part.",
          "title": "N Setups"
        },
        "tau_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds per clamping after the handling class is applied (or per sheet on a machine that loads one).",
          "title": "Tau S"
        },
        "tau_base_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The unbanded handling rate this starts from."
        },
        "size_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Size class of the workpiece, from its largest extent — the setup plane's handling_class is the same ladder read on mass when a mass is known, so the two can differ on one part.",
          "title": "Size Class"
        },
        "size_factor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What that class multiplies the rate by.",
          "title": "Size Factor"
        },
        "nesting": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True on a machine whose operator loads a sheet rather than a part, so one handling serves every part cut from it.",
          "title": "Nesting"
        },
        "bar_fed": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True on a machine fed from a bar loader or running continuously, so nobody loads and unloads each piece of the bar cycle — which is why the handling rate above reads 0 s for that cycle. The 0 s is the bar cycle only: a re-chuck by hand still pays that re-chuck's handling. Every other machine keeps its own.",
          "title": "Bar Fed"
        },
        "parts_per_fixture": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Pieces that share one loading at this order quantity, never more than the order quantity: the parts nested on one purchased sheet (on the machine's bed where no sheet was bought) or cut from one purchased bar; on any other machine, the pieces its fixturing is modelled to take per loading — the environment's parts-per-clamping setting, 2 unless it states another, a press brake and a lathe included. 1 on a route spanning several machines, where each entry in 'parts' carries its own.",
          "title": "Parts Per Fixture"
        },
        "pallet_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machine pallet or index time per re-orientation.",
          "title": "Pallet S"
        },
        "cycle_efficiency": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Your shop's run pace against the published times (1.0 = as published), applied to this handling as to the rest of the run. Null on a route spanning several machines: each entry in 'parts' carries its own."
        },
        "seconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Load/unload seconds per part.",
          "title": "Seconds"
        },
        "parts": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicLoadUnloadDerivation"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per-machine entries on a multi-machine route.",
          "title": "Parts"
        }
      },
      "title": "PublicLoadUnloadDerivation",
      "type": "object"
    },
    "PublicLotSizeAccuracy": {
      "description": "How far a curve point may sit from re-pricing at that quantity.",
      "properties": {
        "basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How the curve is derived. `closed_form` means every quantity is computed from one run's figures rather than re-priced.",
          "title": "Basis"
        },
        "max_deviation_pct": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Largest difference between a curve point and a real re-run at that quantity, in percent, when one is stated. Null: no bound is stated — the curve reuses one run's machine times, and a run at another quantity can plan the part differently.",
          "title": "Max Deviation Pct"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Plain-language statement of the same thing, safe to show to an end user.",
          "title": "Note"
        }
      },
      "title": "PublicLotSizeAccuracy",
      "type": "object"
    },
    "PublicLotSizeCurve": {
      "description": "Unit cost versus lot size. Every money figure on the points and the\noptimum is in ``currency`` — the calculation's own — on the same basis\nas the calculation's unit_cost.",
      "properties": {
        "currency": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ISO 4217 code of the calculation's own currency — the one every money figure on this curve is in, unless basis_uncertain says the record is too old for that to be known. Null only on a record too old to state it.",
          "title": "Currency"
        },
        "basis_uncertain": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True on a record persisted before the curve's currency basis was recorded, where the factor onto the calculation's currency could not be recovered: the points are then in the environment's currency, not necessarily the calculation's. Absent otherwise.",
          "title": "Basis Uncertain"
        },
        "points": {
          "items": {
            "$ref": "#/$defs/PublicLotSizePoint"
          },
          "title": "Points",
          "type": "array"
        },
        "optimum": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicLotSizeOptimum"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "machine_names": {
          "anyOf": [
            {
              "additionalProperties": {
                "type": "string"
              },
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Name of every machine a point's machine_id_at_n refers to. Absent on older calculations.",
          "title": "Machine Names"
        },
        "alternative_quantities": {
          "anyOf": [
            {
              "items": {
                "type": "integer"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The lot sizes priced on the route's runner-up machine because it is cheaper there; every other point is priced on the calculation's own route. Absent on older calculations.",
          "title": "Alternative Quantities"
        },
        "recommendations": {
          "items": {
            "$ref": "#/$defs/PublicLotSizeRecommendation"
          },
          "title": "Recommendations",
          "type": "array"
        },
        "exact_at_quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The quantity this calculation was run for. The curve reproduces the headline unit cost exactly here and is indicative at every other quantity.",
          "title": "Exact At Quantity"
        },
        "parts_started": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How many parts have to be STARTED to ship the quantity above, at the environment's stated reject rate. Equal to that quantity unless a reject rate is stated. The scrapped parts' material is charged to the good ones and appears on the cost breakdown as its own line.",
          "title": "Parts Started"
        },
        "accuracy": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicLotSizeAccuracy"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "title": "PublicLotSizeCurve",
      "type": "object"
    },
    "PublicLotSizeOptimum": {
      "description": "The holding-aware lot-size optimum (production + inventory holding,\ncapped at one year of demand), with the same figures at the ordered lot\nand the near-optimal band around the minimum. Money in the calculation's\ncurrency. The production figures (unit_cost, current_unit_cost) are the\nmanufacturing cost, as on the points; the effective figures and the\nsaving are the buyer_stock scenario's — the price per piece on the\nbasis valuation_basis names, plus the per-piece ordering and holding\ncost.",
      "properties": {
        "quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Recommended lot size (total-cost optimum).",
          "title": "Quantity"
        },
        "unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Production unit cost at the recommended lot.",
          "title": "Unit Cost"
        },
        "effective_unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The buyer's effective cost per piece at the recommended lot (buyer_stock): the price per piece on the basis valuation_basis names — price_to_cost_ratio × the production unit cost — plus the per-piece share of the ordering cost and of the annual inventory holding cost on that price.",
          "title": "Effective Unit Cost"
        },
        "current_quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Ordered lot size the calculation was priced at.",
          "title": "Current Quantity"
        },
        "current_unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Production unit cost at the ordered lot.",
          "title": "Current Unit Cost"
        },
        "current_effective_unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The buyer's effective cost per piece at the ordered lot (buyer_stock), on the same basis as effective_unit_cost: the price per piece valuation_basis names plus the per-piece ordering and holding cost.",
          "title": "Current Effective Unit Cost"
        },
        "net_annual_saving": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Net annual saving of moving to the recommended lot, production plus inventory holding, per year, in the calculation's currency.",
          "title": "Net Annual Saving"
        },
        "annual_volume": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Annual demand the optimum was computed against.",
          "title": "Annual Volume"
        },
        "andler_quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Classic Andler/EOQ closed-form lot size, as a cross-check next to the curve-based optimum.",
          "title": "Andler Quantity"
        },
        "band_min_quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Smallest lot within a few percent of the cost optimum — the total-cost curve is flat around its minimum, so any lot in [band_min, band_max] is near-optimal; the recommendation is the band's low end (least capital tied up).",
          "title": "Band Min Quantity"
        },
        "band_max_quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Largest lot within a few percent of the cost optimum.",
          "title": "Band Max Quantity"
        },
        "single_lot_demand": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when one lot already covers the whole annual demand (annual_volume ≤ current_quantity). The ordered lot is then the only candidate, so quantity equals current_quantity by construction — not because it was found to be the cost optimum. annual_volume defaults to 1 when a request omits it; pass the real annual demand to get a recommendation. Absent on older calculations.",
          "title": "Single Lot Demand"
        },
        "scenario": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The scenario this optimum and the points' effective_unit_cost state — buyer_stock, the buyer's classic case. The other scenarios' answers are in scenario_optima.",
          "title": "Scenario"
        },
        "ordering_cost_per_order": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The buyer's fixed cost per order or delivery (order handling and inbound freight) the buyer_stock, make_to_order, joint and consignment scenarios weigh against the price breaks (the environment's ordering cost; 0 where none is stated), in the calculation's currency.",
          "title": "Ordering Cost Per Order"
        },
        "production_rate_per_year": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Pieces the route can make in a year of its machines' VDI 3258 run hours — the finite production rate behind the supplier_stock, make_to_order, joint and consignment scenarios. Absent where no machine states annual hours (instantaneous replenishment then applies).",
          "title": "Production Rate Per Year"
        },
        "price_to_cost_ratio": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the buyer pays per piece over manufacturing cost at the ordered lot — how the buyer-side scenarios price a piece, value the buyer's stock and the setup share it pays for. Under valuation_basis purchase_price it is the purchase price after the supplier's discounts: offer price × (1 − customer discount) × (1 − cash discount); on offer_price calculations, the offer price itself. 1.0 where the environment states no selling calculation.",
          "title": "Price To Cost Ratio"
        },
        "supplier_value_to_cost_ratio": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The supplier's inventory value per piece — production cost including material and production overheads, without administration and selling overheads or profit — over manufacturing cost at the ordered lot: how the supplier_stock, make_to_order, joint and consignment scenarios value the stock the supplier holds or owns. 1.0 where the environment states no costing scheme and on offer_price calculations.",
          "title": "Supplier Value To Cost Ratio"
        },
        "valuation_basis": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How the scenarios value a piece. purchase_price: the buyer pays and holds at the purchase price after the supplier's customer and cash discounts, the supplier holds at production cost (supplier_value_to_cost_ratio). offer_price: a calculation made before that basis — the buyer at the offer price, the supplier's stock at manufacturing cost; recalculate to restate it. Absent on calculations from before the scenarios existed.",
          "title": "Valuation Basis"
        },
        "scenario_optima": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicLotSizeScenarioOptimum"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Every scenario's recommendation on the same curve, in the order buyer_stock, supplier_stock, make_to_order, joint, consignment (consignment absent on calculations from before it existed). Absent on older calculations.",
          "title": "Scenario Optima"
        }
      },
      "title": "PublicLotSizeOptimum",
      "type": "object"
    },
    "PublicLotSizePoint": {
      "properties": {
        "quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Quantity",
          "description": "Lot size."
        },
        "unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Unit Cost",
          "description": "Modelled unit cost at this lot size, in the calculation's currency (see the basis note on this model)."
        },
        "offer_price": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Offer Price",
          "description": "Modelled offer price at this lot size — the unit cost plus the cost-sheet surcharges the environment states (scrap, material and production overhead, administration and selling, freight, duty, mark-up) — in the calculation's currency. Equal to unit_cost unless the environment states a cost sheet. The two series move differently with quantity, so read the one you are quoting from. Absent on older calculations."
        },
        "direct_unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Direct Unit Cost",
          "description": "Direct cost per unit at this lot size, in the calculation's currency: everything before overhead — material, machine, labour, programming, tooling, inspection, finishing and subcontract — with the setup amortised over this lot, so it falls with quantity like unit_cost does. The gap up to unit_cost is the variable and fixed overhead. At the ordered lot it equals cost_decomposition.direct_unit_cost. For the setup share, read the setup line of the cost sheet. Absent on older calculations."
        },
        "setup_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Setup Time S",
          "description": "One-time setup time for the whole lot at this lot size, in seconds (NOT per unit; divide by the quantity for the per-unit share). The time twin of the cost curve — quoting / scheduling read time and cost vs quantity in one call. Absent on older calculations."
        },
        "unit_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Unit Time S",
          "description": "Time per unit at this lot size across every activity, in seconds: the machine time below, plus the bench work, plus the per-part programming and inspection shares at this quantity. The same quantity `time_breakdown.unit_time_s` states for the calculation, so one name means one thing at every lot size — and never smaller than `machine_time_s`. Excludes the lot setup (see `setup_time_s`). Absent on older calculations, and on calculations priced before the run and the envelope were told apart, where this field held the run (`run_time_s` present means the split is in force)."
        },
        "run_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Run Time S",
          "description": "Machine run time per unit at this lot size, in seconds — the billable run (cycle with allowances and handling) with the learning curve applied; the basis the lot chips share. Excludes the finishing pass, the bench work and the per-part programming / inspection shares. Absent on older calculations."
        },
        "bench_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Bench Time S",
          "description": "Operator-only bench time per unit at this lot size, in seconds (deburring, packaging) under the allowance — the machine is free while it runs. Absent on older calculations."
        },
        "machine_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Machine Time S",
          "description": "Machine time per unit at this lot size, in seconds: the billable run plus the finishing pass under the allowance — the same figure as time_breakdown.machine_time_s at the ordered lot. Absent on older calculations."
        },
        "replan_recommended": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "title": "Replan Recommended",
          "description": "Present and true when this lot lies on the other side of a lot-dependent choice the ordered lot's plan made (a rest-machining pass folded into one tool at a small lot, or split across two at a large one): the figures are right for the plan they were priced from, and a calculation run at this lot may plan differently. Never set at the ordered lot."
        },
        "replan_at_lot": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "title": "Replan At Lot",
          "description": "With replan_recommended: the lot size at which the plan changes on the way from the ordered lot to this one — the exact quantity the planner's choice flips at. Absent when the calculation recorded only the direction of the choice."
        },
        "effective_unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "title": "Effective Unit Cost",
          "description": "Unit cost at this lot size including the per-piece share of annual inventory holding — the basis the recommended lot minimises. Recorded for the quantities the calculation's own curve priced; absent at a restated quantity and on older calculations. The basis is fitted to that recorded grid (it recovers the lot-variable cost from it), so deriving it for an off-grid quantity here would be a second arithmetic that could disagree with the one the recommendation came from — compare an off-grid lot against the optimum on `unit_cost`, which is exact at every quantity."
        },
        "effective_unit_cost_by_scenario": {
          "anyOf": [
            {
              "additionalProperties": {
                "type": "number"
              },
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "title": "Effective Unit Cost By Scenario",
          "description": "The same basis per lot-size scenario, keyed by scenario: buyer_stock (the buyer orders in lots and holds the stock; price plus its ordering cost per order plus holding on the price), supplier_stock (the supplier produces ahead of a steady call-off at its finite production rate and holds the stock), make_to_order (the order ships complete and is consumed on delivery; only the supplier's work in progress is held), joint (a frame contract with call-offs, both parties' setups, orders and stock minimised together) and consignment (the frame contract under a consignment-stock/VMI agreement: the supplier owns the stock at the buyer's site until it is drawn, so every unit's capital is tied up at the supplier's cost and storage is paid where the unit sits). effective_unit_cost is the buyer_stock value. Absent on older calculations."
        },
        "machine_id_at_n": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Machine Id At N",
          "description": "The machine this lot size was priced on. Usually the calculation's own; a lot size where the route's runner-up is cheaper is priced on that machine instead, and the curve's machine_names map and alternative_quantities say so. Absent on older calculations."
        },
        "machine_name_at_n": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Machine Name At N",
          "description": "The name of the machine this lot size was priced on, where the calculation names it (a restated quantity always does)."
        },
        "machine_ids_at_n": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "title": "Machine Ids At N",
          "description": "Every machine this lot size is priced on, in route order, when the route runs on more than one — a part punched then folded is priced on both, and machine_id_at_n names only the first. The curve's machine_names map names each of them. Absent on a single-machine route and on older calculations."
        },
        "cost_sheet": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicCostSheet"
            },
            {
              "type": "null"
            }
          ],
          "description": "The itemised cost sheet at this lot size. Absent on older calculations."
        }
      },
      "type": "object",
      "title": "PublicLotSizePoint",
      "description": "One quantity on the cost-versus-lot-size curve.\n\nTHE BASIS. Every money figure on this point — and on the curve's\noptimum — is in the calculation's own currency (the curve's\n``currency``), on the same basis as the calculation's unit_cost and\noffer_price, so no factor is needed to compare a point to the headline.\nThe curve is the model's series at full precision; the calculation\nstates its unit_cost and offer_price rounded once, so the point at the\nordered quantity reproduces both to within that rounding. The figures to\nquote at a quantity are the point's own, rounded the same way — what\nthat point's cost_sheet adds up to."
    },
    "PublicLotSizeRecommendation": {
      "description": "One machine-readable optimization direction (≤ 2 per calculation).",
      "properties": {
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Recommendation kind: adjust_lot_size or reduce_setup_time.",
          "title": "Kind"
        },
        "params": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Raw figures behind the recommendation (quantities, EUR/yr).",
          "title": "Params"
        }
      },
      "title": "PublicLotSizeRecommendation",
      "type": "object"
    },
    "PublicLotSizeScenarioOptimum": {
      "description": "One lot-size scenario's answer on the same curve — who holds the\nstock decides which annual cost the lot minimises. Money in the\ncalculation's currency, like the optimum it belongs to.",
      "properties": {
        "scenario": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "buyer_stock | supplier_stock | make_to_order | joint | consignment — see PublicLotSizePoint.effective_unit_cost_by_scenario.",
          "title": "Scenario"
        },
        "quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Recommended lot under this scenario: the smallest lot within the materiality band of that scenario's cost minimum, capped at one year of demand.",
          "title": "Quantity"
        },
        "effective_unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "This scenario's per-piece basis at the recommended lot.",
          "title": "Effective Unit Cost"
        },
        "current_effective_unit_cost": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "This scenario's per-piece basis at the ordered lot.",
          "title": "Current Effective Unit Cost"
        },
        "net_annual_saving": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per year, of moving from the ordered lot to the recommended one under this scenario.",
          "title": "Net Annual Saving"
        },
        "closed_form_quantity": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The scenario's textbook closed form beside the curve search: the buyer's EOQ on the price with its ordering cost (buyer_stock), the economic production quantity with the finite rate correction (supplier_stock), the lot the supplier's work in progress turns the cost back up at (make_to_order, only with a stated production rate), the joint call-off quantity (joint), or the same form with the buyer's half-lot valued at the supplier's cost (consignment). Absent where the form has no minimum.",
          "title": "Closed Form Quantity"
        },
        "coverage_capped": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when the one-year coverage cap fixed the recommendation rather than cost.",
          "title": "Coverage Capped"
        },
        "shipments_per_lot": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "joint and consignment: call-offs the supplier makes in one production lot.",
          "title": "Shipments Per Lot"
        },
        "production_lot": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "joint and consignment: the supplier's production lot, shipments_per_lot × the call-off quantity.",
          "title": "Production Lot"
        },
        "holding_cost_per_unit_year": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The holding cost per piece and year this scenario charges the lot's own stock at: on the buyer's price for the buyer's stock, on the supplier's inventory value for the supplier's (see the optimum's valuation_basis).",
          "title": "Holding Cost Per Unit Year"
        },
        "supplier_holding_cost_per_unit_year": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "joint and consignment: the holding cost per piece and year on the supplier's side of the stock.",
          "title": "Supplier Holding Cost Per Unit Year"
        },
        "production_rate_insufficient": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when the route cannot make one year's demand in one year at its stated machine hours; the scenario's stock terms then assume production never pauses.",
          "title": "Production Rate Insufficient"
        },
        "no_holding_optimum": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "make_to_order without a stated production rate: no stock is held anywhere, so the basis only falls with the lot and the recommendation is bounded by coverage, not by cost.",
          "title": "No Holding Optimum"
        }
      },
      "title": "PublicLotSizeScenarioOptimum",
      "type": "object"
    },
    "PublicMaterialResolution": {
      "description": "How the priced material resolved — surfaced so an assumed / fallback\ngrade is visible and correctable rather than silent. ``resolved`` is False\nwhen nothing bound and the part was priced on the environment's default\nmaterial.",
      "properties": {
        "resolved": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when a catalogue grade was bound (and priced); False when priced on a default.",
          "title": "Resolved"
        },
        "grade_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Name of the grade the part was priced on, when resolved.",
          "title": "Grade Name"
        },
        "grade_urn": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "URN of the grade the part was priced on, when resolved.",
          "title": "Grade Urn"
        },
        "source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Where the priced material came from: 'request' (caller-supplied), 'drawing_title_block' (read from the part's own drawing), 'step_material_property' (read from the material the STEP file names for the part), 'assembly_parts_list' (the row of an assembly drawing's parts list that names the component), 'assembly_drawing_title_block' (an assembly's own drawing, applied to its components), 'assembly_parts_list_dominant' (no row names the component: the grade more than half of the list's made rows name, an inference) or 'environment_default' (nothing named one, so the environment's default material was priced). The first that names a material wins, in that order: request, drawing, parts-list row, assembly drawing or dominant grade, STEP file, environment default. Null when nothing resolved on a calculation priced before the platform recorded the default as a source. Branch on this to detect a material the engine assumed on your behalf.",
          "title": "Source"
        },
        "priced_as": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The material the calculation was priced as, by its short name: the bound grade (e.g. '1.0038'), or the environment's default material when resolved is false (e.g. 'C45 (1.0503)'). On an assembly whose components name their own materials, each material they are priced in, comma-separated. Null on a calculation priced before the platform recorded it.",
          "title": "Priced As"
        },
        "note": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Plain-language description of the material assumption.",
          "title": "Note"
        },
        "stock": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicMaterialStock"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The stock the part is bought as, and its mass balance: what was bought, what ships in the part, what is scrap and what goes back to stock. Present on every calculation that bills a material mass; absent on a catalogue part and on a calculation priced before 2026-08-28, which recorded no material detail. A calculation priced before the 2026-09-26 release states the stock and the masses bought and shipped, without the scrap and remnant masses, and a bar without its length."
        }
      },
      "title": "PublicMaterialResolution",
      "type": "object"
    },
    "PublicMaterialStock": {
      "description": "The stock this part is bought as, and where its metal goes.\n\npurchased_mass_kg = part_mass_kg + scrap_mass_kg + remnant_mass_kg,\nexactly (to rounding): every kilogram bought ships in the part, goes\nback to stock as a reusable remnant, or leaves as scrap. The masses are\nthe theoretical ones a mill invoices — nominal size and thickness at\nthe grade's density — in kilograms whatever the calculation's currency.\nscrap_mass_kg and remnant_mass_kg are absent where the purchase cannot\nbe split that way: where the part's own mass is not known, or where\nless stock is billed than the part weighs.\n\nWhich dimensions are stated depends on the kind of stock: a sheet or a\nblock states its length, width and thickness, a bar or a tube its length\nand diameter, and a part bought as one piece of stock per body\n(compound) the number of pieces. A part priced on a blank with no\nmodelled stock form (a near-net or profile blank) states its masses\nonly.",
      "properties": {
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What is bought: 'sheet', 'bar', 'block', 'tube' or 'compound'. Absent where the part was priced on a blank with no modelled stock form.",
          "title": "Kind"
        },
        "format_label": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The name of the stock format the part was priced on, as the stock-formats list shows it — your own name for a format of yours. Absent when no listed format priced it (a plate ordered cut to size, or a standard format that carries no name).",
          "title": "Format Label"
        },
        "format_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The id of that stock format's version (GET /stock-formats/{id}).",
          "title": "Format Id"
        },
        "format_key": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The stable key of that stock format, which a new version of it keeps.",
          "title": "Format Key"
        },
        "format_source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Who chose the stock: 'requested' (the stock_format_id this calculation asked for), 'custom' (the sheet size this calculation stated as stock_format_mm), 'own_format' (of the formats on offer, one of your own used the least material) or 'standard' (a standard format did; bar, block and tube stock is always bought in standard sizes). Absent where no format was chosen: a plate ordered cut to size, stock bought as one piece per body.",
          "title": "Format Source"
        },
        "requested_format_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The stock_format_id this calculation asked for, when that format did not price it. Absent when none was asked for, or when it priced.",
          "title": "Requested Format Id"
        },
        "requested_format_label": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The name of the format asked for, when it did not price the part.",
          "title": "Requested Format Label"
        },
        "pin_unavailable_reason": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Why the format asked for did not price the part: 'too_small_for_blank', 'machine_cannot_hold', 'not_stocked_gauge', 'not_stocked_material', or 'not_available' (not on your list at the calculation's date).",
          "title": "Pin Unavailable Reason"
        },
        "length_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The stock's length in mm: a sheet's or a block's longer side, the length of bar the part is cut from, the length of tube bought for one part. Absent on a bar priced before the 2026-09-26 release, which recorded its diameter only.",
          "title": "Length Mm"
        },
        "width_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The stock's width in mm — sheet and block only.",
          "title": "Width Mm"
        },
        "thickness_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The thickness bought, in mm — sheet and block only. See measured_mm for what the part measures.",
          "title": "Thickness Mm"
        },
        "diameter_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The outside diameter bought, in mm — bar and tube only.",
          "title": "Diameter Mm"
        },
        "wall_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The wall of the tube bought, in mm.",
          "title": "Wall Mm"
        },
        "measured_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the part measures in the dimension its stock is bought by — a thickness or a diameter — in mm. Absent where no reading measured it and the thickness bought was estimated from the part's shape.",
          "title": "Measured Mm"
        },
        "size_rounded_up": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whether the size bought is a standard size above what the part needs from it. A sheet, a bar or a tube needs measured_mm; a turned bar is bought with the allowance its finishing pass removes, so it says true unless it is bought at its final diameter. A block needs measured_mm plus one finishing allowance per machined face, so a block bought at exactly that thickness says false although it is thicker than measured_mm. Absent where measured_mm is.",
          "title": "Size Rounded Up"
        },
        "parts_per_stock": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How many parts one piece of stock yields: parts per sheet or per bar; 1 for a plate ordered cut to size, a tube length, a block and a compound.",
          "title": "Parts Per Stock"
        },
        "stock_pieces": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How many pieces of stock one part is bought as — a compound's one per body.",
          "title": "Stock Pieces"
        },
        "layout_method": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How the count was arrived at: 'rectangle_estimate' (the part's blank rectangle laid out in rows on the sheet, one orientation per sheet), 'mixed_rectangles' (blank rectangles laid out on the sheet in both orientations, where that fits more of them), 'true_shape' (the part's own outline nested on the sheet rather than its rectangle), 'shared_sheets' (nested with other parts of a job on sheets they share; the stock is this part's share of those sheets), 'cut_to_size' (one plate ordered to size, nothing laid out), 'bar_lengths' (parts cut one after another from a bar), 'tube_cut_length' (one tube length bought per part), 'sawn_section' (a block section sawn per part) or 'per_body' (one piece of stock per body). New methods may appear.",
          "title": "Layout Method"
        },
        "machine_bed_l_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Length of the bed of the machine that cuts the sheet, in mm: the formats it cannot load were not on offer.",
          "title": "Machine Bed L Mm"
        },
        "machine_bed_w_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Width of that machine's bed, in mm.",
          "title": "Machine Bed W Mm"
        },
        "purchased_mass_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The stock bought for one part, in kg.",
          "title": "Purchased Mass Kg"
        },
        "part_mass_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The finished part, in kg.",
          "title": "Part Mass Kg"
        },
        "scrap_mass_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What the stock bought carries beyond the part and a reusable remnant, in kg: the sheet skeleton and cut-outs, chips, cut-offs — and, where the size bought was rounded up, the extra thickness the part ships with.",
          "title": "Scrap Mass Kg"
        },
        "remnant_mass_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The reusable remnant this part's share of the stock leaves — a rest of the sheet, an end of the bar or tube — in kg, returned to stock. 0 unless the environment credits remnants.",
          "title": "Remnant Mass Kg"
        },
        "utilisation_net": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The part's area over the sheet area it used up, as a fraction — sheet only. The area used up is the part's share of the sheet less a reusable remnant that goes back to stock, or its whole share where the costing environment does not credit remnants.",
          "title": "Utilisation Net"
        },
        "utilisation_gross": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The part's area over its whole share of the sheet, as a fraction — sheet only.",
          "title": "Utilisation Gross"
        },
        "common_line_length_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The cut this part shares with its neighbours on the sheet, in mm per part — one cut separating two parts where their straight edges meet. Present only where the costing environment cuts on a common line; 0 where the layout shares none. Sheet only.",
          "title": "Common Line Length Mm"
        }
      },
      "title": "PublicMaterialStock",
      "type": "object"
    },
    "PublicOperationTime": {
      "description": "One machining operation and the phases of its cycle time.\n\nPer unit, in the order the engine planned them — the positions the cost\nsheet's ``op_refs`` point at. The four phases are what the machine spends\nper part on this operation; they add up to the operation's share of the\ncycle time before any allowance.",
      "properties": {
        "process": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Manufacturing process for this operation, e.g. Drilling, Pocket milling.",
          "title": "Process"
        },
        "feature_ref": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Opaque reference to the feature this operation machines, so operations on one feature can be grouped. Meaningful only within this calculation; it carries no geometry. Null on an operation that machines no single feature, such as stock preparation.",
          "title": "Feature Ref"
        },
        "productive_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cutting time per unit for this operation, in seconds.",
          "title": "Productive S"
        },
        "air_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Non-cutting positioning time per unit, in seconds.",
          "title": "Air S"
        },
        "peck_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Retract time per unit for chip clearing, in seconds. Zero on an operation that does not peck.",
          "title": "Peck S"
        },
        "finishing_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finishing-pass time per unit for this operation, in seconds — part of finishing_time_s, not of the cycle time.",
          "title": "Finishing S"
        }
      },
      "title": "PublicOperationTime",
      "type": "object"
    },
    "PublicOptimization": {
      "description": "Research-grounded optimization findings for the calculation.",
      "properties": {
        "version": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Findings schema version.",
          "title": "Version"
        },
        "findings": {
          "items": {
            "$ref": "#/$defs/PublicOptimizationFinding"
          },
          "title": "Findings",
          "type": "array"
        }
      },
      "title": "PublicOptimization",
      "type": "object"
    },
    "PublicOptimizationFinding": {
      "description": "One research-grounded optimization direction (human or agent).",
      "properties": {
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finding kind, e.g. adjust_lot_size, improve_material_utilization.",
          "title": "Kind"
        },
        "lever": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Lever family: lot_size, setup, design, material, sourcing, or quality.",
          "title": "Lever"
        },
        "audience": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "'human' for headline directions, 'agent' for denser signals an AI optimization agent weighs.",
          "title": "Audience"
        },
        "confidence": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "'quantified' (an exactly computed saving) or 'directional' (needs requote / RFQ / product decision).",
          "title": "Confidence"
        },
        "method": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Research method the finding implements.",
          "title": "Method"
        },
        "params": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Raw figures behind the finding: shares, quantities and money. Money keys are basis-neutral (``annual_saving_if_halved``, ``uplift_per_piece``) and in the calculation's own currency.",
          "title": "Params"
        },
        "saving_per_year": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Estimated annual saving, in the calculation's currency.",
          "title": "Saving Per Year"
        },
        "saving_per_piece": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Estimated per-piece saving, in the calculation's currency.",
          "title": "Saving Per Piece"
        }
      },
      "title": "PublicOptimizationFinding",
      "type": "object"
    },
    "PublicPackagingDerivation": {
      "description": "What packing is made of: per piece, per carrier, per order.",
      "properties": {
        "per_part_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds to place one piece."
        },
        "per_container_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds to make up and label one carrier."
        },
        "parts_per_container": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Pieces one standard carrier holds.",
          "title": "Parts Per Container"
        },
        "per_lot_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds to despatch the order, once."
        },
        "batch_size": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Lot the despatch is amortised over.",
          "title": "Batch Size"
        },
        "charged": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "False on a machine that is not the one charged for the part-level work.",
          "title": "Charged"
        },
        "seconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Packing seconds per part.",
          "title": "Seconds"
        },
        "parts": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicPackagingDerivation"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per-machine entries on a multi-machine route.",
          "title": "Parts"
        }
      },
      "title": "PublicPackagingDerivation",
      "type": "object"
    },
    "PublicPartRequirements": {
      "description": "What the part demands of a machine: size, weight, access and tolerance.\n\nPresent on a failed run as well as a priced one, because a run that found\nno capable machine is exactly when this is the question. Every value is a\nmeasurement of the part, not a description of how the platform derived it.",
      "properties": {
        "bbox_mm": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Bounding box [x, y, z] in millimetres.",
          "title": "Bbox Mm"
        },
        "mass_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Part mass in kilograms.",
          "title": "Mass Kg"
        },
        "n_simultaneous_axes": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machine axes that must move together to reach the part's features.",
          "title": "N Simultaneous Axes"
        },
        "n_indexable_clusters": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Distinct orientations the part must be re-clamped into.",
          "title": "N Indexable Clusters"
        },
        "n_oblique_clusters": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Groups of angled features that need a tilting machine rather than a plain 3-axis one.",
          "title": "N Oblique Clusters"
        },
        "required_iso_286_grade": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Tightest ISO 286 tolerance grade the part requires (e.g. IT7).",
          "title": "Required Iso 286 Grade"
        },
        "process_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Primary manufacturing process for this part.",
          "title": "Process Class"
        },
        "material_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Material family (e.g. steel, aluminium).",
          "title": "Material Class"
        },
        "required_process_classes": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Every manufacturing process the part's features require.",
          "title": "Required Process Classes"
        },
        "required_certifications": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Certifications the RFQ requires a machine to hold.",
          "title": "Required Certifications"
        },
        "feature_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of machinable features detected.",
          "title": "Feature Count"
        },
        "sheet_thickness_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Plate gauge, for sheet-metal parts only. Null on solid parts, where the same measurement would carry no sheet-metal meaning.",
          "title": "Sheet Thickness Mm"
        },
        "developed_blank_lw_mm": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Unfolded blank [length, width] in millimetres, for folded sheet-metal parts. This — not the folded bounding box — is what a cutting bed or a press brake has to hold. Null when the part is not judged on a developed blank.",
          "title": "Developed Blank Lw Mm"
        },
        "work_envelope_mm": {
          "anyOf": [
            {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Work envelope [x, y, z] in millimetres, for a length of purchased mill form (a bought profile, channel or tube). This — not the whole stock length — is what a machining centre has to reach: the span of the features it cuts plus the grip that holds them, along the section's length only. The two cross-section extents stay the part's own, because the section still has to pass the machine whole. Null when the part is not judged on a work envelope.",
          "title": "Work Envelope Mm"
        },
        "work_envelope_clampings": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How many times the section is clamped to reach all of its work: clamp, cut what the travel reaches, reposition, cut the rest. Null when the part is not judged on a work envelope, in which case it is clamped for its orientations alone.",
          "title": "Work Envelope Clampings"
        }
      },
      "title": "PublicPartRequirements",
      "type": "object"
    },
    "PublicPipelineNote": {
      "description": "Something the engine wants the reader to know about this run.\n\nMachine-readable only: ``code`` is stable and ``params`` carries raw\nvalues, so a caller writes the sentence in its own words and its own\nlanguage. The English prose the first-party app falls back to is not\npublished — it is engine wording, not a contract.",
      "properties": {
        "code": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable identifier for what the note says. Branch on this; new codes may appear, so treat an unknown one as informational.",
          "title": "Code"
        },
        "params": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Values the note refers to. Keys depend on ``code``.",
          "title": "Params"
        }
      },
      "title": "PublicPipelineNote",
      "type": "object"
    },
    "PublicPlaneDerivations": {
      "description": "What each time figure above is made of — the counts, lengths, areas and\nrates it was computed from.\n\nEvery entry's own parts reproduce its ``seconds``, so a figure can be\nchecked rather than taken on trust: setup from its work elements,\ninspection from its characteristics and sample share, deburring from its\nedge length and hole count, finishing from its swept area and feed.",
      "properties": {
        "setup": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicSetupDerivation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "programming": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicProgrammingDerivation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "inspection": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicInspectionDerivation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "deburr": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicDeburrDerivation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "finishing": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicFinishingDerivation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "packaging": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicPackagingDerivation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "load_unload": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicLoadUnloadDerivation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "allowances": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAllowanceDerivation"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "title": "PublicPlaneDerivations",
      "type": "object"
    },
    "PublicProcessGap": {
      "description": "The work no machine that can hold the part offers: the part's process\ntogether with what the nearest such machine lacks.",
      "properties": {
        "process_classes": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable codes for the processes the part needs together, its own process first. No machine that holds the part performs all of them.",
          "title": "Process Classes"
        },
        "holder_machine": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The machine that holds the part and performs its own process, lacking the fewest others.",
          "title": "Holder Machine"
        },
        "holder_missing_process_classes": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable codes for the processes that machine lacks.",
          "title": "Holder Missing Process Classes"
        }
      },
      "title": "PublicProcessGap",
      "type": "object"
    },
    "PublicProcessPlan": {
      "description": "The ordered process plan (routing) for the part — the sequence of\noperations that make it, each with its process, work center, and cycle\ntime, plus the plan-level setup, cycle, and total time and the machine(s)\nit runs on.\n\nThe sequence runs to the finished part: the machining steps first, then the\npost-machining chain (welding, heat treatment, surface finishing, coating)\nin the order it is performed. The trailing steps carry no ``cycle_time_s`` —\nan outsourced treatment is priced per order, not in machine seconds — and are\ntherefore not part of the plan-level ``cycle_time_s`` either. What each of\nthem is charged is in ``subcontract_per_part``, and those charges make up\nthe ``subcontract_cost`` line.\n\nThis is the work-plan *result* a work-preparation (Arbeitsvorbereitung) or\noperations user acts on. Two honest limits reflect how the engine models\ncost: setup is planned per *setup* (not per operation) and amortised over\nthe lot, so it is reported once at the plan level; and machining cost\nattributes to features, not operations, so a machining step carries no cost\nof its own (see ``cost_drivers`` for the feature-level cost breakdown). An\noutsourced post-machining step is the exception — it is bought per operation,\nso it is the one kind of step that reports what it costs.",
      "properties": {
        "currency": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ISO 4217 code of the calculation's own currency — the one every money figure on this plan is in. Null only on a record too old to state it.",
          "title": "Currency"
        },
        "machines": {
          "description": "Machine(s) / work center(s) the plan runs on, in route order.",
          "items": {
            "type": "string"
          },
          "title": "Machines",
          "type": "array"
        },
        "clampings": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicClamping"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How many times each machine clamps the part, in route order — the same count the route was costed on. Absent when the route did not state a count.",
          "title": "Clampings"
        },
        "setup_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "One-time setup time for the whole lot, in seconds (NOT per unit; divide by the lot size for the per-unit share).",
          "title": "Setup Time S"
        },
        "cycle_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Total machining cycle time per unit, in seconds.",
          "title": "Cycle Time S"
        },
        "unit_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Total time per unit in seconds, every work system: the machine run, the finishing pass and the bench work under the allowance, plus the per-unit shares of programming and inspection. Excludes the one-time lot setup above; larger than machine_time_s by the bench work and those shares.",
          "title": "Unit Time S"
        },
        "machine_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machine time per unit in seconds: the billed run plus the finishing pass, under the allowance factor. Absent on older calculations.",
          "title": "Machine Time S"
        },
        "operation_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of process steps in the plan.",
          "title": "Operation Count"
        },
        "operations": {
          "items": {
            "$ref": "#/$defs/PublicRoutingOperation"
          },
          "title": "Operations",
          "type": "array"
        },
        "unpriced": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicUnpricedWork"
              },
              "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. Absent when the route covers what the drawing asks for.",
          "title": "Unpriced"
        },
        "price_completeness": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "``complete`` when the price covers everything the drawing asks for; ``partial`` when ``unpriced`` lists work it leaves out — then the price is a lower bound for the drawing. Absent on a calculation from before the contract.",
          "title": "Price Completeness"
        }
      },
      "title": "PublicProcessPlan",
      "type": "object"
    },
    "PublicProgrammingDerivation": {
      "description": "What programming time is made of: the job, its tools, its toolpaths.\n\nRates are null where this entry holds none — see\n:class:`PublicSetupDerivation`.",
      "properties": {
        "n_programmed_elements": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Toolpaths to draw. A hole pattern counts once; three pockets on one cutter count three.",
          "title": "N Programmed Elements"
        },
        "n_distinct_tools": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Tools to stage in the program.",
          "title": "N Distinct Tools"
        },
        "base_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Job start: open the session, post the program, prove it out. Seconds."
        },
        "per_tool_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds to stage one tool: speeds, feeds, offsets."
        },
        "per_element_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds to draw one toolpath."
        },
        "grind_per_lot_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Grinding is programmed as one figure for the lot rather than per toolpath — when it is set, it is the whole programming time, and the rates above are null because none was used."
        },
        "programming_efficiency": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Your shop's programming pace against the published work elements (1.0 = as published). Null on a route spanning several machines: each entry in 'parts' carries its own."
        },
        "batch_size": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Lot the job is amortised over.",
          "title": "Batch Size"
        },
        "per_lot_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Programming seconds for the whole job.",
          "title": "Per Lot S"
        },
        "seconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Programming seconds per part.",
          "title": "Seconds"
        },
        "parts": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicProgrammingDerivation"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "One entry per machine on a multi-machine route; their seconds sum to this one's.",
          "title": "Parts"
        }
      },
      "title": "PublicProgrammingDerivation",
      "type": "object"
    },
    "PublicRate": {
      "description": "One rate a time figure was computed at, and where it came from.",
      "properties": {
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The rate itself.",
          "title": "Value"
        },
        "source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Who supplied it: 'yours' (a value set on your environment), 'calibrated' (learned from reported costs), or 'platform' (the published default). Null when the figure is a machine capability or a measurement rather than a settable rate.",
          "title": "Source"
        }
      },
      "title": "PublicRate",
      "type": "object"
    },
    "PublicReview": {
      "description": "Whether this quote needs a human before it is sent, and why.",
      "properties": {
        "needs_human_review": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True if the extraction or price warrants human review.",
          "title": "Needs Human Review"
        },
        "reasons": {
          "description": "Plain-language review triggers.",
          "items": {
            "type": "string"
          },
          "title": "Reasons",
          "type": "array"
        },
        "reason_codes": {
          "description": "Stable identifiers for the same triggers, in the same order as ``reasons``. Branch on ``code``; new codes may appear, so treat an unknown one as informational.",
          "items": {
            "$ref": "#/$defs/PublicPipelineNote"
          },
          "title": "Reason Codes",
          "type": "array"
        }
      },
      "title": "PublicReview",
      "type": "object"
    },
    "PublicRoutingOperation": {
      "description": "One step in the process plan (routing), in sequence order.\n\nA *result*-level work-plan line — the manufacturing process, its position\nin the sequence, its per-step machining cycle time, the work center it runs\non, and, on an outsourced post-machining step, what that step is charged.",
      "properties": {
        "seq": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "1-based position of this step in the process sequence.",
          "title": "Seq"
        },
        "process": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Manufacturing process for this step, e.g. Turning, Drilling, Sawing.",
          "title": "Process"
        },
        "work_center": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machine / work center this step runs on; null when the plan spans several machines and the step cannot be attributed to one, and on a post-machining step (heat treatment, coating), which does not run on the cutting machine.",
          "title": "Work Center"
        },
        "cycle_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Productive machining time for this step per unit, in seconds — the steps sum to the plan's `cycle_time_s`; approach/overrun air, peck retracts and finishing passes are in `unit_time_s`. Null on a post-machining step: an outsourced treatment is priced per lot, not in machine seconds, so it contributes no cycle time.",
          "title": "Cycle Time S"
        },
        "feature_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How many distinct machined features this step covers. Null when the step attributes to none — stock preparation such as sawing, and every post-machining step.",
          "title": "Feature Count"
        },
        "subcontract_per_part": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What this step is charged per part at the ordered lot size, in the calculation's currency (the plan's ``currency``) on the same basis as cost_decomposition.subcontract_cost, of which it is part — the same amount secondary_route reports for the operation. Set only on an outsourced post-machining step (heat treatment, coating): a machining step is null, because machining cost attributes to features rather than to operations (see cost_drivers). Null too on a post-machining step whose charge was not recorded.",
          "title": "Subcontract Per Part"
        }
      },
      "title": "PublicRoutingOperation",
      "type": "object"
    },
    "PublicScrapPrice": {
      "description": "The price one class of scrap was credited at, and where it came from.",
      "properties": {
        "scrap_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Which scrap: 'sheet_skeleton' (the sheet skeleton, edge trim and cut-outs), 'chips' or 'drop' (bar ends and saw cut-offs).",
          "title": "Scrap Class"
        },
        "price_per_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What that scrap was credited at, per kilogram, in rate_currency. 0 when no price was found for it.",
          "title": "Price Per Kg"
        },
        "mass_kg": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "How much of this scrap one part leaves, in kg — the mass its price is credited on. The scrap credit is the sum over these entries of mass_kg x price_per_kg, carried into the calculation's currency, and never more than the material cost: where the scrap would sell for more, the credit is capped there.",
          "title": "Mass Kg"
        },
        "price_source": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Whose price it is: 'env_rate' (this environment's own), 'parent_env_rate' (a parent environment's), 'platform_grade' or 'platform_category' (the platform's reference price for the grade or the material category), 'env_setting' (the environment's flat return per kg, used where no scrap price is stated for this kind of scrap), or 'none' when no price was found — that scrap is then credited nothing.",
          "title": "Price Source"
        },
        "as_of": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The day the price describes (YYYY-MM-DD): for a platform reference, the end of the period it was reported for; for your own price, the day it took effect.",
          "title": "As Of"
        }
      },
      "title": "PublicScrapPrice",
      "type": "object"
    },
    "PublicSecondaryOperation": {
      "description": "A post-machining operation — coating, heat treatment, surface\nfinishing or part marking — named the way the governing standard names\nit, in English and German. Its two charges are in ``currency`` — the\ncalculation's own — on the same basis as the calculation's unit_cost.",
      "properties": {
        "currency": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "ISO 4217 code of the calculation's own currency — the one cost_per_part and lot_minimum are in. Null only on a record too old to state it.",
          "title": "Currency"
        },
        "family": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Operation family, e.g. coating or heat_treatment.",
          "title": "Family"
        },
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Specific operation, e.g. anodize or through_harden.",
          "title": "Kind"
        },
        "spec_reference": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Referenced standard, when one applies.",
          "title": "Spec Reference"
        },
        "term_en": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Standards-conformant English name of the process (ISO 4885 for heat treatment, the coating specification otherwise), e.g. 'quenching and tempering'.",
          "title": "Term En"
        },
        "term_de": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Standards-conformant German name of the process, e.g. 'Vergüten'.",
          "title": "Term De"
        },
        "din8580_code": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "DIN 8580 classification of the process, e.g. '6.2'.",
          "title": "Din8580 Code"
        },
        "params": {
          "anyOf": [
            {
              "additionalProperties": true,
              "type": "object"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Operation parameters read off the drawing's own callout, e.g. target hardness or coating thickness. A fixed set of keys per operation family; absent when the callout carried none.",
          "title": "Params"
        },
        "cost_per_part": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cost per part attributed to this operation at the ordered lot size, in the calculation's currency (``currency``) on the same basis as cost_decomposition.subcontract_cost, of which it is part.",
          "title": "Cost Per Part"
        },
        "lot_minimum": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The supplier's minimum order value for this operation, in the calculation's currency on the same basis as cost_per_part: one order is invoiced at the larger of its work and this. The difference is inside cost_per_part, spread over the lot, and is zero once the lot's own work is worth the minimum; given per order so it can be re-met at another quantity.",
          "title": "Lot Minimum"
        },
        "order_fee": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The supplier's fee per order for this operation, in the calculation's currency, charged on every order regardless of its value. Spread over the lot inside cost_per_part.",
          "title": "Order Fee"
        },
        "pricing_unit": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The cost basis this operation was priced on: kg (part mass), m2 (surface area), part (one piece) or m (metres of weld seam). The unit the supplier's rate is per.",
          "title": "Pricing Unit"
        },
        "driver_quantity": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The part's own quantity in pricing_unit — what the supplier's rate multiplies for one part (kg, m², pieces or m).",
          "title": "Driver Quantity"
        }
      },
      "title": "PublicSecondaryOperation",
      "type": "object"
    },
    "PublicSelection": {
      "description": "The machine the part was priced on, with a plain-language statement of\nthe route.",
      "properties": {
        "machine_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Name of the machine the part was priced on.",
          "title": "Machine Name"
        },
        "machine_klass": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Class slug of that machine (e.g. milling.3axis_vmc; 'buy' / 'saw' on catalogue-purchase and saw-and-supply routes).",
          "title": "Machine Klass"
        },
        "rationale_text": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Plain-language statement of the machine chosen and, on a route split across machines, the chain the part was priced on.",
          "title": "Rationale Text"
        }
      },
      "title": "PublicSelection",
      "type": "object"
    },
    "PublicSelectionAttempt": {
      "description": "One process the selection tried for the part, with its verdict.",
      "properties": {
        "process_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable code for the process tried.",
          "title": "Process Class"
        },
        "violation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable code for what stopped it.",
          "title": "Violation"
        },
        "closest_machine": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The machine that came closest on this attempt.",
          "title": "Closest Machine"
        },
        "measurement": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicBlockerMeasurement"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        }
      },
      "title": "PublicSelectionAttempt",
      "type": "object"
    },
    "PublicSelectionFailure": {
      "description": "Why no machine could make this part, as data rather than as a sentence.\n\nThe calculation's ``error`` string says the same thing in English; this is\nthe machine-readable form, so an integration can branch on ``violation``\nand a client can write the sentence in its own language.",
      "properties": {
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "no_feasible_machine, no_machines_configured, no_machines_active, or no_machine_could_be_evaluated.",
          "title": "Kind"
        },
        "evaluated_machines": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machines that were considered.",
          "title": "Evaluated Machines"
        },
        "inactive_memberships": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "On no_machines_active: machines this environment holds that were switched off or outside their validity window on the quote date.",
          "title": "Inactive Memberships"
        },
        "closest": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicSelectionFailureClosest"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "fleet": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicSelectionFailureFleet"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "remedy_violation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The requirement the suggested next step addresses.",
          "title": "Remedy Violation"
        },
        "holds_but_cannot": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicHoldsButCannot"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Set when every machine that holds the part lacks its process: the holders and the missing processes as codes."
        },
        "process_gap": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicProcessGap"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Set when the statement leads with work no machine that holds the part offers: the machines that perform the part's process all fall short, and one that holds it lacks another process the part needs. ``remedy_violation`` is then ``process_class_not_supported``."
        },
        "disabled_capable_machines": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicCapableMachine"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machines of this environment that could make the part but are switched off — the first remedy to try.",
          "title": "Disabled Capable Machines"
        },
        "attempts": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicSelectionAttempt"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Every process the selection tried, each with its verdict; ``closest`` is the headline, the part's own process.",
          "title": "Attempts"
        },
        "unresolvable": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicUnevaluatedMachine"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machines in the environment that could not be evaluated.",
          "title": "Unresolvable"
        }
      },
      "title": "PublicSelectionFailure",
      "type": "object"
    },
    "PublicSelectionFailureClosest": {
      "description": "The machine nearest to being able to make the part, and what stopped it.",
      "properties": {
        "machine_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Name of that machine.",
          "title": "Machine Name"
        },
        "violation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable code for the requirement it fails.",
          "title": "Violation"
        },
        "detail": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The measured values behind that failure.",
          "title": "Detail"
        },
        "measurement": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicBlockerMeasurement"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "process_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable code for the process this verdict is about — the part's own process, not the last one tried.",
          "title": "Process Class"
        },
        "missing_process_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "On a process refusal: stable code for the feature process this machine lacks (a press brake refusing a part for its laser-cut outline names ``laser_cut`` here, while ``process_class`` stays ``press_brake``).",
          "title": "Missing Process Class"
        },
        "grade": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicGradePair"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "On an ISO 286 refusal: the grade called out and the one that machine holds."
        },
        "axes": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicAxesFacts"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "On an axis-count refusal: the oblique work and the axes."
        },
        "other_violations": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable codes for the other requirements this machine fails, beyond ``violation``. Empty when that one is all.",
          "title": "Other Violations"
        },
        "other_missing_process_classes": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable codes for the part's other processes this machine does not perform, beyond ``violation``. Empty when it performs them all.",
          "title": "Other Missing Process Classes"
        }
      },
      "title": "PublicSelectionFailureClosest",
      "type": "object"
    },
    "PublicSelectionFailureFleet": {
      "description": "How widely the most common blocker is shared.\n\n``affected`` is counted over ``population`` — never over the whole\nenvironment — so the numbers can be reconciled against what the\nenvironment shows.",
      "properties": {
        "violation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable code for the most common requirement failed.",
          "title": "Violation"
        },
        "affected": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machines in ``population`` that fail it.",
          "title": "Affected"
        },
        "population": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machines that reached this requirement at all.",
          "title": "Population"
        },
        "process_incapable": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machines that cannot perform the required process at all.",
          "title": "Process Incapable"
        },
        "no_process_capable": {
          "anyOf": [
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "True when NO machine in the environment performs the required process, so ``population`` is the whole evaluated set rather than the capable subset. Read it before reconciling the counts: it is the difference between 'your capable machines were all blocked' and 'none of them was capable'.",
          "title": "No Process Capable"
        },
        "missing_process_classes": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable codes for the feature processes no machine in ``population`` performs — what 'none of them does X' may name. Empty when the refusals name different processes.",
          "title": "Missing Process Classes"
        },
        "detail": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The measured values behind that failure.",
          "title": "Detail"
        },
        "measurement": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicBlockerMeasurement"
            },
            {
              "type": "null"
            }
          ],
          "default": null
        },
        "shared_violations": {
          "anyOf": [
            {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable codes for the requirements EVERY evaluated machine fails, the leading one first. When the list is not empty, ``violation`` is that lead, ``closest`` is reported on it and the suggested next step addresses it. Empty when the machines fail on different points.",
          "title": "Shared Violations"
        },
        "shared_measurement": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicBlockerMeasurement"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "For the leading shared requirement: the part's value against the best limit any machine in the environment offers."
        },
        "shared_best_machine": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The machine that offers that best limit.",
          "title": "Shared Best Machine"
        }
      },
      "title": "PublicSelectionFailureFleet",
      "type": "object"
    },
    "PublicSetupDerivation": {
      "description": "What the lot's setup time is made of: the work elements, how many of\neach the part needs, and the rate each is charged at.\n\nA rate is null where this entry holds none: on a route spanning several\nmachines the counts add up but the rates do not compose, so each entry in\n``parts`` carries its own; on a grinding entry ``grind_per_lot_s`` is the\nwhole figure. The counts stay, so read them against ``parts`` there.",
      "properties": {
        "n_setups": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Clampings (part orientations) the plan needs.",
          "title": "N Setups"
        },
        "n_reclamps": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Re-clamps: one per orientation after the first.",
          "title": "N Reclamps"
        },
        "n_distinct_tools": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Distinct tools staged for the job.",
          "title": "N Distinct Tools"
        },
        "ruest_base_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Base setup: mount the workholding, load and test the program, set datums. Seconds."
        },
        "ruest_per_reclamp_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds per re-clamp and re-datum."
        },
        "ruest_per_tool_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Seconds to insert and touch off one tool."
        },
        "ruestverteilzeit_pct": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Distribution allowance on setup work, as a fraction."
        },
        "ruesterholzeit_pct": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Recovery allowance on setup work, as a fraction. Setting up and running are different work, so this is the setup plane's own allowance and not the run plane's erholzeit_pct."
        },
        "first_article_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "First-article measurement, booked once per lot during setup.",
          "title": "First Article S"
        },
        "handling_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Handling class of the workpiece being clamped — how it is moved (one hand, two hands, larger, two people, crane). Mass decides it when a mass is known, size otherwise, so it can differ from load_unload's size_class on a small heavy part.",
          "title": "Handling Class"
        },
        "size_factor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What that class multiplies the base setup by (1.0 = the unbanded figure). Below the class's own handling ratio, because only the workholding share of the base is banded: loading and proving out the NC program costs the same whatever the part weighs.",
          "title": "Size Factor"
        },
        "fixture_element_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Extra seconds when the workpiece is too big for the machine vice and is clamped to the table instead.",
          "title": "Fixture Element S"
        },
        "grind_per_lot_s": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Grinding is set up as one figure for the lot rather than from work elements — when it is set, it is the whole setup, and the rates above are null because none was used."
        },
        "setup_efficiency": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicRate"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Your shop's setup pace against the published work elements (1.0 = as published). Null on a route spanning several machines: each entry in 'parts' carries its own."
        },
        "magazine_overflow_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Manual tool swaps forced per lot when the job needs more tools than the machine's magazine holds.",
          "title": "Magazine Overflow S"
        },
        "seconds": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Setup seconds for the whole lot.",
          "title": "Seconds"
        },
        "parts": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicSetupDerivation"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "On a route spanning several machines, one entry per machine, in run order; their seconds sum to this one's.",
          "title": "Parts"
        }
      },
      "title": "PublicSetupDerivation",
      "type": "object"
    },
    "PublicStageTimings": {
      "description": "How long each stage of the calculation's last run took, in seconds. A\nstage that did not run is left out.",
      "properties": {
        "queue_wait_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "From submission until work on the calculation started.",
          "title": "Queue Wait S"
        },
        "run_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "From the start of work until the result. For an assembly, this spans its components and the roll-up.",
          "title": "Run S"
        },
        "extraction_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Reading the 3D model or flat pattern.",
          "title": "Extraction S"
        },
        "drawing_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Reading the 2D drawing.",
          "title": "Drawing S"
        },
        "rollup_wait_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Assemblies: from every component being priced until the roll-up into the assembly's price started.",
          "title": "Rollup Wait S"
        },
        "rollup_run_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Assemblies: the roll-up into the assembly's price.",
          "title": "Rollup Run S"
        },
        "preview_wait_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "From the request for the 3D preview of the part's file until it started. The same for every calculation of that file.",
          "title": "Preview Wait S"
        },
        "preview_run_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Building the 3D preview of the part's file. The same for every calculation of that file.",
          "title": "Preview Run S"
        }
      },
      "title": "PublicStageTimings",
      "type": "object"
    },
    "PublicTimeBreakdown": {
      "description": "Manufacturing times per category: setup, the machining cycle and its\nphases, the per-part shares of programming and inspection, and the\nhand-work that finishes the part.\n\nTwo bases, and each field says which it is on. Setup is stated once for the\nwhole lot; everything else is per unit.\n\nONE convention for the allowance, stated here rather than per field: the\nPHASES of the machine run (``cycle``, ``air``, ``peck``,\n``tool_change``, ``load_unload``) and the bench work (``deburr``,\n``packaging``) are Grundzeit — before the allowance factor, which is what\nthe per-operation rows and the derivations reproduce. The BILLED figures\ncarry it: ``machine_time_s`` (run + finishing pass) and ``bench_time_s``\n(the hand work as charged). So the four charged parts partition the\ntotal, and nothing else does:\n\n    machine_time_s + bench_time_s + programming_time_s\n        + inspection_time_s == unit_time_s\n\nSumming the raw phases instead lands short by the allowance on the hand\nwork — which is why the charged figure is published beside them rather\nthan left to be derived.",
      "properties": {
        "setup_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "One-time setup time for the whole lot, in seconds (NOT per unit; divide by the lot size for the per-unit share).",
          "title": "Setup Time S"
        },
        "cycle_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machining cycle time per unit, in seconds.",
          "title": "Cycle Time S"
        },
        "unit_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Total time per unit in seconds, every work system: the machine run (cycle, air, peck, tool change, load/unload), the finishing pass and the bench work (deburring, packaging), all under the allowance factor, plus the per-unit shares of programming and inspection; excludes the one-time lot setup. Larger than machine_time_s by the bench work and those shares.",
          "title": "Unit Time S"
        },
        "machine_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Machine time per unit in seconds: the billed run plus the finishing pass, under the allowance factor — the time the machine is occupied by one piece, and the per-unit figure the product's cost sheet states as t_e. Absent on older calculations.",
          "title": "Machine Time S"
        },
        "air_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Non-cutting positioning time per unit, in seconds — the sum of the per-operation air time.",
          "title": "Air Time S"
        },
        "peck_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Retract time per unit for chip clearing, in seconds — the sum of the per-operation peck time.",
          "title": "Peck Time S"
        },
        "tool_change_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Tool-change time per unit, in seconds. Per unit, not per lot: a change happens once per part per tool the plan uses.",
          "title": "Tool Change Time S"
        },
        "load_unload_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Loading and unloading the part per unit, in seconds — handling at the machine, not the one-time lot setup.",
          "title": "Load Unload Time S"
        },
        "finishing_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finishing time per unit as billed, in seconds: the finishing passes on the machine plus any part-level finishing the plan carries, under the machine's allowance factor. The same seconds the finishing line of the cost sheet and the lot-size curve state, and part of machine_time_s.",
          "title": "Finishing Time S"
        },
        "finishing_base_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finishing time per unit before the allowance factor (Grundzeit), in seconds: see finishing_time_s for what is billed.",
          "title": "Finishing Base Time S"
        },
        "deburr_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Deburring time per unit, in seconds — hand work at the labour rate, off the machine. Grundzeit, before the allowance factor: see bench_time_s for what is charged.",
          "title": "Deburr Time S"
        },
        "packaging_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Packaging time per unit, in seconds — hand work at the labour rate, off the machine. Grundzeit, before the allowance factor: see bench_time_s for what is charged.",
          "title": "Packaging Time S"
        },
        "bench_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Bench work per unit as CHARGED, in seconds: deburring plus packaging under the allowance factor — the hand-work figure inside unit_time_s and on the cost sheet. Absent on older calculations.",
          "title": "Bench Time S"
        },
        "programming_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Programming time per unit, in seconds: the lot's one-time programming already divided by the lot size (NOT a per-lot figure).",
          "title": "Programming Time S"
        },
        "inspection_time_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Inspection time per unit, in seconds — the per-part share of the lot's inspection, including the first article.",
          "title": "Inspection Time S"
        },
        "allowance_factor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Allowance the operator's recurring per-unit work carries above its base time (REFA Verteilzeit and Erholzeit, composed multiplicatively): 1.1495 means 10 % and 4.5 %. Applied to the operator's attended time, the hand work, and the loading and unloading on the machine, which the operator paces. Do NOT multiply the machine-paced phases by it: they carry machine_allowance_factor. Not applied to programming or inspection, which carry their own.",
          "title": "Allowance Factor"
        },
        "machine_allowance_factor": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Allowance the machine-paced phases carry above their base time — cutting, positioning, chip clearing, tool change and the finishing pass: the Verteilzeit alone (1.10 at 10 %), because recovery is a person's allowance. Loading and unloading is paced by the operator and carries allowance_factor instead. Equal to allowance_factor where a calculation states one factor only; absent on older calculations.",
          "title": "Machine Allowance Factor"
        },
        "operations": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicOperationTime"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Per-operation phase times, in plan order. The cost sheet's op_refs are positions in this list.",
          "title": "Operations"
        },
        "tools_used": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicToolUse"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The cutting tools this part was priced with, one row per distinct tool.",
          "title": "Tools Used"
        },
        "derivations": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicPlaneDerivations"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "What each figure above is made of: the counts, lengths, areas and rates it was computed from."
        }
      },
      "title": "PublicTimeBreakdown",
      "type": "object"
    },
    "PublicToolUse": {
      "description": "One cutting tool this part was priced with, and where it came from.\n\n``origin`` is ``crib`` when one of your own tools cut the feature and\n``platform_constant`` when none did and the engine priced with its own\nreference tool. In the second case ``fallback_reason`` says which of\nthree different situations it was — they have different owners and\ndifferent fixes, and a single ``platform_constant`` conflated them.",
      "properties": {
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Tool type, e.g. drill, end_mill, chamfer_mill.",
          "title": "Kind"
        },
        "diameter_mm": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Tool diameter in millimetres, when it has one.",
          "title": "Diameter Mm"
        },
        "teeth": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Number of cutting edges.",
          "title": "Teeth"
        },
        "tool_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Name of the tool from your own tool list; null when the engine priced with its reference tool instead.",
          "title": "Tool Name"
        },
        "origin": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "'crib' = one of your tools; 'platform_constant' = the engine's reference tool.",
          "title": "Origin"
        },
        "fallback_reason": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Why the engine used its reference tool. 'no_crib' = no tool list is set up; 'kind_unstocked' = your list holds no tool of this type; 'no_fit' = it holds some, and none fits this cut. Null when one of your own tools was used.",
          "title": "Fallback Reason"
        },
        "cutting_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Cutting time per unit, in seconds: the in-cut seconds of the operations this tool cut (their productive_s in time_breakdown.operations, at the positions in op_refs). Excludes rapids, tool changes and allowances, which sit on the machine time. Absent on older calculations.",
          "title": "Cutting S"
        },
        "finishing_s": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Finishing-pass time per unit, in seconds, when this tool runs the surface-finish sweep — a separate pass that belongs to no single operation and is charged on the finishing line. Absent on older calculations.",
          "title": "Finishing S"
        },
        "op_refs": {
          "description": "Positions in time_breakdown.operations of the operations this tool cut. Empty on older calculations and on a tool that only runs the finishing pass.",
          "items": {
            "type": "integer"
          },
          "title": "Op Refs",
          "type": "array"
        }
      },
      "title": "PublicToolUse",
      "type": "object"
    },
    "PublicUnevaluatedMachine": {
      "description": "A machine present in the environment that could not be evaluated.",
      "properties": {
        "name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Name of the machine.",
          "title": "Name"
        },
        "error": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Why its configuration could not be resolved.",
          "title": "Error"
        }
      },
      "title": "PublicUnevaluatedMachine",
      "type": "object"
    },
    "PublicUnitCostInterval": {
      "description": "The unit-cost prediction band: the range the actual unit cost is\nexpected to fall within.",
      "properties": {
        "lo": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Lower bound of the unit-cost prediction band.",
          "title": "Lo"
        },
        "hi": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Upper bound of the unit-cost prediction band.",
          "title": "Hi"
        }
      },
      "title": "PublicUnitCostInterval",
      "type": "object"
    },
    "PublicUnpricedRequirement": {
      "description": "The drawing callout a requirement entry leaves out of the price.",
      "properties": {
        "kind": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "grade (ISO 286), gdt (a tolerance zone) or ra.",
          "title": "Kind"
        },
        "value": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The callout — a grade such as IT6, a zone width, or an Ra.",
          "title": "Value"
        },
        "unit": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Unit of ``value``; null on a grade.",
          "title": "Unit"
        },
        "gdt_kind": {
          "anyOf": [
            {
              "enum": [
                "straightness",
                "flatness",
                "circularity",
                "cylindricity",
                "profile_of_line",
                "profile_of_surface",
                "perpendicularity",
                "parallelism",
                "angularity",
                "position",
                "concentricity",
                "coaxiality",
                "symmetry",
                "circular_runout",
                "total_runout"
              ],
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "On a gdt callout, the characteristic it tolerates (ISO 1101), e.g. parallelism or flatness; null otherwise.",
          "title": "Gdt Kind"
        }
      },
      "title": "PublicUnpricedRequirement",
      "type": "object"
    },
    "PublicUnpricedWork": {
      "description": "Work the drawing requires that no machine in the environment can do,\nso it is not in the price — the one list a partial price explains\nitself with. ``process`` and ``reason`` say it in words; the codes\nbeside them are what a client branches on and localises.",
      "properties": {
        "process": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The manufacturing process, in plain words — for example Cylindrical grinding, Surface grinding, or milling.",
          "title": "Process"
        },
        "reason": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Why this work is not in the price.",
          "title": "Reason"
        },
        "process_class": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable code for the process (drill_sheet, milling, grind_cylindrical, …); ``process`` is its label.",
          "title": "Process Class"
        },
        "violation": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Stable code for the requirement the closest machine failed, or the one disclosed instead of refusing the part.",
          "title": "Violation"
        },
        "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), add_machine_class, relax_callout, subcontract; on an assembly's welding, attach_weld_drawing and confirm_weld_scope.",
          "title": "Remedies"
        },
        "requirement": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicUnpricedRequirement"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The callout left out, when the entry is a requirement rather than a process."
        },
        "measurement": {
          "anyOf": [
            {
              "$ref": "#/$defs/PublicBlockerMeasurement"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The closest machine's two numbers behind ``violation``, when it has them."
        },
        "disabled_capable_machines": {
          "anyOf": [
            {
              "items": {
                "$ref": "#/$defs/PublicCapableMachine"
              },
              "type": "array"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Switched-off machines of this environment that could do this work.",
          "title": "Disabled Capable Machines"
        },
        "review_code": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "The review reason code this entry twins.",
          "title": "Review Code"
        },
        "feature_count": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ],
          "default": null,
          "description": "Features the work covers; 0 on a part-level requirement.",
          "title": "Feature Count"
        }
      },
      "title": "PublicUnpricedWork",
      "type": "object"
    },
    "StockFormatMm": {
      "properties": {
        "length_mm": {
          "type": "number",
          "maximum": 20000.0,
          "minimum": 100.0,
          "title": "Length Mm",
          "description": "The sheet's length in mm."
        },
        "width_mm": {
          "type": "number",
          "maximum": 20000.0,
          "minimum": 100.0,
          "title": "Width Mm",
          "description": "The sheet's width in mm."
        }
      },
      "additionalProperties": false,
      "type": "object",
      "required": [
        "length_mm",
        "width_mm"
      ],
      "title": "StockFormatMm",
      "description": "A sheet size stated by the caller, mm."
    }
  }
}