{
  "version": 3,
  "sources": ["/cdn/shop/t/10/assets/ev-tf-pro.js?tf_pro_build=20260520_v1_expert"],
  "sourcesContent": ["(function () {\n  var __modules = {\n  \"app/bootstrap.js\": function (exports, module, __bundle) {\n    var { createMemoryCache } = __bundle.require(\"catalog/cache.js\");\n    var { createProductPoolRepo } = __bundle.require(\"catalog/product-pool-repo.js\");\n    var { createVariantManifestRepo } = __bundle.require(\"catalog/variant-manifest-repo.js\");\n    var { createProductDetailRepo } = __bundle.require(\"catalog/product-detail-repo.js\");\n    var { createTelemetry } = __bundle.require(\"app/telemetry.js\");\n    var { createStore } = __bundle.require(\"app/store.js\");\n    var { createStateMachine } = __bundle.require(\"app/state-machine.js\");\n    var { createFinderContext } = __bundle.require(\"core/finder-context.js\");\n    var { buildQuestionState } = __bundle.require(\"core/question-engine.js\");\n    var { collectValidationIssues, hasBlockingIssues } = __bundle.require(\"core/validation-engine.js\");\n    var { scoringKernel } = __bundle.require(\"core/scoring-kernel.js\");\n    var { buildGuidanceResult, buildResult } = __bundle.require(\"core/result-engine.js\");\n    var { normalizeLegacyAnswers } = __bundle.require(\"compatibility/legacy-answer-normalizers.js\");\n    var { ensure } = __bundle.require(\"catalog/contracts.js\");\n    function createToolFinderApp(deps) {\n      var fetchImpl = deps.fetchImpl;\n      var cache = createMemoryCache();\n      var telemetry = deps.telemetry || createTelemetry();\n      var endpoints = deps.endpoints || null;\n      var runtimeConfig = deps.runtimeConfig || null;\n      var store = deps.store || createStore({\n        materialCode: null,\n        processId: null,\n        answers: {},\n        derived: {},\n        questionState: [],\n        result: null,\n      });\n      var stateMachine = deps.stateMachine || createStateMachine();\n      var registry = deps.registry;\n      var productPoolRepo = deps.productPoolRepo || createProductPoolRepo({ fetchImpl: fetchImpl, cache: cache, telemetry: telemetry });\n      var variantManifestRepo = deps.variantManifestRepo || createVariantManifestRepo({ fetchImpl: fetchImpl, cache: cache, telemetry: telemetry });\n      var productDetailRepo = deps.productDetailRepo || createProductDetailRepo({ fetchImpl: fetchImpl, cache: cache, telemetry: telemetry });\n    \n      function requireEndpoints() {\n        ensure(\n          endpoints &&\n          typeof endpoints.productIndex === \"function\" &&\n          typeof endpoints.variantManifest === \"function\" &&\n          typeof endpoints.productDetail === \"function\",\n          \"Tool Finder app requires Shopify endpoint contracts for catalog loading.\"\n        );\n        return endpoints;\n      }\n    \n      return {\n        telemetry: telemetry,\n        store: store,\n        stateMachine: stateMachine,\n        endpoints: endpoints,\n        runtimeConfig: runtimeConfig,\n        repos: {\n          productPool: productPoolRepo,\n          variantManifest: variantManifestRepo,\n          productDetail: productDetailRepo,\n        },\n        validateIntegration: function validateIntegration() {\n          return endpoints && typeof endpoints.validate === \"function\" ? endpoints.validate() : [];\n        },\n        inspectIntegration: function inspectIntegration() {\n          return {\n            runtimeConfig: runtimeConfig,\n            endpoints: endpoints && typeof endpoints.describe === \"function\" ? endpoints.describe() : [],\n          };\n        },\n        loadCatalogSnapshot: async function loadCatalogSnapshot() {\n          var products = await this.loadProductIndex();\n          var metadata = await this.loadProcessMetadata();\n          return {\n            productCount: products.length,\n            processMetadataCount: metadata && Array.isArray(metadata.processes) ? metadata.processes.length : 0,\n            endpoints: this.inspectIntegration().endpoints,\n          };\n        },\n        loadProductIndex: function loadProductIndex() {\n          return productPoolRepo.load(requireEndpoints().productIndex());\n        },\n        loadVariantManifestForProduct: function loadVariantManifestForProduct(productEntry) {\n          return variantManifestRepo.load(requireEndpoints().variantManifest(productEntry.ids.handle), productEntry);\n        },\n        loadCandidateDetail: function loadCandidateDetail(manifestCandidate) {\n          return productDetailRepo.load(requireEndpoints().productDetail(manifestCandidate.ids.handle, manifestCandidate.ids.variantId), manifestCandidate);\n        },\n        loadProcessMetadata: async function loadProcessMetadata() {\n          var activeEndpoints = endpoints;\n          var url;\n          var cacheKey;\n          var response;\n          if (!activeEndpoints || !activeEndpoints.hasProcessMetadata || !activeEndpoints.hasProcessMetadata()) {\n            return null;\n          }\n          ensure(typeof fetchImpl === \"function\", \"Tool Finder app requires a fetch implementation to load process metadata.\");\n          url = activeEndpoints.processMetadata();\n          cacheKey = \"process-metadata::\" + url;\n          if (cache.has(cacheKey)) return cache.get(cacheKey);\n          telemetry.record(\"catalog.process-metadata.load\", { url: url });\n          response = await fetchImpl(url);\n          ensure(response && response.ok !== false, \"Process metadata endpoint failed to load.\");\n          ensure(typeof response.json === \"function\", \"Process metadata endpoint must expose json().\");\n          cache.set(cacheKey, await response.json());\n          return cache.get(cacheKey);\n        },\n        buildQuestionState: function build(processId, answers) {\n          var processModule = registry.get(processId);\n          var toolkits = registry.getToolkits(processModule.toolkits);\n          var normalizedAnswers = normalizeLegacyAnswers(answers || {});\n          var ctx = createFinderContext({\n            processId: processId,\n            materialCode: store.getState().materialCode,\n            answers: normalizedAnswers,\n            derived: store.getState().derived,\n          });\n          var questions = processModule.getQuestions(ctx);\n          var runtime = buildQuestionState(questions, ctx, normalizedAnswers);\n          var preDerivedCtx = createFinderContext({\n            processId: processId,\n            materialCode: store.getState().materialCode,\n            answers: runtime.answers,\n            derived: runtime.derived,\n          });\n          var processDerived = processModule.derive(preDerivedCtx, toolkits) || {};\n          var finalDerived = Object.assign({}, runtime.derived, processDerived);\n          var nextCtx = createFinderContext({\n            processId: processId,\n            materialCode: store.getState().materialCode,\n            answers: runtime.answers,\n            derived: finalDerived,\n          });\n          var issues = collectValidationIssues(runtime.states, nextCtx, processModule, toolkits);\n          store.setState({\n            processId: processId,\n            answers: runtime.answers,\n            derived: finalDerived,\n            questionState: runtime.states,\n            questionViewModels: runtime.viewModels,\n            validationIssues: issues,\n          });\n          return Object.assign({}, runtime, { derived: finalDerived, issues: issues });\n        },\n        scoreCandidates: function scoreCandidates(candidates) {\n          var current = store.getState();\n          var processModule = registry.get(current.processId);\n          var normalizedAnswers = normalizeLegacyAnswers(current.answers || {});\n          var ctx = createFinderContext({\n            processId: current.processId,\n            materialCode: current.materialCode,\n            answers: normalizedAnswers,\n            derived: current.derived,\n          });\n          var toolkits = registry.getToolkits(processModule.toolkits);\n          var prefiltered;\n          var scored;\n          var result;\n    \n          if (hasBlockingIssues(current.validationIssues || [])) {\n            result = buildGuidanceResult(\n              current.processId,\n              \"insufficient_data\",\n              \"More input is required before a reliable recommendation can be built.\",\n              \"Complete the required Step 3 fields before running the process scorer.\",\n              [{ type: \"back_to_step3\", label: \"Complete required fields\" }]\n            );\n            store.setState({ result: result });\n            return result;\n          }\n    \n          prefiltered = processModule.prefilter(candidates, ctx, toolkits);\n          scored = processModule.score(prefiltered, ctx, scoringKernel, toolkits);\n          result = buildResult(current.processId, scored, ctx, function presenter(items, innerCtx) {\n            return processModule.buildResultView(items, innerCtx, toolkits);\n          });\n          store.setState({ candidatePool: candidates, prefiltered: prefiltered, scored: scored, result: result });\n          stateMachine.transition(\"results\");\n          return result;\n        },\n      };\n    }\n    \n    exports.createToolFinderApp = createToolFinderApp;\n  },\n  \"app/registry.js\": function (exports, module, __bundle) {\n    var { drillingTools } = __bundle.require(\"family-toolkits/drilling-tools.js\");\n    var { threadingTools } = __bundle.require(\"family-toolkits/threading-tools.js\");\n    var { millingTools } = __bundle.require(\"family-toolkits/milling-tools.js\");\n    var { turningTools } = __bundle.require(\"family-toolkits/turning-tools.js\");\n    var { ensure } = __bundle.require(\"catalog/contracts.js\");\n    var { isFamilyToolkit, isProcessModule } = __bundle.require(\"core/contracts.js\");\n    var { LEGACY_PROCESS_ALIASES, normalizeLegacyProcessId } = __bundle.require(\"compatibility/legacy-process-aliases.js\");\n    var drillingThroughModule = __bundle.require(\"processes/drilling-through/module.js\").default;\n    var drillingBlindModule = __bundle.require(\"processes/drilling-blind/module.js\").default;\n    var deepHoleDrillingModule = __bundle.require(\"processes/deep-hole-drilling/module.js\").default;\n    var reamingModule = __bundle.require(\"processes/reaming/module.js\").default;\n    var countersinkingModule = __bundle.require(\"processes/countersinking/module.js\").default;\n    var chamferingModule = __bundle.require(\"processes/chamfering/module.js\").default;\n    var tappingBlindModule = __bundle.require(\"processes/tapping-blind/module.js\").default;\n    var tappingThroughModule = __bundle.require(\"processes/tapping-through/module.js\").default;\n    var formingBlindModule = __bundle.require(\"processes/forming-blind/module.js\").default;\n    var formingThroughModule = __bundle.require(\"processes/forming-through/module.js\").default;\n    var threadMillingModule = __bundle.require(\"processes/thread-milling/module.js\").default;\n    var profileTurningModule = __bundle.require(\"processes/profile-turning/module.js\").default;\n    var boringModule = __bundle.require(\"processes/boring/module.js\").default;\n    var groovingModule = __bundle.require(\"processes/grooving/module.js\").default;\n    var diameterTurningModule = __bundle.require(\"processes/diameter-turning/module.js\").default;\n    var faceTurningModule = __bundle.require(\"processes/face-turning/module.js\").default;\n    var slottingModule = __bundle.require(\"processes/slotting/module.js\").default;\n    var shoulderMillingModule = __bundle.require(\"processes/shoulder-milling/module.js\").default;\n    var faceMillingModule = __bundle.require(\"processes/face-milling/module.js\").default;\n    var pocketMillingModule = __bundle.require(\"processes/pocket-milling/module.js\").default;\n    var trochoidalMillingModule = __bundle.require(\"processes/trochoidal-milling/module.js\").default;\n    var rampingHelicalInterpolationModule = __bundle.require(\"processes/ramping-helical-interpolation/module.js\").default;\n    var highFeedMillingModule = __bundle.require(\"processes/high-feed-milling/module.js\").default;\n    var copyMillingModule = __bundle.require(\"processes/copy-milling/module.js\").default;\n    var plungingModule = __bundle.require(\"processes/plunging/module.js\").default;\n    var TOOLKITS = Object.freeze({\n      drilling: drillingTools,\n      threading: threadingTools,\n      milling: millingTools,\n      turning: turningTools,\n    });\n    \n    var MODULES = [\n      drillingThroughModule,\n      drillingBlindModule,\n      deepHoleDrillingModule,\n      reamingModule,\n      countersinkingModule,\n      chamferingModule,\n      tappingBlindModule,\n      tappingThroughModule,\n      formingBlindModule,\n      formingThroughModule,\n      threadMillingModule,\n      profileTurningModule,\n      boringModule,\n      groovingModule,\n      diameterTurningModule,\n      faceTurningModule,\n      slottingModule,\n      shoulderMillingModule,\n      faceMillingModule,\n      pocketMillingModule,\n      trochoidalMillingModule,\n      rampingHelicalInterpolationModule,\n      highFeedMillingModule,\n      copyMillingModule,\n      plungingModule,\n    ];\n    \n    function createRegistry() {\n      var moduleMap = {};\n      var toolkitMap = Object.assign({}, TOOLKITS);\n      MODULES.forEach(function eachModule(processModule) {\n        ensure(isProcessModule(processModule), \"Registry received a non-conforming process module: \" + (processModule && processModule.id || \"unknown\"));\n        ensure(!moduleMap[processModule.id], \"Duplicate process module registration: \" + processModule.id);\n        moduleMap[processModule.id] = processModule;\n      });\n      Object.keys(toolkitMap).forEach(function eachToolkit(toolkitId) {\n        ensure(isFamilyToolkit(toolkitMap[toolkitId]), \"Registry received a non-conforming family toolkit: \" + toolkitId);\n      });\n    \n      return {\n        resolveId: function resolveId(processId) {\n          return normalizeLegacyProcessId(processId);\n        },\n        get: function get(processId) {\n          var canonicalId = normalizeLegacyProcessId(processId);\n          var processModule = moduleMap[canonicalId];\n          if (!processModule) {\n            throw new Error(\"Unknown process module: \" + processId);\n          }\n          return processModule;\n        },\n        list: function list() {\n          return MODULES.slice();\n        },\n        aliases: function aliases() {\n          return Object.assign({}, LEGACY_PROCESS_ALIASES);\n        },\n        getToolkits: function getToolkits(toolkitIds) {\n          return (toolkitIds || []).reduce(function collect(map, toolkitId) {\n            ensure(!!toolkitMap[toolkitId], \"Unknown toolkit requested: \" + toolkitId);\n            map[toolkitId] = toolkitMap[toolkitId];\n            return map;\n          }, {});\n        },\n        getAllToolkits: function getAllToolkits() {\n          return Object.assign({}, toolkitMap);\n        },\n      };\n    }\n    \n    exports.createRegistry = createRegistry;\n  },\n  \"app/state-machine.js\": function (exports, module, __bundle) {\n    const FINDER_STEPS = Object.freeze([\"material\", \"process\", \"questions\", \"results\"]);\n    \n    function createStateMachine() {\n      return {\n        current: \"material\",\n        transition: function transition(nextStep) {\n          if (FINDER_STEPS.indexOf(nextStep) < 0) {\n            throw new Error(\"Unknown step: \" + nextStep);\n          }\n          this.current = nextStep;\n          return this.current;\n        },\n      };\n    }\n    \n    exports.createStateMachine = createStateMachine;\n    exports.FINDER_STEPS = FINDER_STEPS;\n  },\n  \"app/store.js\": function (exports, module, __bundle) {\n    function createStore(initialState) {\n      var state = Object.assign({}, initialState || {});\n      var listeners = new Set();\n    \n      return {\n        getState: function getState() {\n          return Object.assign({}, state);\n        },\n        setState: function setState(partial) {\n          state = Object.assign({}, state, partial || {});\n          listeners.forEach(function notify(listener) {\n            listener(Object.assign({}, state));\n          });\n          return Object.assign({}, state);\n        },\n        subscribe: function subscribe(listener) {\n          listeners.add(listener);\n          return function unsubscribe() {\n            listeners.delete(listener);\n          };\n        },\n      };\n    }\n    \n    exports.createStore = createStore;\n  },\n  \"app/telemetry.js\": function (exports, module, __bundle) {\n    function createTelemetry() {\n      var events = [];\n    \n      return {\n        record: function record(name, payload) {\n          events.push({ name: name, payload: payload || {}, at: new Date().toISOString() });\n        },\n        getEvents: function getEvents() {\n          return events.slice();\n        },\n        clear: function clear() {\n          events.length = 0;\n        },\n      };\n    }\n    \n    exports.createTelemetry = createTelemetry;\n  },\n  \"catalog/cache.js\": function (exports, module, __bundle) {\n    function createMemoryCache() {\n      var store = new Map();\n    \n      return {\n        get: function get(key) {\n          return store.get(key);\n        },\n        set: function set(key, value) {\n          store.set(key, value);\n          return value;\n        },\n        has: function has(key) {\n          return store.has(key);\n        },\n        clear: function clear() {\n          store.clear();\n        },\n      };\n    }\n    \n    exports.createMemoryCache = createMemoryCache;\n  },\n  \"catalog/contracts.js\": function (exports, module, __bundle) {\n    /**\n     * Runtime contracts for ProductPoolEntry, Candidate, ScoredCandidate and NormalizedRow.\n     * This module is intentionally framework-agnostic and deterministic.\n     */\n    \n    const FAMILY_IDS = Object.freeze([\"drilling\", \"threading\", \"milling\", \"turning\"]);\n    \n    const PROCESS_IDS = Object.freeze([\n      \"drilling_through\",\n      \"drilling_blind\",\n      \"deep_hole_drilling\",\n      \"reaming\",\n      \"countersinking\",\n      \"chamfering\",\n      \"tapping_blind\",\n      \"tapping_through\",\n      \"forming_blind\",\n      \"forming_through\",\n      \"thread_milling\",\n      \"profile_turning\",\n      \"boring\",\n      \"grooving\",\n      \"diameter_turning\",\n      \"face_turning\",\n      \"slotting\",\n      \"shoulder_milling\",\n      \"face_milling\",\n      \"pocket_milling\",\n      \"trochoidal_milling\",\n      \"ramping_helical_interpolation\",\n      \"high_feed_milling\",\n      \"copy_milling\",\n      \"plunging\",\n    ]);\n    \n    const PROCESS_FAMILY_BY_ID = Object.freeze({\n      drilling_through: \"drilling\",\n      drilling_blind: \"drilling\",\n      deep_hole_drilling: \"drilling\",\n      reaming: \"drilling\",\n      countersinking: \"drilling\",\n      chamfering: \"drilling\",\n      tapping_blind: \"threading\",\n      tapping_through: \"threading\",\n      forming_blind: \"threading\",\n      forming_through: \"threading\",\n      thread_milling: \"threading\",\n      profile_turning: \"turning\",\n      boring: \"turning\",\n      grooving: \"turning\",\n      diameter_turning: \"turning\",\n      face_turning: \"turning\",\n      slotting: \"milling\",\n      shoulder_milling: \"milling\",\n      face_milling: \"milling\",\n      pocket_milling: \"milling\",\n      trochoidal_milling: \"milling\",\n      ramping_helical_interpolation: \"milling\",\n      high_feed_milling: \"milling\",\n      copy_milling: \"milling\",\n      plunging: \"milling\",\n    });\n    \n    const CANDIDATE_STAGES = Object.freeze([\"manifest\", \"detail\"]);\n    \n    const ROW_KINDS = Object.freeze([\n      \"drill\",\n      \"ream\",\n      \"countersink\",\n      \"chamfer\",\n      \"tap\",\n      \"form_tap\",\n      \"thread_mill\",\n      \"slot\",\n      \"shoulder\",\n      \"face\",\n      \"pocket\",\n      \"copy\",\n      \"hfm\",\n      \"trochoidal\",\n      \"plunge\",\n      \"ramp\",\n      \"profile\",\n      \"bore\",\n      \"groove\",\n      \"diameter\",\n      \"face_turn\",\n      \"unknown\",\n    ]);\n    \n    const COOLANT_MODES = Object.freeze([\"through\", \"external\", \"dry\", \"mist\", \"unknown\"]);\n    const RESULT_OUTCOMES = Object.freeze([\"match\", \"limited_match\", \"no_match\", \"insufficient_data\"]);\n    const RESULT_BLOCK_TYPES = Object.freeze([\n      \"hero_recommendation\",\n      \"fit_kpis\",\n      \"recipe_start_values\",\n      \"risk_notes\",\n      \"machine_feasibility\",\n      \"tolerance_notes\",\n      \"setup_notes\",\n      \"geometry_fit\",\n      \"process_match\",\n      \"thread_identity\",\n      \"hole_summary\",\n      \"feature_summary\",\n      \"alternatives\",\n      \"bundle_recommendation\",\n      \"commerce_cta\",\n      \"explanation\",\n      \"warning\",\n      \"no_match_guidance\",\n      \"custom\",\n    ]);\n    \n    /**\n     * @template T\n     * @param {T} value\n     * @returns {T}\n     */\n    function deepClone(value) {\n      return value == null ? value : JSON.parse(JSON.stringify(value));\n    }\n    \n    function hasOwn(source, key) {\n      return !!source && Object.prototype.hasOwnProperty.call(source, key);\n    }\n    \n    function firstPresent(source, keys) {\n      var index;\n      for (index = 0; index < keys.length; index += 1) {\n        if (hasOwn(source, keys[index]) && source[keys[index]] != null) {\n          return source[keys[index]];\n        }\n      }\n      return undefined;\n    }\n    \n    function mapFieldEntriesToObject(fields) {\n      var result = {};\n      toArray(fields).forEach(function eachField(field) {\n        var key = field && (field.key || field.name) ? String(field.key || field.name) : null;\n        var value;\n        if (!key) return;\n        if (hasOwn(field, \"jsonValue\")) value = field.jsonValue;\n        else if (hasOwn(field, \"value\")) value = field.value;\n        else if (hasOwn(field, \"reference\")) value = field.reference;\n        else if (hasOwn(field, \"references\")) value = field.references;\n        else value = null;\n        result[key] = value;\n      });\n      return Object.keys(result).length > 0 ? result : null;\n    }\n    \n    /**\n     * Best-effort unwrap for legacy Shopify/metaobject payloads that sometimes\n     * expose scalar row values as `{ value }`, `{ code }`, `{ handle }` or `fields[]`.\n     *\n     * @param {unknown} value\n     * @param {number=} depth\n     * @returns {unknown}\n     */\n    function unwrapReferenceValue(value, depth) {\n      var candidate = value;\n      var mappedFields;\n      var wrapperValue;\n      var scalarKeys;\n      var index;\n    \n      if ((depth || 0) > 5 || candidate == null) return candidate;\n      if (Array.isArray(candidate)) {\n        return candidate.map(function mapItem(item) {\n          return unwrapReferenceValue(item, (depth || 0) + 1);\n        });\n      }\n      if (typeof candidate !== \"object\") return candidate;\n    \n      mappedFields = Array.isArray(candidate.fields) ? mapFieldEntriesToObject(candidate.fields) : null;\n      if (mappedFields) {\n        candidate = mappedFields;\n      }\n    \n      wrapperValue = firstPresent(candidate, [\"jsonValue\", \"value\", \"fieldData\", \"node\", \"metaobject\", \"reference\"]);\n      if (wrapperValue != null && wrapperValue !== candidate) {\n        wrapperValue = unwrapReferenceValue(wrapperValue, (depth || 0) + 1);\n        if (wrapperValue != null && typeof wrapperValue !== \"object\") return wrapperValue;\n        if (Array.isArray(wrapperValue)) return wrapperValue;\n      }\n    \n      scalarKeys = [\"code\", \"handle\", \"id\", \"name\", \"label_en\", \"label\", \"title\", \"key\"];\n      for (index = 0; index < scalarKeys.length; index += 1) {\n        if (!hasOwn(candidate, scalarKeys[index])) continue;\n        wrapperValue = unwrapReferenceValue(candidate[scalarKeys[index]], (depth || 0) + 1);\n        if (wrapperValue == null) continue;\n        if (typeof wrapperValue !== \"object\") return wrapperValue;\n        if (Array.isArray(wrapperValue)) return wrapperValue;\n      }\n    \n      return candidate;\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {string|null}\n     */\n    function toNullableString(value) {\n      if (value == null) return null;\n      var text = String(value).trim();\n      return text === \"\" || text === \"-\" ? null : text;\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {number|null}\n     */\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      if (typeof value === \"number\" && Number.isFinite(value)) return value;\n      var normalized = String(value).replace(\",\", \".\").trim();\n      if (normalized === \"\") return null;\n      var parsed = Number(normalized);\n      return Number.isFinite(parsed) ? parsed : null;\n    }\n    \n    /**\n     * Draft-safe variant for interactive user input.\n     * Keeps incomplete decimal entries like `10,` or `10.` open until the user\n     * finishes typing the fractional part.\n     *\n     * @param {unknown} value\n     * @returns {number|null}\n     */\n    function toNullableDraftNumber(value) {\n      var raw;\n      if (value == null || value === \"\") return null;\n      if (typeof value === \"number\" && Number.isFinite(value)) return value;\n      raw = String(value).trim();\n      if (raw === \"\") return null;\n      if (/^[+-]?(?:\\d+[.,]|[.,])$/.test(raw)) return null;\n      return toNullableNumber(raw);\n    }\n    \n    /**\n     * @param {Candidate|Partial<Candidate>|null|undefined} candidate\n     * @returns {number|null}\n     */\n    function getCandidateFluteCount(candidate) {\n      var systemContext = candidate && candidate.attachments && candidate.attachments.systemContext\n        ? candidate.attachments.systemContext\n        : {};\n      return toNullableNumber(\n        candidate && candidate.common && candidate.common.fluteCount != null\n          ? candidate.common.fluteCount\n          : systemContext.bodyFluteCount\n      );\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {boolean|null}\n     */\n    function toNullableBoolean(value) {\n      if (value == null || value === \"\") return null;\n      if (typeof value === \"boolean\") return value;\n      var token = String(value).trim().toLowerCase();\n      if ([\"true\", \"yes\", \"y\", \"1\", \"ja\"].indexOf(token) >= 0) return true;\n      if ([\"false\", \"no\", \"n\", \"0\", \"nein\"].indexOf(token) >= 0) return false;\n      return null;\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {string[]}\n     */\n    function toStringArray(value) {\n      var resolved = unwrapReferenceValue(value);\n      if (resolved == null) return [];\n      if (Array.isArray(resolved)) {\n        return resolved.reduce(function collect(list, item) {\n          return list.concat(toStringArray(item));\n        }, []);\n      }\n      if (typeof resolved === \"object\") return [];\n      var text = toNullableString(resolved);\n      return text ? [text] : [];\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {unknown[]}\n     */\n    function toArray(value) {\n      if (value == null) return [];\n      return Array.isArray(value) ? value : [value];\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {string[]}\n     */\n    function normalizeMaterialCodeList(value) {\n      return toStringArray(value).map(function mapCode(item) {\n        var code = item.toUpperCase();\n        var compact = code.match(/[PKMNSH][0-9]?/);\n        return compact ? compact[0] : code;\n      });\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {\"blind\"|\"through\"|\"either\"|null}\n     */\n    function normalizeBlindThrough(value) {\n      var token = toNullableString(unwrapReferenceValue(value));\n      if (!token) return null;\n      token = token.toLowerCase();\n      if (token === \"blind\" || token === \"through\" || token === \"either\") return /** @type {\"blind\"|\"through\"|\"either\"} */ (token);\n      return null;\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {\"through\"|\"external\"|\"dry\"|\"mist\"|\"unknown\"|null}\n     */\n    function normalizeCoolantMode(value) {\n      var token = toNullableString(unwrapReferenceValue(value));\n      if (!token) return null;\n      token = token.toLowerCase();\n      if (token.indexOf(\"through\") >= 0 || token.indexOf(\"tsc\") >= 0) return \"through\";\n      if (token.indexOf(\"external\") >= 0 || token.indexOf(\"wet\") >= 0) return \"external\";\n      if (token.indexOf(\"dry\") >= 0) return \"dry\";\n      if (token.indexOf(\"mist\") >= 0 || token.indexOf(\"mql\") >= 0) return \"mist\";\n      return \"unknown\";\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {boolean}\n     */\n    function isCanonicalProcessId(value) {\n      return PROCESS_IDS.indexOf(String(value)) >= 0;\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {boolean}\n     */\n    function isFamilyId(value) {\n      return FAMILY_IDS.indexOf(String(value)) >= 0;\n    }\n    \n    /**\n     * @param {string} message\n     * @returns {never}\n     */\n    function fail(message) {\n      throw new Error(message);\n    }\n    \n    /**\n     * @param {boolean} condition\n     * @param {string} message\n     */\n    function ensure(condition, message) {\n      if (!condition) fail(message);\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {ValueRange}\n     */\n    function createValueRange(value) {\n      var source = value && typeof value === \"object\" ? value : {};\n      return {\n        min: toNullableNumber(source.min),\n        typ: toNullableNumber(source.typ),\n        max: toNullableNumber(source.max),\n      };\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {Recipe}\n     */\n    function createRecipe(value) {\n      var source = value && typeof value === \"object\" ? value : {};\n      return {\n        vc: createValueRange(source.vc),\n        fz: createValueRange(source.fz),\n        fn: createValueRange(source.fn),\n        ap: createValueRange(source.ap),\n        ae: createValueRange(source.ae),\n        aePct: createValueRange(source.aePct),\n      };\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {RowKind}\n     */\n    function normalizeRowKind(value) {\n      var token = toNullableString(value);\n      if (!token) return \"unknown\";\n      token = token.toLowerCase();\n      if (ROW_KINDS.indexOf(token) >= 0) return /** @type {RowKind} */ (token);\n      if (token.indexOf(\"face_turn\") >= 0 || token.indexOf(\"face-turn\") >= 0) return \"face_turn\";\n      if (token.indexOf(\"boring\") >= 0) return \"bore\";\n      if (token.indexOf(\"ream\") >= 0) return \"ream\";\n      if (token.indexOf(\"counter\") >= 0) return \"countersink\";\n      if (token.indexOf(\"chamfer\") >= 0) return \"chamfer\";\n      if (token.indexOf(\"form\") >= 0) return \"form_tap\";\n      if (token.indexOf(\"tap\") >= 0) return \"tap\";\n      if (token.indexOf(\"thread\") >= 0) return \"thread_mill\";\n      if (token.indexOf(\"slot\") >= 0) return \"slot\";\n      if (token.indexOf(\"shoulder\") >= 0) return \"shoulder\";\n      if (token.indexOf(\"pocket\") >= 0) return \"pocket\";\n      if (token.indexOf(\"trocho\") >= 0) return \"trochoidal\";\n      if (token.indexOf(\"high\") >= 0) return \"hfm\";\n      if (token.indexOf(\"plung\") >= 0) return \"plunge\";\n      if (token.indexOf(\"ramp\") >= 0 || token.indexOf(\"helix\") >= 0) return \"ramp\";\n      if (token.indexOf(\"profile\") >= 0) return \"profile\";\n      if (token.indexOf(\"bore\") >= 0) return \"bore\";\n      if (token.indexOf(\"groov\") >= 0) return \"groove\";\n      if (token.indexOf(\"diameter\") >= 0) return \"diameter\";\n      if (token.indexOf(\"face\") >= 0) return \"face\";\n      if (token.indexOf(\"drill\") >= 0) return \"drill\";\n      return \"unknown\";\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {RowConstraints}\n     */\n    function createRowConstraints(value) {\n      var source = value && typeof value === \"object\" ? value : {};\n      return {\n        processIds: toStringArray(source.processIds).filter(isCanonicalProcessId),\n        materialCodes: normalizeMaterialCodeList(source.materialCodes),\n        secondaryMaterialCodes: normalizeMaterialCodeList(source.secondaryMaterialCodes),\n        coolantMode: normalizeCoolantMode(source.coolantMode),\n        conditionStage: toNullableString(source.conditionStage),\n        workpieceCondition: toNullableString(source.workpieceCondition),\n        engagementStyle: toNullableString(source.engagementStyle),\n        radialEngagementClass: toNullableString(source.radialEngagementClass),\n        blindThrough: normalizeBlindThrough(source.blindThrough),\n      };\n    }\n    \n    /**\n     * @param {Partial<ProductPoolEntry>} input\n     * @returns {ProductPoolEntry}\n     */\n    function createProductPoolEntry(input) {\n      var source = input || {};\n      return {\n        kind: \"product_pool_entry\",\n        schemaVersion: \"product-pool-entry.v1\",\n        ids: {\n          productId: toNullableString(source.ids && source.ids.productId) || fail(\"ProductPoolEntry.productId is required\"),\n          handle: toNullableString(source.ids && source.ids.handle) || fail(\"ProductPoolEntry.handle is required\"),\n        },\n        catalog: {\n          productTitle: toNullableString(source.catalog && source.catalog.productTitle) || \"\",\n          vendor: toNullableString(source.catalog && source.catalog.vendor),\n          url: toNullableString(source.catalog && source.catalog.url),\n          imageUrl: toNullableString(source.catalog && source.catalog.imageUrl),\n        },\n        classification: {\n          domainFamilies: toStringArray(source.classification && source.classification.domainFamilies).filter(isFamilyId),\n          processIds: toStringArray(source.classification && source.classification.processIds).filter(isCanonicalProcessId),\n          materialGroupCodes: normalizeMaterialCodeList(source.classification && source.classification.materialGroupCodes),\n          materialSubgroupCodes: normalizeMaterialCodeList(source.classification && source.classification.materialSubgroupCodes),\n        },\n        attachments: deepClone(source.attachments || {}),\n        provenance: {\n          source: toNullableString(source.provenance && source.provenance.source) || \"product_index\",\n          rawSourceRefs: toStringArray(source.provenance && source.provenance.rawSourceRefs),\n        },\n      };\n    }\n    \n    /**\n     * @param {Partial<NormalizedRow>} input\n     * @returns {NormalizedRow}\n     */\n    function createNormalizedRow(input) {\n      var source = input || {};\n      var family = toNullableString(source.family);\n      ensure(!!family && isFamilyId(family), \"NormalizedRow.family must be a valid family id\");\n      return {\n        kind: \"normalized_row\",\n        schemaVersion: \"row.v1.1\",\n        rowId: toNullableString(source.rowId) || fail(\"NormalizedRow.rowId is required\"),\n        family: /** @type {FamilyId} */ (family),\n        rowKind: normalizeRowKind(source.rowKind),\n        label: toNullableString(source.label),\n        solutionCode: toNullableString(source.solutionCode),\n        insertCode: toNullableString(source.insertCode),\n        gradeCode: toNullableString(source.gradeCode),\n        constraints: createRowConstraints(source.constraints),\n        recipe: createRecipe(source.recipe),\n        familyData: deepClone(source.familyData || {}),\n        trace: {\n          productId: toNullableString(source.trace && source.trace.productId) || \"\",\n          variantId: toNullableString(source.trace && source.trace.variantId) || \"\",\n          handle: toNullableString(source.trace && source.trace.handle) || \"\",\n          sourceFamilyField: toNullableString(source.trace && source.trace.sourceFamilyField) || \"\",\n          sourceRowIndex: toNullableNumber(source.trace && source.trace.sourceRowIndex) || 0,\n          sourceProfileIndex: toNullableNumber(source.trace && source.trace.sourceProfileIndex),\n          sourceProcessHandleRaw: toNullableString(source.trace && source.trace.sourceProcessHandleRaw),\n        },\n      };\n    }\n    \n    /**\n     * @param {Partial<Candidate>} input\n     * @returns {Candidate}\n     */\n    function createCandidate(input) {\n      var source = input || {};\n      var stage = toNullableString(source.stage) || \"manifest\";\n      ensure(CANDIDATE_STAGES.indexOf(stage) >= 0, \"Candidate.stage must be manifest or detail\");\n      return {\n        kind: \"variant_candidate\",\n        schemaVersion: \"candidate.v1.1\",\n        stage: /** @type {CandidateStage} */ (stage),\n        ids: {\n          productId: toNullableString(source.ids && source.ids.productId) || fail(\"Candidate.ids.productId is required\"),\n          variantId: toNullableString(source.ids && source.ids.variantId) || fail(\"Candidate.ids.variantId is required\"),\n          handle: toNullableString(source.ids && source.ids.handle) || fail(\"Candidate.ids.handle is required\"),\n          sku: toNullableString(source.ids && source.ids.sku),\n        },\n        catalog: {\n          productTitle: toNullableString(source.catalog && source.catalog.productTitle) || \"\",\n          variantTitle: toNullableString(source.catalog && source.catalog.variantTitle),\n          vendor: toNullableString(source.catalog && source.catalog.vendor),\n          url: toNullableString(source.catalog && source.catalog.url),\n          imageUrl: toNullableString(source.catalog && source.catalog.imageUrl),\n        },\n        commerce: {\n          available: toNullableBoolean(source.commerce && source.commerce.available),\n          priceCents: toNullableNumber(source.commerce && source.commerce.priceCents),\n          compareAtPriceCents: toNullableNumber(source.commerce && source.commerce.compareAtPriceCents),\n        },\n        classification: {\n          domainFamilies: toStringArray(source.classification && source.classification.domainFamilies).filter(isFamilyId),\n          processIds: toStringArray(source.classification && source.classification.processIds).filter(isCanonicalProcessId),\n          materialSubgroupCodes: normalizeMaterialCodeList(source.classification && source.classification.materialSubgroupCodes),\n        },\n        common: {\n          diameterMm: toNullableNumber(source.common && source.common.diameterMm),\n          apmxMm: toNullableNumber(source.common && source.common.apmxMm),\n          usableLengthMm: toNullableNumber(source.common && source.common.usableLengthMm),\n          oalMm: toNullableNumber(source.common && source.common.oalMm),\n          fluteCount: toNullableNumber(source.common && source.common.fluteCount),\n          coolantTsc: toNullableBoolean(source.common && source.common.coolantTsc),\n        },\n        drilling: deepClone(source.drilling || {}),\n        threading: deepClone(source.threading || {}),\n        milling: deepClone(source.milling || {}),\n        turning: deepClone(source.turning || {}),\n        attachments: deepClone(source.attachments || {}),\n        rows: {\n          drilling: toArray(source.rows && source.rows.drilling).map(createNormalizedRow),\n          threading: toArray(source.rows && source.rows.threading).map(createNormalizedRow),\n          milling: toArray(source.rows && source.rows.milling).map(createNormalizedRow),\n          turning: toArray(source.rows && source.rows.turning).map(createNormalizedRow),\n        },\n        provenance: {\n          source: toNullableString(source.provenance && source.provenance.source) || \"variant_manifest\",\n          hydratedAt: toNullableString(source.provenance && source.provenance.hydratedAt),\n          rawSourceRefs: toStringArray(source.provenance && source.provenance.rawSourceRefs),\n          classificationEvidence: {\n            processesFrom: toNullableString(source.provenance && source.provenance.classificationEvidence && source.provenance.classificationEvidence.processesFrom) || \"mixed\",\n            familiesFrom: toNullableString(source.provenance && source.provenance.classificationEvidence && source.provenance.classificationEvidence.familiesFrom) || \"mixed\",\n          },\n        },\n      };\n    }\n    \n    /**\n     * @param {Partial<ScoreBreakdown>} input\n     * @returns {ScoreBreakdown}\n     */\n    function createScoreBreakdown(input) {\n      var source = input || {};\n      return {\n        eligible: source.eligible === false ? false : true,\n        hardRejectReason: toNullableString(source.hardRejectReason),\n        total: toNullableNumber(source.total) || 0,\n        parts: deepClone(source.parts || {}),\n        confidence: toNullableNumber(source.confidence) || 0,\n        recipeConfidence: toNullableString(source.recipeConfidence) || \"none\",\n        reasons: toStringArray(source.reasons).slice(0, 5),\n      };\n    }\n    \n    /**\n     * @param {Candidate} candidate\n     * @param {Partial<ScoreBreakdown>} score\n     * @param {Recipe|null} recipe\n     * @param {Record<string, unknown>=} metrics\n     * @returns {ScoredCandidate}\n     */\n    function createScoredCandidate(candidate, score, recipe, metrics) {\n      ensure(candidate.kind === \"variant_candidate\", \"ScoredCandidate requires a Candidate\");\n      return {\n        candidate: deepClone(candidate),\n        score: createScoreBreakdown(score),\n        recipe: recipe ? createRecipe(recipe) : null,\n        metrics: deepClone(metrics || {}),\n      };\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {value is Candidate}\n     */\n    function isCandidate(value) {\n      return !!value && typeof value === \"object\" && value.kind === \"variant_candidate\";\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {value is NormalizedRow}\n     */\n    function isNormalizedRow(value) {\n      return !!value && typeof value === \"object\" && value.kind === \"normalized_row\";\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {value is ProductPoolEntry}\n     */\n    function isProductPoolEntry(value) {\n      return !!value && typeof value === \"object\" && value.kind === \"product_pool_entry\";\n    }\n    \n    /**\n     * @param {unknown} value\n     * @returns {value is ScoredCandidate}\n     */\n    function isScoredCandidate(value) {\n      return !!value && typeof value === \"object\" && isCandidate(value.candidate) && !!value.score;\n    }\n    \n    /**\n     * @typedef {\"drilling\"|\"threading\"|\"milling\"|\"turning\"} FamilyId\n     * @typedef {typeof PROCESS_IDS[number]} ProcessId\n     * @typedef {typeof ROW_KINDS[number]} RowKind\n     * @typedef {typeof CANDIDATE_STAGES[number]} CandidateStage\n     * @typedef {{min:number|null, typ:number|null, max:number|null}} ValueRange\n     * @typedef {{vc:ValueRange, fz:ValueRange, fn:ValueRange, ap:ValueRange, ae:ValueRange, aePct:ValueRange}} Recipe\n     * @typedef {{\n     *   processIds: ProcessId[],\n     *   materialCodes: string[],\n     *   secondaryMaterialCodes: string[],\n     *   coolantMode: \"through\"|\"external\"|\"dry\"|\"mist\"|\"unknown\"|null,\n     *   conditionStage: string|null,\n     *   workpieceCondition: string|null,\n     *   engagementStyle: string|null,\n     *   radialEngagementClass: string|null,\n     *   blindThrough: \"blind\"|\"through\"|\"either\"|null\n     * }} RowConstraints\n     * @typedef {{\n     *   productId: string,\n     *   variantId: string,\n     *   handle: string,\n     *   sourceFamilyField: string,\n     *   sourceRowIndex: number,\n     *   sourceProfileIndex: number|null,\n     *   sourceProcessHandleRaw?: string|null\n     * }} RowTrace\n     * @typedef {{\n     *   kind: \"normalized_row\",\n     *   schemaVersion: \"row.v1.1\",\n     *   rowId: string,\n     *   family: FamilyId,\n     *   rowKind: RowKind,\n     *   label: string|null,\n     *   solutionCode: string|null,\n     *   insertCode: string|null,\n     *   gradeCode: string|null,\n     *   constraints: RowConstraints,\n     *   recipe: Recipe,\n     *   familyData: Record<string, unknown>,\n     *   trace: RowTrace\n     * }} NormalizedRow\n     * @typedef {{\n     *   kind: \"product_pool_entry\",\n     *   schemaVersion: \"product-pool-entry.v1\",\n     *   ids: { productId: string, handle: string },\n     *   catalog: { productTitle: string, vendor: string|null, url: string|null, imageUrl: string|null },\n     *   classification: { domainFamilies: FamilyId[], processIds: ProcessId[], materialGroupCodes: string[], materialSubgroupCodes: string[] },\n     *   attachments: Record<string, unknown>,\n     *   provenance: { source: string, rawSourceRefs: string[] }\n     * }} ProductPoolEntry\n     * @typedef {{\n     *   kind: \"variant_candidate\",\n     *   schemaVersion: \"candidate.v1.1\",\n     *   stage: CandidateStage,\n     *   ids: { productId: string, variantId: string, handle: string, sku: string|null },\n     *   catalog: { productTitle: string, variantTitle: string|null, vendor: string|null, url: string|null, imageUrl: string|null },\n     *   commerce: { available: boolean|null, priceCents: number|null, compareAtPriceCents: number|null },\n     *   classification: { domainFamilies: FamilyId[], processIds: ProcessId[], materialSubgroupCodes: string[] },\n     *   common: { diameterMm: number|null, apmxMm: number|null, usableLengthMm: number|null, oalMm: number|null, fluteCount: number|null, coolantTsc: boolean|null },\n     *   drilling: Record<string, unknown>,\n     *   threading: Record<string, unknown>,\n     *   milling: Record<string, unknown>,\n     *   turning: Record<string, unknown>,\n     *   attachments: Record<string, unknown>,\n     *   rows: { drilling: NormalizedRow[], threading: NormalizedRow[], milling: NormalizedRow[], turning: NormalizedRow[] },\n     *   provenance: {\n     *     source: string,\n     *     hydratedAt: string|null,\n     *     rawSourceRefs: string[],\n     *     classificationEvidence: {\n     *       processesFrom: \"product\"|\"variant\"|\"detail\"|\"mixed\"|string,\n     *       familiesFrom: \"product\"|\"variant\"|\"detail\"|\"mixed\"|string\n     *     }\n     *   }\n     * }} Candidate\n     * @typedef {{\n     *   eligible: boolean,\n     *   hardRejectReason: string|null,\n     *   total: number,\n     *   parts: Record<string, number>,\n     *   confidence: number,\n     *   recipeConfidence: \"exact\"|\"near\"|\"estimated\"|\"none\"|string,\n     *   reasons: string[]\n     * }} ScoreBreakdown\n     * @typedef {{\n     *   candidate: Candidate,\n     *   score: ScoreBreakdown,\n     *   recipe: Recipe|null,\n     *   metrics: Record<string, unknown>\n     * }} ScoredCandidate\n     */\n    \n    exports.deepClone = deepClone;\n    exports.unwrapReferenceValue = unwrapReferenceValue;\n    exports.toNullableString = toNullableString;\n    exports.toNullableNumber = toNullableNumber;\n    exports.toNullableDraftNumber = toNullableDraftNumber;\n    exports.getCandidateFluteCount = getCandidateFluteCount;\n    exports.toNullableBoolean = toNullableBoolean;\n    exports.toStringArray = toStringArray;\n    exports.toArray = toArray;\n    exports.normalizeMaterialCodeList = normalizeMaterialCodeList;\n    exports.normalizeBlindThrough = normalizeBlindThrough;\n    exports.normalizeCoolantMode = normalizeCoolantMode;\n    exports.isCanonicalProcessId = isCanonicalProcessId;\n    exports.isFamilyId = isFamilyId;\n    exports.fail = fail;\n    exports.ensure = ensure;\n    exports.createValueRange = createValueRange;\n    exports.createRecipe = createRecipe;\n    exports.normalizeRowKind = normalizeRowKind;\n    exports.createRowConstraints = createRowConstraints;\n    exports.createProductPoolEntry = createProductPoolEntry;\n    exports.createNormalizedRow = createNormalizedRow;\n    exports.createCandidate = createCandidate;\n    exports.createScoreBreakdown = createScoreBreakdown;\n    exports.createScoredCandidate = createScoredCandidate;\n    exports.isCandidate = isCandidate;\n    exports.isNormalizedRow = isNormalizedRow;\n    exports.isProductPoolEntry = isProductPoolEntry;\n    exports.isScoredCandidate = isScoredCandidate;\n    exports.FAMILY_IDS = FAMILY_IDS;\n    exports.PROCESS_IDS = PROCESS_IDS;\n    exports.PROCESS_FAMILY_BY_ID = PROCESS_FAMILY_BY_ID;\n    exports.CANDIDATE_STAGES = CANDIDATE_STAGES;\n    exports.ROW_KINDS = ROW_KINDS;\n    exports.COOLANT_MODES = COOLANT_MODES;\n    exports.RESULT_OUTCOMES = RESULT_OUTCOMES;\n    exports.RESULT_BLOCK_TYPES = RESULT_BLOCK_TYPES;\n  },\n  \"catalog/legacy-section-adapter.js\": function (exports, module, __bundle) {\n    var { ensure, toArray, toNullableString, unwrapReferenceValue } = __bundle.require(\"catalog/contracts.js\");\n    var LEGACY_SECTION_SELECTORS = Object.freeze({\n      productIndex: \"[data-ev-tool-index-json]\",\n      variantManifest: \"[data-ev-tool-product-variants-json]\",\n      productDetail: \"[data-ev-tool-detail-json]\",\n    });\n    \n    function firstOf(source, keys) {\n      var index;\n      for (index = 0; index < keys.length; index += 1) {\n        if (source && Object.prototype.hasOwnProperty.call(source, keys[index])) {\n          return source[keys[index]];\n        }\n      }\n      return undefined;\n    }\n    \n    function readPathAwareValue(source, key) {\n      var current = source;\n      var segments;\n      var index;\n    \n      if (!source || key == null) return undefined;\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        return source[key];\n      }\n      if (String(key).indexOf(\".\") < 0) return undefined;\n    \n      segments = String(key).split(\".\");\n      for (index = 0; index < segments.length; index += 1) {\n        if (!current || typeof current !== \"object\" || !Object.prototype.hasOwnProperty.call(current, segments[index])) {\n          return undefined;\n        }\n        current = current[segments[index]];\n      }\n      return current;\n    }\n    \n    function firstPathAwareOf(source, keys) {\n      var index;\n      var value;\n      for (index = 0; index < keys.length; index += 1) {\n        value = readPathAwareValue(source, keys[index]);\n        if (value !== undefined) return value;\n      }\n      return undefined;\n    }\n    \n    function firstPresentValue(values) {\n      var index;\n      for (index = 0; index < (values || []).length; index += 1) {\n        if (values[index] !== undefined && values[index] !== null && values[index] !== \"\") {\n          return values[index];\n        }\n      }\n      return undefined;\n    }\n    \n    function pickLegacyFluteCount(rawSource, common, system, features) {\n      return unwrapReferenceValue(firstPresentValue([\n        firstPathAwareOf(rawSource, [\n          \"flute_count\",\n          \"geom_nof\",\n          \"custom.geom_nof\",\n          \"custom.millbody_f21\",\n          \"millbody_f21\",\n          \"metafields.custom.millbody_f21\",\n          \"variant.metafields.custom.millbody_f21\",\n        ]),\n        firstPathAwareOf(common, [\"flute_count\", \"geom_nof\", \"millbody_f21\", \"metafields.custom.millbody_f21\"]),\n        firstPathAwareOf(system, [\"millbody_f21\", \"geom_nof\", \"flute_count\", \"metafields.custom.millbody_f21\"]),\n        firstPathAwareOf(features, [\"common.flute_count\", \"common.geom_nof\", \"common.millbody_f21\", \"common.metafields.custom.millbody_f21\"]),\n        firstPathAwareOf(features, [\"system.millbody_f21\", \"system.geom_nof\", \"system.flute_count\", \"system.metafields.custom.millbody_f21\"]),\n      ]));\n    }\n    \n    function getContentType(response) {\n      if (!response || !response.headers || typeof response.headers.get !== \"function\") return \"\";\n      return String(response.headers.get(\"content-type\") || \"\").toLowerCase();\n    }\n    \n    function isHtmlResponse(response) {\n      var contentType = getContentType(response);\n      return contentType.indexOf(\"text/html\") >= 0 || contentType.indexOf(\"text/plain\") >= 0;\n    }\n    \n    function parseEmbeddedJson(text, selector, label) {\n      var parser;\n      var documentNode;\n      var payloadNode;\n      var payloadText;\n    \n      ensure(typeof DOMParser !== \"undefined\", label + \" requires DOMParser in the current runtime.\");\n      parser = new DOMParser();\n      documentNode = parser.parseFromString(String(text || \"\"), \"text/html\");\n      payloadNode = documentNode.querySelector(selector);\n      ensure(!!payloadNode, label + \" did not contain the expected payload host \" + selector + \".\");\n      payloadText = String(payloadNode.textContent || \"\").trim();\n      ensure(!!payloadText, label + \" did not contain embedded JSON.\");\n      try {\n        return JSON.parse(payloadText);\n      } catch (error) {\n        throw new Error(label + \" contained invalid embedded JSON.\");\n      }\n    }\n    \n    function isLegacySectionUrl(url) {\n      var resolvedUrl = toNullableString(url);\n      return !!resolvedUrl && resolvedUrl.indexOf(\"section_id=\") >= 0;\n    }\n    \n    function setQueryParam(url, key, value) {\n      var rawUrl = toNullableString(url);\n      var baseUrl;\n      var resolved;\n      ensure(!!rawUrl, \"setQueryParam(url, key, value) requires a URL.\");\n      baseUrl = /^https?:\\/\\//i.test(rawUrl) ? null : \"https://edgevend.local\";\n      resolved = new URL(rawUrl, baseUrl || undefined);\n      if (value == null) {\n        resolved.searchParams.delete(key);\n      } else {\n        resolved.searchParams.set(key, String(value));\n      }\n      return baseUrl ? resolved.pathname + resolved.search : resolved.toString();\n    }\n    \n    async function readCatalogResponsePayload(response, options) {\n      var source = options || {};\n      var label = source.label || \"Catalog response\";\n      var selector = source.selector || null;\n      var preferText = source.preferText === true || isHtmlResponse(response);\n      var payloadText;\n    \n      if (!preferText && response && typeof response.json === \"function\") {\n        return response.json();\n      }\n    \n      if (response && typeof response.text === \"function\") {\n        payloadText = await response.text();\n        if (selector) {\n          return parseEmbeddedJson(payloadText, selector, label);\n        }\n        try {\n          return JSON.parse(payloadText);\n        } catch (error) {\n          throw new Error(label + \" returned text, but it was not valid JSON.\");\n        }\n      }\n    \n      ensure(\n        response && typeof response.json === \"function\",\n        label + \" must expose either json() or text() for payload extraction.\"\n      );\n      return response.json();\n    }\n    \n    function getLegacySelector(kind) {\n      ensure(!!LEGACY_SECTION_SELECTORS[kind], \"Unknown legacy selector kind: \" + kind);\n      return LEGACY_SECTION_SELECTORS[kind];\n    }\n    \n    function mapLegacyProductIndexItem(rawProduct) {\n      return {\n        product_id: firstOf(rawProduct, [\"product_id\", \"productId\", \"id\"]),\n        handle: firstOf(rawProduct, [\"handle\"]),\n        title: firstOf(rawProduct, [\"title\", \"productTitle\", \"name\"]),\n        vendor: firstOf(rawProduct, [\"vendor\"]),\n        url: firstOf(rawProduct, [\"url\"]),\n        imageUrl: firstOf(rawProduct, [\"img\", \"imageUrl\", \"image\"]),\n        process: firstOf(rawProduct, [\"process_handles\", \"process\", \"processes\"]),\n        iso_material_groups: firstOf(rawProduct, [\"iso_subgroups\", \"iso_material_groups\"]),\n        iso_material_sub_groups: firstOf(rawProduct, [\"iso_subgroups\", \"iso_material_sub_groups\"]),\n      };\n    }\n    \n    function mapLegacyVariantManifestItem(rawVariant, productEntry) {\n      var features = rawVariant && rawVariant.features ? rawVariant.features : {};\n      var common = features.common || {};\n      var system = features.system || {};\n      return {\n        variant_id: firstOf(rawVariant, [\"variant_id\", \"variantId\", \"id\"]),\n        id: firstOf(rawVariant, [\"id\", \"variant_id\", \"variantId\"]),\n        sku: firstOf(rawVariant, [\"sku\"]),\n        title: firstOf(rawVariant, [\"variant_title\", \"variantTitle\", \"title\"]),\n        handle: firstOf(rawVariant, [\"handle\"]),\n        vendor: firstOf(rawVariant, [\"vendor\"]),\n        process: firstOf(rawVariant, [\"process_handles\", \"process\", \"processes\"]) || (productEntry && productEntry.classification && productEntry.classification.processIds),\n        iso_material_sub_groups: firstOf(rawVariant, [\"iso_subgroups\", \"iso_material_sub_groups\"]),\n        dim_dc_mm: firstOf(common, [\"diameter_mm\"]),\n        dim_apmx_mm: firstOf(common, [\"apmx_mm\"]),\n        dim_lu_usable_mm: firstOf(common, [\"usable_length_mm\"]),\n        dim_oal_mm: firstOf(common, [\"oal_mm\"]),\n        geom_nof: pickLegacyFluteCount(rawVariant, common, system, features),\n        cool_tsc: firstOf(common, [\"coolant_tsc\"]),\n        tap_thread_size: firstOf(common, [\"thread_size\"]),\n        tap_thread_form: firstOf(common, [\"thread_standard\", \"thread_form\"]),\n      };\n    }\n    \n    function selectLegacyDetailItem(payload, manifestCandidate) {\n      var items = payload && Array.isArray(payload.items) ? payload.items : null;\n      var variantId = manifestCandidate && manifestCandidate.ids ? toNullableString(manifestCandidate.ids.variantId) : null;\n      var selected;\n    \n      ensure(Array.isArray(items), \"Legacy detail payload must contain an items array.\");\n      selected = items.find(function findItem(item) {\n        return toNullableString(firstOf(item, [\"variant_id\", \"variantId\", \"id\"])) === variantId;\n      });\n      if (!selected && items.length === 1) {\n        selected = items[0];\n      }\n      ensure(!!selected, \"Legacy detail payload did not contain the requested variant \" + variantId + \".\");\n      return selected;\n    }\n    \n    function mapLegacyDetailItem(rawDetail) {\n      var features = rawDetail && rawDetail.features ? rawDetail.features : {};\n      var common = features.common || {};\n      var milling = features.milling || {};\n      var drilling = features.drilling || {};\n      var threading = features.threading || {};\n      var turning = features.turning || {};\n      var system = features.system || {};\n    \n      return {\n        variant_id: firstOf(rawDetail, [\"variant_id\", \"variantId\", \"id\"]),\n        product_id: firstOf(rawDetail, [\"product_id\", \"productId\"]),\n        title: firstOf(rawDetail, [\"title\", \"productTitle\"]),\n        variantTitle: firstOf(rawDetail, [\"variantTitle\", \"variant_title\", \"sku\"]),\n        available: firstOf(rawDetail, [\"available\"]),\n        price: firstOf(rawDetail, [\"price\", \"priceCents\"]),\n        compare_at_price: firstOf(rawDetail, [\"compare_at_price\", \"compareAtPriceCents\"]),\n        handle: firstOf(rawDetail, [\"handle\"]),\n        url: firstOf(rawDetail, [\"url\"]),\n        image: firstOf(rawDetail, [\"img\", \"imageUrl\", \"image\"]),\n        iso_material_sub_groups: firstOf(rawDetail, [\"iso_subgroups\", \"iso_material_sub_groups\"]) || firstOf(common, [\"iso_subgroups\"]),\n        dim_dc_mm: firstOf(common, [\"diameter_mm\"]),\n        dim_apmx_mm: firstOf(common, [\"apmx_mm\"]),\n        dim_lu_usable_mm: firstOf(common, [\"usable_length_mm\"]),\n        dim_oal_mm: firstOf(common, [\"oal_mm\"]),\n        geom_nof: pickLegacyFluteCount(rawDetail, common, system, features),\n        cool_tsc: firstOf(common, [\"coolant_tsc\"]),\n        comm_moq: firstOf(common, [\"comm_moq\"]),\n        comm_step_qty: firstOf(common, [\"comm_step_qty\"]),\n        drill_point_angle_deg: firstOf(drilling, [\"point_angle_deg\"]) || firstOf(common, [\"point_angle_deg\"]),\n        drill_margin_count: firstOf(drilling, [\"margin_count\"]),\n        pre_drill_diameter: firstOf(drilling, [\"pre_drill_diameter_mm\"]),\n        endmill_g1: firstOf(milling, [\"corner_radius_mm\"]) || firstOf(common, [\"corner_radius_mm\"]),\n        endmill_f4: firstOf(milling, [\"helix_angle_deg\"]) || firstOf(common, [\"helix_angle_deg\"]),\n        dim_dn_mm: firstOf(milling, [\"neck_diameter_mm\"]),\n        dim_ln_neck_mm: firstOf(milling, [\"neck_length_mm\"]),\n        millbody_insert_count: firstOf(system, [\"millbody_insert_count\"]),\n        millbody_compatible_inserts: firstOf(system, [\"millbody_compatible_inserts\"]),\n        millbody_compatible_insert_ids: firstOf(system, [\"millbody_compatible_insert_ids\"]),\n        millins_size_code: firstOf(system, [\"millins_size_code\"]),\n        millins_grade_code: firstOf(system, [\"millins_grade_code\"]),\n        millins_chipbreaker: firstOf(system, [\"millins_chipbreaker\"]),\n        millins_corner_radius_mm: firstOf(system, [\"millins_corner_radius_mm\"]),\n        tap_thread_form: firstOf(threading, [\"thread_form\"]) || firstOf(common, [\"thread_form\"]),\n        tap_thread_size: firstOf(threading, [\"thread_size\"]) || firstOf(common, [\"thread_size\"]),\n        tap_tolerance: firstOf(threading, [\"tap_tolerance\"]),\n        tap_chamfer_form: firstOf(threading, [\"tap_chamfer_form\"]),\n        tap_helix_deg: firstOf(threading, [\"tap_helix_deg\"]),\n        tap_direction: firstOf(threading, [\"tap_direction\"]),\n        turn_iso_code: firstOf(turning, [\"turn_iso_code\"]),\n        turn_shape_code: firstOf(turning, [\"turn_shape_code\"]),\n        turn_clearance_code: firstOf(turning, [\"turn_clearance_code\"]),\n        turn_tolerance_code: firstOf(turning, [\"turn_tolerance_code\"]),\n        turn_size_ic_mm: firstOf(turning, [\"turn_size_ic_mm\"]),\n        turn_thickness_mm: firstOf(turning, [\"turn_thickness_mm\"]),\n        turn_nose_radius_mm: firstOf(turning, [\"turn_nose_radius_mm\"]) || firstOf(common, [\"turn_nose_radius_mm\"]),\n        turn_chipbreaker: firstOf(turning, [\"turn_chipbreaker\"]),\n        turn_grade_code: firstOf(turning, [\"turn_grade_code\"]) || firstOf(common, [\"turn_grade_code\"]),\n        cutProfiles: firstOf(rawDetail, [\"50_cut_profiles\", \"cut_profiles\", \"cutProfiles\"]),\n        rows: firstOf(rawDetail, [\"rows\"]) || {\n          drilling: toArray(firstOf(rawDetail, [\"42_drilling_rows_template\", \"42_drilling_rows\"])),\n          threading: toArray(firstOf(rawDetail, [\"44_tapping_rows_template\", \"44_tapping_rows\"])),\n          milling: toArray(firstOf(rawDetail, [\"41_milling_rows_template\", \"41_milling_rows\"])),\n          turning: toArray(firstOf(rawDetail, [\"40_turning_rows_template\", \"40_turning_rows\"])),\n        },\n      };\n    }\n    \n    exports.isLegacySectionUrl = isLegacySectionUrl;\n    exports.setQueryParam = setQueryParam;\n    exports.readCatalogResponsePayload = readCatalogResponsePayload;\n    exports.getLegacySelector = getLegacySelector;\n    exports.mapLegacyProductIndexItem = mapLegacyProductIndexItem;\n    exports.mapLegacyVariantManifestItem = mapLegacyVariantManifestItem;\n    exports.selectLegacyDetailItem = selectLegacyDetailItem;\n    exports.mapLegacyDetailItem = mapLegacyDetailItem;\n  },\n  \"catalog/milling-composites.js\": function (exports, module, __bundle) {\n    var { createCandidate, deepClone } = __bundle.require(\"catalog/contracts.js\");\n    function uniqueStrings(values) {\n      return Array.from(new Set((values || []).filter(Boolean)));\n    }\n    \n    function getSystemContext(candidate) {\n      return candidate && candidate.attachments && candidate.attachments.systemContext\n        ? candidate.attachments.systemContext\n        : {};\n    }\n    \n    function deriveHandleFromUrl(url) {\n      var match = String(url || \"\").match(/\\/products\\/([^/?#]+)/i);\n      return match ? match[1] : null;\n    }\n    \n    function isMillingCandidate(candidate) {\n      return !!(candidate\n        && candidate.stage === \"detail\"\n        && candidate.classification\n        && Array.isArray(candidate.classification.domainFamilies)\n        && candidate.classification.domainFamilies.indexOf(\"milling\") >= 0);\n    }\n    \n    function isBodyCandidate(candidate) {\n      return isMillingCandidate(candidate) && getSystemContext(candidate).toolRole === \"body\";\n    }\n    \n    function isInsertCandidate(candidate) {\n      return isMillingCandidate(candidate) && getSystemContext(candidate).toolRole === \"insert\";\n    }\n    \n    function collectCompatibleInsertIds(bodyCandidate) {\n      var systemContext = getSystemContext(bodyCandidate);\n      return uniqueStrings(\n        []\n          .concat(systemContext.millbodyCompatibleInsertIds || [])\n          .concat((systemContext.millbodyCompatibleInserts || []).map(function mapInsert(insert) {\n            return insert && insert.variantId;\n          }))\n      );\n    }\n    \n    function hasCompatibleInsertHints(bodyCandidate) {\n      var systemContext = getSystemContext(bodyCandidate);\n      return collectCompatibleInsertIds(bodyCandidate).length > 0\n        || (systemContext.millbodyCompatibleInserts || []).length > 0\n        || ((systemContext.millbodyInsertCount || 0) > 0);\n    }\n    \n    function buildCompatibleInsertManifestCandidate(bodyCandidate, compatibleInsert) {\n      var variantId = compatibleInsert && compatibleInsert.variantId ? String(compatibleInsert.variantId) : null;\n      var handle = compatibleInsert && compatibleInsert.handle\n        ? String(compatibleInsert.handle)\n        : deriveHandleFromUrl(compatibleInsert && compatibleInsert.url);\n    \n      if (!variantId || !handle) return null;\n    \n      return createCandidate({\n        stage: \"manifest\",\n        ids: {\n          productId: bodyCandidate.ids.productId + \"::insert::\" + variantId,\n          variantId: variantId,\n          handle: handle,\n          sku: compatibleInsert && compatibleInsert.sku || null,\n        },\n        catalog: {\n          productTitle: compatibleInsert && compatibleInsert.title || \"Compatible insert\",\n          variantTitle: compatibleInsert && (compatibleInsert.title || compatibleInsert.sku) || null,\n          vendor: bodyCandidate.catalog.vendor,\n          url: compatibleInsert && compatibleInsert.url || null,\n          imageUrl: compatibleInsert && compatibleInsert.imageUrl || null,\n        },\n        commerce: {\n          available: compatibleInsert && compatibleInsert.available,\n          priceCents: compatibleInsert && compatibleInsert.priceCents,\n          compareAtPriceCents: compatibleInsert && compatibleInsert.compareAtPriceCents,\n        },\n        classification: {\n          domainFamilies: [\"milling\"],\n          processIds: deepClone(bodyCandidate.classification.processIds || []),\n          materialSubgroupCodes: deepClone(bodyCandidate.classification.materialSubgroupCodes || []),\n        },\n        common: {},\n        drilling: {},\n        threading: {},\n        milling: compatibleInsert && compatibleInsert.cornerRadiusMm != null ? { cornerRadiusMm: compatibleInsert.cornerRadiusMm } : {},\n        turning: {},\n        attachments: {\n          systemContext: {\n            toolRole: \"insert\",\n            millinsSizeCode: compatibleInsert && compatibleInsert.sizeCode || null,\n            millinsGradeCode: compatibleInsert && compatibleInsert.gradeCode || null,\n            millinsChipbreaker: compatibleInsert && compatibleInsert.chipbreaker || null,\n            millinsCornerRadiusMm: compatibleInsert && compatibleInsert.cornerRadiusMm != null ? compatibleInsert.cornerRadiusMm : null,\n          },\n        },\n        rows: { drilling: [], threading: [], milling: [], turning: [] },\n        provenance: {\n          source: \"compatibility_manifest\",\n          hydratedAt: null,\n          rawSourceRefs: [bodyCandidate.ids.variantId + \"::\" + variantId],\n          classificationEvidence: {\n            processesFrom: \"mixed\",\n            familiesFrom: \"mixed\",\n          },\n        },\n      });\n    }\n    \n    function mergeAvailability(bodyCandidate, insertCandidate) {\n      if (bodyCandidate.commerce.available === false || insertCandidate.commerce.available === false) return false;\n      if (bodyCandidate.commerce.available === true || insertCandidate.commerce.available === true) return true;\n      return null;\n    }\n    \n    function buildSelectedInsert(insertCandidate) {\n      var systemContext = getSystemContext(insertCandidate);\n      return {\n        variantId: insertCandidate.ids.variantId,\n        sku: insertCandidate.ids.sku || null,\n        productTitle: insertCandidate.catalog.productTitle,\n        variantTitle: insertCandidate.catalog.variantTitle,\n        productUrl: insertCandidate.catalog.url,\n        imageUrl: insertCandidate.catalog.imageUrl,\n        available: insertCandidate.commerce.available,\n        priceCents: insertCandidate.commerce.priceCents,\n        compareAtPriceCents: insertCandidate.commerce.compareAtPriceCents,\n        sizeCode: systemContext.millinsSizeCode || null,\n        gradeCode: systemContext.millinsGradeCode || null,\n        chipbreaker: systemContext.millinsChipbreaker || null,\n        cornerRadiusMm: systemContext.millinsCornerRadiusMm != null ? systemContext.millinsCornerRadiusMm : insertCandidate.milling.cornerRadiusMm,\n      };\n    }\n    \n    function createCompositeCandidate(bodyCandidate, insertCandidate) {\n      var compositeKey = bodyCandidate.ids.variantId + \"::\" + insertCandidate.ids.variantId;\n      var bodySystem = getSystemContext(bodyCandidate);\n      var insertSystem = getSystemContext(insertCandidate);\n      var selectedInsert = buildSelectedInsert(insertCandidate);\n      var millingRows = insertCandidate.rows && insertCandidate.rows.milling && insertCandidate.rows.milling.length > 0\n        ? insertCandidate.rows.milling\n        : bodyCandidate.rows.milling;\n      var compositeAttachments = Object.assign({}, deepClone(bodyCandidate.attachments || {}), {\n        systemContext: Object.assign({}, deepClone(bodySystem), deepClone(insertSystem), {\n          toolRole: \"composite\",\n          compositeKey: compositeKey,\n          bodyProductTitle: bodyCandidate.catalog.productTitle,\n          bodyVariantTitle: bodyCandidate.catalog.variantTitle || null,\n          bodyVariantId: bodyCandidate.ids.variantId,\n          bodySku: bodyCandidate.ids.sku || null,\n          bodyProductUrl: bodyCandidate.catalog.url || null,\n          bodyFluteCount: bodyCandidate.common && bodyCandidate.common.fluteCount != null ? bodyCandidate.common.fluteCount : null,\n          bodyAvailable: bodyCandidate.commerce.available,\n          bodyPriceCents: bodyCandidate.commerce.priceCents,\n          bodyCompareAtPriceCents: bodyCandidate.commerce.compareAtPriceCents,\n          insertVariantId: insertCandidate.ids.variantId,\n          insertSku: insertCandidate.ids.sku || null,\n          selectedInsert: selectedInsert,\n          insertCatalogContext: deepClone(insertCandidate.attachments && insertCandidate.attachments.catalogContext || {}),\n        }),\n      });\n    \n      return createCandidate({\n        stage: \"detail\",\n        ids: {\n          productId: bodyCandidate.ids.productId,\n          variantId: compositeKey,\n          handle: bodyCandidate.ids.handle,\n          sku: uniqueStrings([bodyCandidate.ids.sku, insertCandidate.ids.sku]).join(\" + \") || bodyCandidate.ids.sku || insertCandidate.ids.sku || null,\n        },\n        catalog: {\n          productTitle: bodyCandidate.catalog.productTitle,\n          variantTitle: uniqueStrings([bodyCandidate.catalog.variantTitle, insertCandidate.catalog.variantTitle || insertCandidate.ids.sku]).join(\" + \") || bodyCandidate.catalog.variantTitle || insertCandidate.catalog.variantTitle,\n          vendor: bodyCandidate.catalog.vendor || insertCandidate.catalog.vendor,\n          url: bodyCandidate.catalog.url,\n          imageUrl: bodyCandidate.catalog.imageUrl || insertCandidate.catalog.imageUrl,\n        },\n        commerce: {\n          available: mergeAvailability(bodyCandidate, insertCandidate),\n          priceCents: null,\n          compareAtPriceCents: null,\n        },\n        classification: {\n          domainFamilies: uniqueStrings([].concat(bodyCandidate.classification.domainFamilies || []).concat(insertCandidate.classification.domainFamilies || [])),\n          processIds: uniqueStrings([].concat(bodyCandidate.classification.processIds || []).concat(insertCandidate.classification.processIds || [])),\n          materialSubgroupCodes: uniqueStrings([].concat(bodyCandidate.classification.materialSubgroupCodes || []).concat(insertCandidate.classification.materialSubgroupCodes || [])),\n        },\n        common: deepClone(bodyCandidate.common || {}),\n        drilling: deepClone(bodyCandidate.drilling || {}),\n        threading: deepClone(bodyCandidate.threading || {}),\n        milling: Object.assign({}, deepClone(bodyCandidate.milling || {}), deepClone(insertCandidate.milling || {})),\n        turning: deepClone(bodyCandidate.turning || {}),\n        attachments: compositeAttachments,\n        rows: {\n          drilling: [],\n          threading: [],\n          milling: deepClone(millingRows || []),\n          turning: [],\n        },\n        provenance: {\n          source: \"detail_json_composite\",\n          hydratedAt: new Date().toISOString(),\n          rawSourceRefs: uniqueStrings([]\n            .concat(bodyCandidate.provenance && bodyCandidate.provenance.rawSourceRefs || [])\n            .concat(insertCandidate.provenance && insertCandidate.provenance.rawSourceRefs || [])\n            .concat([compositeKey])),\n          classificationEvidence: {\n            processesFrom: \"mixed\",\n            familiesFrom: \"mixed\",\n          },\n        },\n      });\n    }\n    \n    function composeIndexableMillingCandidates(candidates) {\n      var insertsById = new Map();\n      var output = [];\n      var bodies = [];\n    \n      (candidates || []).forEach(function eachCandidate(candidate) {\n        if (isInsertCandidate(candidate)) {\n          insertsById.set(candidate.ids.variantId, candidate);\n          return;\n        }\n        if (isBodyCandidate(candidate)) {\n          bodies.push(candidate);\n          return;\n        }\n        output.push(candidate);\n      });\n    \n      bodies.forEach(function eachBody(bodyCandidate) {\n        var compatibleInsertIds = collectCompatibleInsertIds(bodyCandidate);\n        var matchedInserts = compatibleInsertIds.map(function mapInsertId(variantId) {\n          return insertsById.get(variantId);\n        }).filter(Boolean);\n    \n        if (matchedInserts.length === 0) {\n          if (!hasCompatibleInsertHints(bodyCandidate)) {\n            output.push(bodyCandidate);\n          }\n          return;\n        }\n    \n        matchedInserts.forEach(function eachInsert(insertCandidate) {\n          output.push(createCompositeCandidate(bodyCandidate, insertCandidate));\n        });\n      });\n    \n      return output;\n    }\n    \n    function collectMissingIndexableInsertManifestCandidates(candidates) {\n      var existingInsertIds = new Set();\n      var syntheticCandidates = [];\n      var seenSyntheticKeys = new Set();\n    \n      (candidates || []).forEach(function eachCandidate(candidate) {\n        if (isInsertCandidate(candidate)) {\n          existingInsertIds.add(candidate.ids.variantId);\n        }\n      });\n    \n      (candidates || []).forEach(function eachCandidate(candidate) {\n        var compatibleInserts;\n    \n        if (!isBodyCandidate(candidate)) return;\n        compatibleInserts = getSystemContext(candidate).millbodyCompatibleInserts || [];\n    \n        compatibleInserts.forEach(function eachInsert(compatibleInsert) {\n          var syntheticCandidate;\n          var syntheticKey;\n          var variantId = compatibleInsert && compatibleInsert.variantId ? String(compatibleInsert.variantId) : null;\n    \n          if (!variantId || existingInsertIds.has(variantId)) return;\n          syntheticCandidate = buildCompatibleInsertManifestCandidate(candidate, compatibleInsert);\n          if (!syntheticCandidate) return;\n    \n          syntheticKey = syntheticCandidate.ids.variantId + \"::\" + syntheticCandidate.ids.handle;\n          if (seenSyntheticKeys.has(syntheticKey)) return;\n          seenSyntheticKeys.add(syntheticKey);\n          syntheticCandidates.push(syntheticCandidate);\n        });\n      });\n    \n      return syntheticCandidates;\n    }\n    \n    exports.composeIndexableMillingCandidates = composeIndexableMillingCandidates;\n    exports.collectMissingIndexableInsertManifestCandidates = collectMissingIndexableInsertManifestCandidates;\n  },\n  \"catalog/normalizers.js\": function (exports, module, __bundle) {\n    var { PROCESS_FAMILY_BY_ID, createCandidate, createProductPoolEntry, deepClone, normalizeMaterialCodeList, normalizeRowKind, toArray, toNullableBoolean, toNullableNumber, toNullableString, unwrapReferenceValue } = __bundle.require(\"catalog/contracts.js\");\n    var { normalizeLegacyProcessId } = __bundle.require(\"compatibility/legacy-process-aliases.js\");\n    var { drillingTools } = __bundle.require(\"family-toolkits/drilling-tools.js\");\n    var { threadingTools } = __bundle.require(\"family-toolkits/threading-tools.js\");\n    var { millingTools } = __bundle.require(\"family-toolkits/milling-tools.js\");\n    var { turningTools } = __bundle.require(\"family-toolkits/turning-tools.js\");\n    var FAMILY_TOOLKITS = {\n      drilling: drillingTools,\n      threading: threadingTools,\n      milling: millingTools,\n      turning: turningTools,\n    };\n    var ROW_KIND_FAMILY_BY_ID = Object.freeze({\n      drill: \"drilling\",\n      ream: \"drilling\",\n      countersink: \"drilling\",\n      chamfer: \"drilling\",\n      tap: \"threading\",\n      form_tap: \"threading\",\n      thread_mill: \"threading\",\n      slot: \"milling\",\n      shoulder: \"milling\",\n      face: \"milling\",\n      pocket: \"milling\",\n      copy: \"milling\",\n      hfm: \"milling\",\n      trochoidal: \"milling\",\n      plunge: \"milling\",\n      ramp: \"milling\",\n      profile: \"turning\",\n      bore: \"turning\",\n      groove: \"turning\",\n      diameter: \"turning\",\n      face_turn: \"turning\",\n    });\n    \n    function firstOf(source, keys) {\n      for (var i = 0; i < keys.length; i += 1) {\n        if (source && Object.prototype.hasOwnProperty.call(source, keys[i])) {\n          return source[keys[i]];\n        }\n      }\n      return undefined;\n    }\n    \n    function readPathAwareValue(source, key) {\n      var current = source;\n      var segments;\n      var index;\n    \n      if (!source || key == null) return undefined;\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        return source[key];\n      }\n      if (String(key).indexOf(\".\") < 0) return undefined;\n    \n      segments = String(key).split(\".\");\n      for (index = 0; index < segments.length; index += 1) {\n        if (!current || typeof current !== \"object\" || !Object.prototype.hasOwnProperty.call(current, segments[index])) {\n          return undefined;\n        }\n        current = current[segments[index]];\n      }\n      return current;\n    }\n    \n    function firstPathAwareOf(source, keys) {\n      var index;\n      var value;\n      for (index = 0; index < keys.length; index += 1) {\n        value = readPathAwareValue(source, keys[index]);\n        if (value !== undefined) return value;\n      }\n      return undefined;\n    }\n    \n    function firstPresentValue(values) {\n      var index;\n      for (index = 0; index < (values || []).length; index += 1) {\n        if (values[index] !== undefined && values[index] !== null && values[index] !== \"\") {\n          return values[index];\n        }\n      }\n      return undefined;\n    }\n    \n    function pickFluteCountValue(raw) {\n      return unwrapReferenceValue(firstPresentValue([\n        firstPathAwareOf(raw, [\n          \"custom.millbody_f21\",\n          \"millbody_f21\",\n          \"metafields.custom.millbody_f21\",\n          \"variant.metafields.custom.millbody_f21\",\n          \"custom.geom_nof\",\n          \"geom_nof\",\n          \"metafields.custom.geom_nof\",\n          \"variant.metafields.custom.geom_nof\",\n          \"flute_count\",\n        ]),\n        firstPathAwareOf(raw, [\n          \"common.flute_count\",\n          \"common.geom_nof\",\n          \"common.millbody_f21\",\n          \"common.metafields.custom.millbody_f21\",\n          \"common.metafields.custom.geom_nof\",\n        ]),\n        firstPathAwareOf(raw, [\n          \"system.millbody_f21\",\n          \"system.geom_nof\",\n          \"system.flute_count\",\n          \"system.metafields.custom.millbody_f21\",\n          \"system.metafields.custom.geom_nof\",\n        ]),\n        firstPathAwareOf(raw, [\n          \"features.common.flute_count\",\n          \"features.common.geom_nof\",\n          \"features.common.millbody_f21\",\n          \"features.common.metafields.custom.millbody_f21\",\n          \"features.common.metafields.custom.geom_nof\",\n        ]),\n        firstPathAwareOf(raw, [\n          \"features.system.millbody_f21\",\n          \"features.system.geom_nof\",\n          \"features.system.flute_count\",\n          \"features.system.metafields.custom.millbody_f21\",\n          \"features.system.metafields.custom.geom_nof\",\n        ]),\n      ]));\n    }\n    \n    function normalizeProcessList(value) {\n      return toArray(value)\n        .map(function mapProcess(item) {\n          return normalizeLegacyProcessId(unwrapReferenceValue(item));\n        })\n        .filter(Boolean);\n    }\n    \n    function inferFamilyList(processIds) {\n      return Array.from(new Set(processIds.map(function mapFamily(processId) {\n        return PROCESS_FAMILY_BY_ID[processId];\n      }).filter(Boolean)));\n    }\n    \n    function uniqueStrings(values) {\n      return Array.from(new Set((values || []).filter(Boolean)));\n    }\n    \n    function isPlainObject(value) {\n      return !!value && typeof value === \"object\" && !Array.isArray(value);\n    }\n    \n    function hasPresentMergeValue(value) {\n      if (value == null) return false;\n      if (Array.isArray(value)) return value.length > 0;\n      if (!isPlainObject(value)) return true;\n      return Object.keys(value).some(function someKey(key) {\n        return hasPresentMergeValue(value[key]);\n      });\n    }\n    \n    function mergeDefinedValues(base, override) {\n      var result = isPlainObject(base) ? deepClone(base) : {};\n    \n      Object.keys(override || {}).forEach(function eachKey(key) {\n        var nextValue = override[key];\n    \n        if (Array.isArray(nextValue)) {\n          if (nextValue.length > 0 || !Object.prototype.hasOwnProperty.call(result, key)) {\n            result[key] = deepClone(nextValue);\n          }\n          return;\n        }\n    \n        if (isPlainObject(nextValue)) {\n          var mergedObject = mergeDefinedValues(result[key], nextValue);\n          if (hasPresentMergeValue(mergedObject) || !Object.prototype.hasOwnProperty.call(result, key)) {\n            result[key] = mergedObject;\n          }\n          return;\n        }\n    \n        if (nextValue != null || !Object.prototype.hasOwnProperty.call(result, key)) {\n          result[key] = nextValue;\n        }\n      });\n    \n      return result;\n    }\n    \n    function normalizeIsoGroupAttachment(value) {\n      var labels = toArray(value)\n        .map(function mapLabel(item) {\n          if (item && typeof item === \"object\") {\n            return toNullableString(firstOf(item, [\"label\", \"label_en\", \"name\", \"value\", \"code\"]));\n          }\n          return toNullableString(item);\n        })\n        .filter(Boolean);\n      return {\n        codes: uniqueStrings(normalizeMaterialCodeList(labels)),\n        labels: uniqueStrings(labels),\n      };\n    }\n    \n    function normalizeCatalogAttachments(raw) {\n      var compatibleInserts = toArray(firstOf(raw, [\"millbody_compatible_inserts\"])).map(function mapInsert(insert) {\n        return {\n          variantId: toNullableString(firstOf(insert, [\"variant_id\", \"variantId\", \"id\"])),\n          handle: toNullableString(firstOf(insert, [\"handle\"])),\n          title: toNullableString(firstOf(insert, [\"title\", \"name\"])),\n          sku: toNullableString(firstOf(insert, [\"sku\"])),\n          available: toNullableBoolean(firstOf(insert, [\"available\"])),\n          priceCents: toNullableNumber(firstOf(insert, [\"price\"])),\n          compareAtPriceCents: toNullableNumber(firstOf(insert, [\"compare_at_price\", \"compareAtPrice\"])),\n          url: toNullableString(firstOf(insert, [\"url\"])),\n          imageUrl: toNullableString(firstOf(insert, [\"img\", \"image\", \"imageUrl\"])),\n          moq: toNullableNumber(firstOf(insert, [\"comm_moq\", \"moq\"])),\n          stepQty: toNullableNumber(firstOf(insert, [\"comm_step_qty\", \"step_qty\"])),\n          sizeCode: toNullableString(firstOf(insert, [\"size_code\"])),\n          gradeCode: toNullableString(firstOf(insert, [\"grade_code\"])),\n          chipbreaker: toNullableString(firstOf(insert, [\"chipbreaker\"])),\n          cornerRadiusMm: toNullableNumber(firstOf(insert, [\"corner_radius_mm\"])),\n        };\n      }).filter(function keepInsert(insert) {\n        return insert.variantId || insert.sku || insert.handle || insert.sizeCode || insert.gradeCode;\n      });\n    \n      return {\n        catalogContext: {\n          manufacturer: toNullableString(firstOf(raw, [\"spec_manufacturer\", \"manufacturer\"])),\n          brand: toNullableString(firstOf(raw, [\"spec_brand\", \"brand\"])),\n          series: toNullableString(firstOf(raw, [\"spec_series\", \"series\"])),\n          coating: toNullableString(firstOf(raw, [\"spec_coating\", \"coating\"])),\n          substrate: toNullableString(firstOf(raw, [\"spec_substrate\", \"substrate\"])),\n          mpn: toNullableString(firstOf(raw, [\"spec_mpn\", \"mpn\"])),\n          leadTimeDays: toNullableNumber(firstOf(raw, [\"comm_lead_time_days\", \"lead_time_days\"])),\n          moq: toNullableNumber(firstOf(raw, [\"comm_moq\", \"moq\"])),\n          stepQty: toNullableNumber(firstOf(raw, [\"comm_step_qty\", \"step_qty\"])),\n          unitOfMeasure: toNullableString(firstOf(raw, [\"comm_uom\", \"uom\"])),\n          packageQuantity: toNullableNumber(firstOf(raw, [\"pkg_qty\"])),\n          packageDimensionsMm: toNullableString(firstOf(raw, [\"pkg_dimensions_mm\"])),\n          availability: toNullableString(firstOf(raw, [\"comm_availability\", \"availability\"])),\n          countryOfOrigin: toNullableString(firstOf(raw, [\"trade_origin_country\", \"origin_country\"])),\n          hsCode: toNullableString(firstOf(raw, [\"trade_hs_code\", \"hs_code\"])),\n          unspsc: toNullableString(firstOf(raw, [\"trade_unspsc\", \"unspsc\"])),\n          rohs: toNullableBoolean(firstOf(raw, [\"compliance_rohs\", \"rohs\"])),\n          reach: toNullableBoolean(firstOf(raw, [\"compliance_reach\", \"reach\"])),\n        },\n        materialContext: {\n          isoGroups: normalizeIsoGroupAttachment(firstOf(raw, [\"iso_material_groups\", \"mat_iso_groups\"])),\n        },\n        geometryContext: {\n          helixHand: toNullableString(firstOf(raw, [\"geom_fhh\", \"helix_hand\"])),\n          helixHandDeg: toNullableNumber(firstOf(raw, [\"geom_fhh_deg\"])),\n          endStyle: toNullableString(firstOf(raw, [\"geom_end_style\"])),\n          centerCut: toNullableBoolean(firstOf(raw, [\"geom_center_cut\"])),\n          variablePitch: toNullableString(firstOf(raw, [\"geom_variable_pitch\"])),\n          nofList: toNullableString(firstOf(raw, [\"geom_nof_list\"])),\n          shankForm: toNullableString(firstOf(raw, [\"clamp_shaft_form\", \"shaft_form\"])),\n          shankLengthMm: toNullableNumber(firstOf(raw, [\"clamp_lsc_mm\", \"endmill_c4\"])),\n          backEndForm: toNullableString(firstOf(raw, [\"back_end_form\"])),\n          backEndSize: toNullableString(firstOf(raw, [\"back_end_size\"])),\n        },\n        turningContext: {\n          gradeCodeLegacy: toNullableString(firstOf(raw, [\"spec_grade_code\"])),\n        },\n        systemContext: {\n          toolRole: compatibleInserts.length > 0 || toNullableNumber(firstOf(raw, [\"millbody_insert_count\"])) != null ? \"body\" : (\n            toNullableString(firstOf(raw, [\"millins_size_code\", \"millins_grade_code\", \"millins_chipbreaker\"])) || toNullableNumber(firstOf(raw, [\"millins_corner_radius_mm\"])) != null\n              ? \"insert\"\n              : null\n          ),\n          millbodyInsertCount: toNullableNumber(firstOf(raw, [\"millbody_insert_count\"])),\n          millbodyCompatibleInserts: compatibleInserts,\n          millbodyCompatibleInsertIds: toArray(firstOf(raw, [\"millbody_compatible_insert_ids\"])).map(function mapId(item) {\n            return toNullableString(item);\n          }).filter(Boolean),\n          millinsSizeCode: toNullableString(firstOf(raw, [\"millins_size_code\"])),\n          millinsGradeCode: toNullableString(firstOf(raw, [\"millins_grade_code\"])),\n          millinsChipbreaker: toNullableString(firstOf(raw, [\"millins_chipbreaker\"])),\n          millinsCornerRadiusMm: toNullableNumber(firstOf(raw, [\"millins_corner_radius_mm\"])),\n        },\n      };\n    }\n    \n    function normalizeCommon(raw) {\n      return {\n        diameterMm: toNullableNumber(firstOf(raw, [\"dim_dc_mm\"])),\n        apmxMm: toNullableNumber(firstOf(raw, [\"dim_apmx_mm\"])),\n        usableLengthMm: toNullableNumber(firstOf(raw, [\"dim_lu_usable_mm\"])),\n        oalMm: toNullableNumber(firstOf(raw, [\"dim_oal_mm\"])),\n        fluteCount: toNullableNumber(pickFluteCountValue(raw)),\n        coolantTsc: toNullableBoolean(firstOf(raw, [\"cool_tsc\"])),\n      };\n    }\n    \n    function normalizeFamilyData(raw) {\n      return {\n        drilling: {\n          marginCount: toNullableNumber(firstOf(raw, [\"drill_margin_count\"])),\n          preDrillDiameterMm: toNullableNumber(firstOf(raw, [\"pre_drill_diameter\"])),\n          pointAngleDeg: toNullableNumber(firstOf(raw, [\"drill_point_angle_deg\"])),\n        },\n        threading: {\n          threadForm: toNullableString(firstOf(raw, [\"tap_thread_form\"])),\n          threadSize: toNullableString(firstOf(raw, [\"tap_thread_size\"])),\n          tapTolerance: toNullableString(firstOf(raw, [\"tap_tolerance\"])),\n          tapChamferForm: toNullableString(firstOf(raw, [\"tap_chamfer_form\"])),\n          tapChamferLengthP: toNullableNumber(firstOf(raw, [\"tap_chamfer_length_p\"])),\n          tapHelixDeg: toNullableNumber(firstOf(raw, [\"tap_helix_deg\"])),\n          neckLengthMm: toNullableNumber(firstOf(raw, [\"dim_ln_neck_mm\"])),\n        },\n        milling: {\n          neckDiameterMm: toNullableNumber(firstOf(raw, [\"dim_dn_mm\"])),\n          helixAngleDeg: toNullableNumber(firstOf(raw, [\"endmill_f4\"])),\n          cornerRadiusMm: toNullableNumber(firstOf(raw, [\"endmill_g1\"])),\n          cornerChamferWidthMm: toNullableNumber(firstOf(raw, [\"endmill_g2\"])),\n          cornerChamferAngleDeg: toNullableNumber(firstOf(raw, [\"endmill_g3\"])),\n        },\n        turning: {\n          turnIsoCode: toNullableString(firstOf(raw, [\"turn_iso_code\"])),\n          turnShapeCode: toNullableString(firstOf(raw, [\"turn_shape_code\"])),\n          turnClearanceCode: toNullableString(firstOf(raw, [\"turn_clearance_code\"])),\n          turnToleranceCode: toNullableString(firstOf(raw, [\"turn_tolerance_code\"])),\n          turnSizeIcMm: toNullableNumber(firstOf(raw, [\"turn_size_ic_mm\"])),\n          turnThicknessMm: toNullableNumber(firstOf(raw, [\"turn_thickness_mm\"])),\n          turnNoseRadiusMm: toNullableNumber(firstOf(raw, [\"turn_nose_radius_mm\"])),\n          turnGradeCode: toNullableString(firstOf(raw, [\"turn_grade_code\"])),\n        },\n      };\n    }\n    \n    function mapFieldEntriesToObject(fields) {\n      var result = {};\n      toArray(fields).forEach(function eachField(field) {\n        var key = toNullableString(firstOf(field, [\"key\", \"name\"]));\n        var value = firstOf(field, [\"value\", \"jsonValue\", \"reference\", \"references\"]);\n        if (!key) return;\n        result[key] = value;\n      });\n      return Object.keys(result).length > 0 ? result : null;\n    }\n    \n    function unwrapCutProfileEntry(entry) {\n      var candidate = entry;\n      var mappedFields = null;\n      var wrapperValue;\n      if (!candidate || typeof candidate !== \"object\") return candidate;\n    \n      mappedFields = Array.isArray(candidate.fields) ? mapFieldEntriesToObject(candidate.fields) : null;\n      if (mappedFields) return mappedFields;\n    \n      wrapperValue = firstOf(candidate, [\"profile\", \"cutProfile\", \"value\", \"fieldData\", \"metaobject\", \"node\"]);\n      if (wrapperValue && typeof wrapperValue === \"object\") {\n        candidate = wrapperValue;\n      }\n    \n      mappedFields = Array.isArray(candidate && candidate.fields) ? mapFieldEntriesToObject(candidate.fields) : null;\n      return mappedFields || candidate;\n    }\n    \n    function collectCutProfileEntries(rawDetail) {\n      var source = firstOf(rawDetail, [\"cutProfiles\", \"50_cut_profiles\", \"cut_profiles\"]);\n      var entries = [];\n    \n      if (source == null) return entries;\n    \n      if (Array.isArray(source)) {\n        return source.map(function mapEntry(entry, index) {\n          return {\n            familyHint: null,\n            row: unwrapCutProfileEntry(entry),\n            sourceProfileIndex: index,\n          };\n        });\n      }\n    \n      if (source && typeof source === \"object\") {\n        [\"drilling\", \"threading\", \"milling\", \"turning\"].forEach(function eachFamily(family) {\n          if (!Array.isArray(source[family])) return;\n          entries = entries.concat(source[family].map(function mapEntry(entry, index) {\n            return {\n              familyHint: family,\n              row: unwrapCutProfileEntry(entry),\n              sourceProfileIndex: index,\n            };\n          }));\n        });\n        if (entries.length > 0) return entries;\n        if (Array.isArray(source.items)) {\n          return source.items.map(function mapEntry(entry, index) {\n            return {\n              familyHint: null,\n              row: unwrapCutProfileEntry(entry),\n              sourceProfileIndex: index,\n            };\n          });\n        }\n        if (Array.isArray(source.profiles)) {\n          return source.profiles.map(function mapEntry(entry, index) {\n            return {\n              familyHint: null,\n              row: unwrapCutProfileEntry(entry),\n              sourceProfileIndex: index,\n            };\n          });\n        }\n      }\n    \n      return toArray(source).map(function mapEntry(entry, index) {\n        return {\n          familyHint: null,\n          row: unwrapCutProfileEntry(entry),\n          sourceProfileIndex: index,\n        };\n      });\n    }\n    \n    function inferCutProfileFamily(rawRow) {\n      var processFamilies = inferFamilyList(normalizeProcessList(firstOf(rawRow, [\n        \"processIds\",\n        \"process\",\n        \"processes\",\n        \"operation_code\",\n        \"operationCode\",\n      ])));\n      var rowKind = normalizeRowKind(firstOf(rawRow, [\"row_kind\", \"rowKind\", \"kind\", \"type\"]));\n    \n      if (processFamilies.length === 1) return processFamilies[0];\n      return ROW_KIND_FAMILY_BY_ID[rowKind] || null;\n    }\n    \n    function normalizeRows(rawDetail, candidateIds) {\n      var rows = { drilling: [], threading: [], milling: [], turning: [] };\n      var cutProfileEntries = collectCutProfileEntries(rawDetail);\n      var groups = [\n        { family: \"drilling\", sources: [\"drilling\", \"42_drilling_rows\", \"42_drilling_rows_template\"] },\n        { family: \"threading\", sources: [\"threading\", \"44_tapping_rows\", \"44_tapping_rows_template\"] },\n        { family: \"milling\", sources: [\"milling\", \"41_milling_rows\", \"41_milling_rows_template\"] },\n        { family: \"turning\", sources: [\"turning\", \"40_turning_rows\", \"40_turning_rows_template\"] },\n      ];\n    \n      groups.forEach(function eachGroup(group) {\n        var toolkit = FAMILY_TOOLKITS[group.family];\n        var rawRows = [];\n        var tracedRows;\n    \n        if (Array.isArray(rawDetail.rows && rawDetail.rows[group.family])) {\n          rawRows = rawRows.concat(rawDetail.rows[group.family].map(function mapRow(row) {\n            return { sourceKey: \"rows.\" + group.family, row: row };\n          }));\n        }\n        group.sources.forEach(function eachSource(key) {\n          if (Array.isArray(rawDetail[key])) {\n            rawRows = rawRows.concat(rawDetail[key].map(function mapRow(row) {\n              return { sourceKey: key, row: row };\n            }));\n          }\n        });\n        if (rawRows.length === 0 && cutProfileEntries.length > 0) {\n          rawRows = cutProfileEntries.filter(function keepEntry(entry) {\n            return (entry.familyHint || inferCutProfileFamily(entry.row)) === group.family;\n          }).map(function mapEntry(entry) {\n            return {\n              sourceKey: \"50_cut_profiles\",\n              row: entry.row,\n              sourceProfileIndex: entry.sourceProfileIndex,\n            };\n          });\n        }\n    \n        tracedRows = rawRows.map(function mapTrace(entry, index) {\n          return Object.assign({}, entry, { sourceRowIndex: index });\n        });\n    \n        if (typeof toolkit.normalizeRows === \"function\") {\n          rows[group.family] = toolkit.normalizeRows(tracedRows, {\n            productId: candidateIds.productId,\n            variantId: candidateIds.variantId,\n            handle: candidateIds.handle,\n            rawDetail: rawDetail,\n          }).filter(Boolean);\n          return;\n        }\n    \n        rows[group.family] = tracedRows.map(function mapRow(entry) {\n          return toolkit.normalizeRow(entry.row, {\n            productId: candidateIds.productId,\n            variantId: candidateIds.variantId,\n            handle: candidateIds.handle,\n            sourceFamilyField: entry.sourceKey,\n            sourceRowIndex: entry.sourceRowIndex,\n            sourceProfileIndex: entry.sourceProfileIndex != null ? entry.sourceProfileIndex : null,\n          });\n        }).filter(Boolean);\n      });\n    \n      return rows;\n    }\n    \n    function collectRowProcessIds(rows) {\n      return uniqueStrings(Object.keys(rows || {}).reduce(function collectFamilies(result, family) {\n        return result.concat((rows[family] || []).reduce(function collectRows(rowResult, row) {\n          return rowResult.concat(row && row.constraints ? row.constraints.processIds || [] : []);\n        }, []));\n      }, []));\n    }\n    \n    function collectRowMaterialCodes(rows) {\n      return uniqueStrings(Object.keys(rows || {}).reduce(function collectFamilies(result, family) {\n        return result.concat((rows[family] || []).reduce(function collectRows(rowResult, row) {\n          var constraints = row && row.constraints ? row.constraints : {};\n          return rowResult\n            .concat(constraints.materialCodes || [])\n            .concat(constraints.secondaryMaterialCodes || []);\n        }, []));\n      }, []));\n    }\n    \n    function collectRowFamilies(rows) {\n      return Object.keys(rows || {}).filter(function keepFamily(family) {\n        return Array.isArray(rows[family]) && rows[family].length > 0;\n      });\n    }\n    \n    function normalizeProductPoolEntry(rawProduct) {\n      var processIds = normalizeProcessList(firstOf(rawProduct, [\"processIds\", \"process\", \"processes\"]));\n      return createProductPoolEntry({\n        ids: {\n          productId: toNullableString(firstOf(rawProduct, [\"productId\", \"id\", \"product_id\"])),\n          handle: toNullableString(firstOf(rawProduct, [\"handle\"])),\n        },\n        catalog: {\n          productTitle: toNullableString(firstOf(rawProduct, [\"productTitle\", \"title\", \"name\"])) || \"\",\n          vendor: toNullableString(firstOf(rawProduct, [\"vendor\"])),\n          url: toNullableString(firstOf(rawProduct, [\"url\"])),\n          imageUrl: toNullableString(firstOf(rawProduct, [\"imageUrl\", \"image\"])),\n        },\n        classification: {\n          domainFamilies: inferFamilyList(processIds),\n          processIds: processIds,\n          materialGroupCodes: normalizeMaterialCodeList(firstOf(rawProduct, [\"iso_material_groups\"])),\n          materialSubgroupCodes: normalizeMaterialCodeList(firstOf(rawProduct, [\"iso_material_sub_groups\"])),\n        },\n        attachments: normalizeCatalogAttachments(rawProduct),\n        provenance: {\n          source: \"product_index\",\n          rawSourceRefs: [toNullableString(firstOf(rawProduct, [\"handle\"])) || \"product_index\"],\n        },\n      });\n    }\n    \n    function normalizeCandidateManifest(rawVariant, productEntry) {\n      var processIds = normalizeProcessList(firstOf(rawVariant, [\"processIds\", \"process\", \"processes\"]));\n      if (processIds.length === 0) processIds = productEntry.classification.processIds;\n      var familyData = normalizeFamilyData(rawVariant);\n      return createCandidate({\n        stage: \"manifest\",\n        ids: {\n          productId: productEntry.ids.productId,\n          variantId: toNullableString(firstOf(rawVariant, [\"variantId\", \"id\", \"variant_id\"])),\n          handle: productEntry.ids.handle,\n          sku: toNullableString(firstOf(rawVariant, [\"sku\"])),\n        },\n        catalog: {\n          productTitle: productEntry.catalog.productTitle,\n          variantTitle: toNullableString(firstOf(rawVariant, [\"variantTitle\", \"title\"])),\n          vendor: productEntry.catalog.vendor,\n          url: productEntry.catalog.url,\n          imageUrl: productEntry.catalog.imageUrl,\n        },\n        classification: {\n          domainFamilies: inferFamilyList(processIds),\n          processIds: processIds,\n          materialSubgroupCodes: uniqueStrings(normalizeMaterialCodeList(firstOf(rawVariant, [\"iso_material_sub_groups\", \"materialSubgroupCodes\"])).concat(productEntry.classification.materialSubgroupCodes)),\n        },\n        common: normalizeCommon(rawVariant),\n        drilling: familyData.drilling,\n        threading: familyData.threading,\n        milling: familyData.milling,\n        turning: familyData.turning,\n        attachments: normalizeCatalogAttachments(rawVariant),\n        rows: { drilling: [], threading: [], milling: [], turning: [] },\n        provenance: {\n          source: \"variant_manifest\",\n          hydratedAt: null,\n          rawSourceRefs: [productEntry.ids.handle + \":\" + (toNullableString(firstOf(rawVariant, [\"variantId\", \"id\", \"variant_id\"])) || \"variant\")],\n          classificationEvidence: {\n            processesFrom: processIds === productEntry.classification.processIds ? \"product\" : \"variant\",\n            familiesFrom: processIds === productEntry.classification.processIds ? \"product\" : \"variant\",\n          },\n        },\n      });\n    }\n    \n    function normalizeCandidateDetail(rawDetail, manifestCandidate) {\n      var familyData = normalizeFamilyData(rawDetail);\n      var rows = normalizeRows(rawDetail, manifestCandidate.ids);\n      var manifestClassification = deepClone(manifestCandidate.classification || {});\n      var detailProcessIds = uniqueStrings(\n        []\n          .concat(manifestClassification.processIds || [])\n          .concat(normalizeProcessList(firstOf(rawDetail, [\"processIds\", \"process\", \"processes\"])))\n          .concat(collectRowProcessIds(rows))\n      );\n      var detailMaterialCodes = uniqueStrings(\n        []\n          .concat(manifestClassification.materialSubgroupCodes || [])\n          .concat(normalizeMaterialCodeList(firstOf(rawDetail, [\"iso_material_sub_groups\", \"materialSubgroupCodes\", \"iso_material_groups\", \"mat_iso_groups\"])))\n          .concat(collectRowMaterialCodes(rows))\n      );\n      var detailFamilies = uniqueStrings(\n        []\n          .concat(manifestClassification.domainFamilies || [])\n          .concat(inferFamilyList(detailProcessIds))\n          .concat(collectRowFamilies(rows))\n      );\n      var classificationEvidence = deepClone(manifestCandidate.provenance.classificationEvidence);\n    \n      if ((manifestClassification.processIds || []).length === 0 && detailProcessIds.length > 0) {\n        classificationEvidence.processesFrom = \"detail\";\n      } else if (detailProcessIds.length > (manifestClassification.processIds || []).length) {\n        classificationEvidence.processesFrom = \"mixed\";\n      }\n      if ((manifestClassification.domainFamilies || []).length === 0 && detailFamilies.length > 0) {\n        classificationEvidence.familiesFrom = \"detail\";\n      } else if (detailFamilies.length > (manifestClassification.domainFamilies || []).length) {\n        classificationEvidence.familiesFrom = \"mixed\";\n      }\n    \n      return createCandidate({\n        stage: \"detail\",\n        ids: deepClone(manifestCandidate.ids),\n        catalog: {\n          productTitle: toNullableString(firstOf(rawDetail, [\"productTitle\", \"title\"])) || manifestCandidate.catalog.productTitle,\n          variantTitle: toNullableString(firstOf(rawDetail, [\"variantTitle\"])) || manifestCandidate.catalog.variantTitle,\n          vendor: manifestCandidate.catalog.vendor,\n          url: manifestCandidate.catalog.url,\n          imageUrl: toNullableString(firstOf(rawDetail, [\"imageUrl\", \"image\"])) || manifestCandidate.catalog.imageUrl,\n        },\n        commerce: {\n          available: toNullableBoolean(firstOf(rawDetail, [\"available\"])),\n          priceCents: toNullableNumber(firstOf(rawDetail, [\"priceCents\", \"price\"])),\n          compareAtPriceCents: toNullableNumber(firstOf(rawDetail, [\"compareAtPriceCents\", \"compare_at_price\"])),\n        },\n        classification: {\n          domainFamilies: detailFamilies,\n          processIds: detailProcessIds,\n          materialSubgroupCodes: detailMaterialCodes,\n        },\n        common: mergeDefinedValues(manifestCandidate.common, normalizeCommon(rawDetail)),\n        drilling: mergeDefinedValues(manifestCandidate.drilling, familyData.drilling),\n        threading: mergeDefinedValues(manifestCandidate.threading, familyData.threading),\n        milling: mergeDefinedValues(manifestCandidate.milling, familyData.milling),\n        turning: mergeDefinedValues(manifestCandidate.turning, familyData.turning),\n        attachments: mergeDefinedValues(manifestCandidate.attachments, normalizeCatalogAttachments(rawDetail)),\n        rows: rows,\n        provenance: {\n          source: \"detail_json\",\n          hydratedAt: new Date().toISOString(),\n          rawSourceRefs: manifestCandidate.provenance.rawSourceRefs.concat([\"detail_json\"]),\n          classificationEvidence: classificationEvidence,\n        },\n      });\n    }\n    \n    exports.normalizeProductPoolEntry = normalizeProductPoolEntry;\n    exports.normalizeCandidateManifest = normalizeCandidateManifest;\n    exports.normalizeCandidateDetail = normalizeCandidateDetail;\n  },\n  \"catalog/product-detail-repo.js\": function (exports, module, __bundle) {\n    var { normalizeCandidateDetail } = __bundle.require(\"catalog/normalizers.js\");\n    var { ensure, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getLegacySelector, isLegacySectionUrl, mapLegacyDetailItem, readCatalogResponsePayload, selectLegacyDetailItem } = __bundle.require(\"catalog/legacy-section-adapter.js\");\n    function getStatusLabel(response) {\n      if (!response) return \"unknown\";\n      return response.status != null ? String(response.status) : (response.ok === false ? \"error\" : \"unknown\");\n    }\n    \n    function getShapeType(value) {\n      if (Array.isArray(value)) return \"array\";\n      if (value == null) return \"null\";\n      return typeof value;\n    }\n    \n    function listObjectKeys(value, limit) {\n      if (!value || typeof value !== \"object\" || Array.isArray(value)) return [];\n      return Object.keys(value).slice(0, limit || 12);\n    }\n    \n    function countArray(value) {\n      return Array.isArray(value) ? value.length : null;\n    }\n    \n    function summarizeFieldKeys(value) {\n      var source = value;\n      var fields = null;\n    \n      if (!source || typeof source !== \"object\") return [];\n      fields = Array.isArray(source.fields) ? source.fields : null;\n      if (!fields && source.value && typeof source.value === \"object\") {\n        fields = Array.isArray(source.value.fields) ? source.value.fields : null;\n      }\n      if (!fields && source.node && typeof source.node === \"object\") {\n        fields = Array.isArray(source.node.fields) ? source.node.fields : null;\n      }\n      if (!fields && source.metaobject && typeof source.metaobject === \"object\") {\n        fields = Array.isArray(source.metaobject.fields) ? source.metaobject.fields : null;\n      }\n      return (fields || []).map(function mapField(field) {\n        return field && (field.key || field.name) ? String(field.key || field.name) : null;\n      }).filter(Boolean).slice(0, 16);\n    }\n    \n    function summarizeFamilyRowSources(payload) {\n      var rows = payload && payload.rows && typeof payload.rows === \"object\" ? payload.rows : {};\n      return {\n        drilling: {\n          rowsObjectCount: countArray(rows.drilling),\n          legacyCount: countArray(payload && payload[\"42_drilling_rows\"]),\n          legacyTemplateCount: countArray(payload && payload[\"42_drilling_rows_template\"]),\n        },\n        threading: {\n          rowsObjectCount: countArray(rows.threading),\n          legacyCount: countArray(payload && payload[\"44_tapping_rows\"]),\n          legacyTemplateCount: countArray(payload && payload[\"44_tapping_rows_template\"]),\n        },\n        milling: {\n          rowsObjectCount: countArray(rows.milling),\n          legacyCount: countArray(payload && payload[\"41_milling_rows\"]),\n          legacyTemplateCount: countArray(payload && payload[\"41_milling_rows_template\"]),\n        },\n        turning: {\n          rowsObjectCount: countArray(rows.turning),\n          legacyCount: countArray(payload && payload[\"40_turning_rows\"]),\n          legacyTemplateCount: countArray(payload && payload[\"40_turning_rows_template\"]),\n        },\n      };\n    }\n    \n    function summarizeFeatureRowKeys(features) {\n      var result = {};\n      var groups = [\"common\", \"drilling\", \"threading\", \"milling\", \"turning\"];\n    \n      groups.forEach(function eachGroup(group) {\n        var source = features && features[group] && typeof features[group] === \"object\" ? features[group] : null;\n        var interestingKeys = listObjectKeys(source, 24).filter(function keepKey(key) {\n          return /(^rows$|_rows|cut_profiles|^50_cut_profiles$|^40_|^41_|^42_|^44_)/i.test(key);\n        });\n        if (interestingKeys.length > 0) {\n          result[group] = interestingKeys;\n        }\n      });\n    \n      return result;\n    }\n    \n    function summarizeCutProfilesSource(payload) {\n      var sourceKey = null;\n      var source = null;\n      var firstEntry = null;\n      var familyArrayCounts;\n    \n      [\"50_cut_profiles\", \"cut_profiles\", \"cutProfiles\"].some(function findKey(key) {\n        if (!payload || !Object.prototype.hasOwnProperty.call(payload, key)) return false;\n        sourceKey = key;\n        source = payload[key];\n        return true;\n      });\n    \n      familyArrayCounts = {\n        drilling: countArray(source && source.drilling),\n        threading: countArray(source && source.threading),\n        milling: countArray(source && source.milling),\n        turning: countArray(source && source.turning),\n      };\n    \n      if (Array.isArray(source) && source.length > 0) {\n        firstEntry = source[0];\n      } else if (source && typeof source === \"object\") {\n        if (Array.isArray(source.items) && source.items.length > 0) {\n          firstEntry = source.items[0];\n        } else if (Array.isArray(source.profiles) && source.profiles.length > 0) {\n          firstEntry = source.profiles[0];\n        } else {\n          [\"drilling\", \"threading\", \"milling\", \"turning\"].some(function pickFamily(family) {\n            if (!Array.isArray(source[family]) || source[family].length === 0) return false;\n            firstEntry = source[family][0];\n            return true;\n          });\n        }\n      }\n    \n      return {\n        present: !!sourceKey,\n        sourceKey: sourceKey,\n        type: sourceKey ? getShapeType(source) : \"missing\",\n        arrayCount: countArray(source),\n        objectKeys: listObjectKeys(source, 16),\n        familyArrayCounts: familyArrayCounts,\n        itemsCount: countArray(source && source.items),\n        profilesCount: countArray(source && source.profiles),\n        firstEntryKeys: listObjectKeys(firstEntry, 16),\n        firstEntryFieldKeys: summarizeFieldKeys(firstEntry),\n      };\n    }\n    \n    function summarizeDetailPayloadShape(payload) {\n      var features = payload && payload.features && typeof payload.features === \"object\" ? payload.features : null;\n      return {\n        type: getShapeType(payload),\n        topLevelKeys: listObjectKeys(payload, 24),\n        featuresKeys: listObjectKeys(features, 12),\n        featureRowKeys: summarizeFeatureRowKeys(features),\n        rowsKeys: listObjectKeys(payload && payload.rows, 12),\n        familyRowSources: summarizeFamilyRowSources(payload),\n        cutProfiles: summarizeCutProfilesSource(payload),\n      };\n    }\n    \n    function createProductDetailRepo(deps) {\n      var fetchImpl = deps.fetchImpl;\n      var cache = deps.cache;\n      var telemetry = deps.telemetry;\n    \n      return {\n        load: async function load(url, manifestCandidate) {\n          var resolvedUrl = toNullableString(url);\n          var cacheKey;\n          var response;\n          var payload;\n          var selectedPayload;\n          var mappedPayload;\n          var detailPayloadDebug;\n          var normalized;\n    \n          ensure(typeof fetchImpl === \"function\", \"ProductDetailRepo requires a fetch implementation.\");\n          ensure(!!resolvedUrl, \"ProductDetailRepo.load requires a product-detail URL.\");\n          ensure(!!(manifestCandidate && manifestCandidate.ids && manifestCandidate.ids.variantId), \"ProductDetailRepo.load requires a manifest candidate.\");\n    \n          cacheKey = resolvedUrl + \"::\" + manifestCandidate.ids.variantId;\n          if (cache.has(cacheKey)) return cache.get(cacheKey);\n    \n          telemetry.record(\"catalog.product-detail.load\", { url: resolvedUrl, variantId: manifestCandidate.ids.variantId });\n          response = await fetchImpl(resolvedUrl);\n          ensure(!!response, \"ProductDetailRepo received no response for \" + resolvedUrl + \".\");\n          ensure(response.ok !== false, \"ProductDetailRepo failed to load product detail. Status: \" + getStatusLabel(response) + \".\");\n          payload = await readCatalogResponsePayload(response, {\n            label: \"ProductDetailRepo product detail\",\n            selector: isLegacySectionUrl(resolvedUrl) ? getLegacySelector(\"productDetail\") : null,\n            preferText: isLegacySectionUrl(resolvedUrl),\n          });\n          ensure(!!payload && typeof payload === \"object\" && !Array.isArray(payload), \"ProductDetailRepo expected a detail object payload.\");\n    \n          if (Array.isArray(payload.items)) {\n            selectedPayload = selectLegacyDetailItem(payload, manifestCandidate);\n          } else {\n            selectedPayload = payload;\n          }\n          if (isLegacySectionUrl(resolvedUrl)) {\n            mappedPayload = mapLegacyDetailItem(selectedPayload);\n          } else {\n            mappedPayload = selectedPayload;\n          }\n          detailPayloadDebug = {\n            transport: isLegacySectionUrl(resolvedUrl) ? \"legacy_section_html\" : \"json_detail\",\n            envelope: summarizeDetailPayloadShape(payload),\n            selected: summarizeDetailPayloadShape(selectedPayload),\n            mapped: summarizeDetailPayloadShape(mappedPayload),\n          };\n    \n          normalized = normalizeCandidateDetail(mappedPayload, manifestCandidate);\n          normalized.attachments = Object.assign({}, normalized.attachments, {\n            catalogDebug: detailPayloadDebug,\n          });\n          cache.set(cacheKey, normalized);\n          return normalized;\n        },\n      };\n    }\n    \n    exports.createProductDetailRepo = createProductDetailRepo;\n  },\n  \"catalog/product-pool-repo.js\": function (exports, module, __bundle) {\n    var { normalizeProductPoolEntry } = __bundle.require(\"catalog/normalizers.js\");\n    var { ensure, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getLegacySelector, isLegacySectionUrl, mapLegacyProductIndexItem, readCatalogResponsePayload, setQueryParam } = __bundle.require(\"catalog/legacy-section-adapter.js\");\n    function getStatusLabel(response) {\n      if (!response) return \"unknown\";\n      return response.status != null ? String(response.status) : (response.ok === false ? \"error\" : \"unknown\");\n    }\n    \n    function createProductPoolRepo(deps) {\n      var fetchImpl = deps.fetchImpl;\n      var cache = deps.cache;\n      var telemetry = deps.telemetry;\n    \n      async function loadLegacyPage(url) {\n        var response = await fetchImpl(url);\n        ensure(!!response, \"ProductPoolRepo received no legacy response for \" + url + \".\");\n        ensure(response.ok !== false, \"ProductPoolRepo failed to load product index. Status: \" + getStatusLabel(response) + \".\");\n        return readCatalogResponsePayload(response, {\n          label: \"ProductPoolRepo legacy product index\",\n          selector: getLegacySelector(\"productIndex\"),\n          preferText: true,\n        });\n      }\n    \n      return {\n        load: async function load(url) {\n          var resolvedUrl = toNullableString(url);\n          var response;\n          var payload;\n          var list;\n          var totalPages;\n          var page;\n          var seenKeys = {};\n    \n          ensure(typeof fetchImpl === \"function\", \"ProductPoolRepo requires a fetch implementation.\");\n          ensure(!!resolvedUrl, \"ProductPoolRepo.load requires a product-index URL.\");\n          if (cache.has(resolvedUrl)) return cache.get(resolvedUrl);\n    \n          telemetry.record(\"catalog.product-pool.load\", { url: resolvedUrl });\n          if (isLegacySectionUrl(resolvedUrl)) {\n            payload = await loadLegacyPage(resolvedUrl);\n            list = payload && Array.isArray(payload.items) ? payload.items.slice() : null;\n            ensure(Array.isArray(list), \"ProductPoolRepo expected a legacy product-index payload with items[].\");\n            totalPages = Math.max(1, Number(payload.pages || 1));\n            for (page = 2; page <= totalPages; page += 1) {\n              payload = await loadLegacyPage(setQueryParam(resolvedUrl, \"page\", page));\n              ensure(payload && Array.isArray(payload.items), \"ProductPoolRepo expected legacy page \" + page + \" to contain items[].\");\n              list = list.concat(payload.items);\n            }\n            list = list\n              .map(mapLegacyProductIndexItem)\n              .filter(function keep(item) {\n                var itemKey = item && (item.handle || item.product_id || item.productId);\n                if (!itemKey || seenKeys[itemKey]) return false;\n                seenKeys[itemKey] = true;\n                return true;\n              });\n          } else {\n            response = await fetchImpl(resolvedUrl);\n            ensure(!!response, \"ProductPoolRepo received no response for \" + resolvedUrl + \".\");\n            ensure(response.ok !== false, \"ProductPoolRepo failed to load product index. Status: \" + getStatusLabel(response) + \".\");\n            payload = await readCatalogResponsePayload(response, {\n              label: \"ProductPoolRepo product index\",\n            });\n            list = Array.isArray(payload) ? payload : (payload && Array.isArray(payload.products) ? payload.products : null);\n            ensure(Array.isArray(list), \"ProductPoolRepo expected an array payload or { products: [] } envelope.\");\n          }\n    \n          list = list.map(normalizeProductPoolEntry);\n          cache.set(resolvedUrl, list);\n          return list;\n        },\n      };\n    }\n    \n    exports.createProductPoolRepo = createProductPoolRepo;\n  },\n  \"catalog/variant-manifest-repo.js\": function (exports, module, __bundle) {\n    var { normalizeCandidateManifest } = __bundle.require(\"catalog/normalizers.js\");\n    var { ensure, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getLegacySelector, isLegacySectionUrl, mapLegacyVariantManifestItem, readCatalogResponsePayload } = __bundle.require(\"catalog/legacy-section-adapter.js\");\n    function getStatusLabel(response) {\n      if (!response) return \"unknown\";\n      return response.status != null ? String(response.status) : (response.ok === false ? \"error\" : \"unknown\");\n    }\n    \n    function createVariantManifestRepo(deps) {\n      var fetchImpl = deps.fetchImpl;\n      var cache = deps.cache;\n      var telemetry = deps.telemetry;\n    \n      return {\n        load: async function load(url, productEntry) {\n          var resolvedUrl = toNullableString(url);\n          var cacheKey;\n          var response;\n          var payload;\n          var list;\n    \n          ensure(typeof fetchImpl === \"function\", \"VariantManifestRepo requires a fetch implementation.\");\n          ensure(!!resolvedUrl, \"VariantManifestRepo.load requires a variant-manifest URL.\");\n          ensure(!!(productEntry && productEntry.ids && productEntry.ids.handle), \"VariantManifestRepo.load requires a normalized ProductPoolEntry.\");\n    \n          cacheKey = resolvedUrl + \"::\" + productEntry.ids.handle;\n          if (cache.has(cacheKey)) return cache.get(cacheKey);\n    \n          telemetry.record(\"catalog.variant-manifest.load\", { url: resolvedUrl, handle: productEntry.ids.handle });\n          response = await fetchImpl(resolvedUrl);\n          ensure(!!response, \"VariantManifestRepo received no response for \" + resolvedUrl + \".\");\n          ensure(response.ok !== false, \"VariantManifestRepo failed to load variant manifest. Status: \" + getStatusLabel(response) + \".\");\n          payload = await readCatalogResponsePayload(response, {\n            label: \"VariantManifestRepo variant manifest\",\n            selector: isLegacySectionUrl(resolvedUrl) ? getLegacySelector(\"variantManifest\") : null,\n            preferText: isLegacySectionUrl(resolvedUrl),\n          });\n          list = Array.isArray(payload) ? payload : (payload && Array.isArray(payload.variants) ? payload.variants : null);\n          ensure(Array.isArray(list), \"VariantManifestRepo expected an array payload or { variants: [] } envelope.\");\n    \n          if (isLegacySectionUrl(resolvedUrl)) {\n            list = list.map(function mapLegacyItem(rawVariant) {\n              return mapLegacyVariantManifestItem(rawVariant, productEntry);\n            });\n          }\n    \n          list = list.map(function mapVariant(rawVariant) {\n            return normalizeCandidateManifest(rawVariant, productEntry);\n          });\n          cache.set(cacheKey, list);\n          return list;\n        },\n      };\n    }\n    \n    exports.createVariantManifestRepo = createVariantManifestRepo;\n  },\n  \"compatibility/legacy-answer-normalizers.js\": function (exports, module, __bundle) {\n    var { toNullableBoolean, toNullableDraftNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { normalizeLegacyQuestionId } = __bundle.require(\"compatibility/legacy-question-aliases.js\");\n    /**\n     * @param {Record<string, unknown>} answers\n     * @returns {Record<string, unknown>}\n     */\n    function normalizeLegacyAnswers(answers) {\n      var nextAnswers = {};\n      var standard;\n      var size;\n      Object.keys(answers || {}).forEach(function mapAnswer(key) {\n        nextAnswers[normalizeLegacyQuestionId(key)] = normalizeLegacyAnswerValue(key, answers[key]);\n      });\n    \n      if (!nextAnswers.thread_designation) {\n        standard = toNullableString(nextAnswers.thread_standard);\n        size = toNullableString(nextAnswers.thread_size || nextAnswers.thread_nominal_size);\n        if (standard && size) {\n          nextAnswers.thread_designation = size.toUpperCase().indexOf(standard.toUpperCase()) === 0\n            ? size\n            : standard + size;\n        }\n      }\n    \n      return nextAnswers;\n    }\n    \n    /**\n     * @param {string} key\n     * @param {unknown} value\n     * @returns {unknown}\n     */\n    function normalizeLegacyAnswerValue(key, value) {\n      var canonicalKey = normalizeLegacyQuestionId(key);\n      if (canonicalKey === \"display\") return null;\n      if (/(_mm|_deg|_bar|_kw|_rpm|_dia|_length|_depth|_clearance|_width|_height)$/.test(canonicalKey)) {\n        return toNullableDraftNumber(value);\n      }\n      if (/^(sealing_relevant|fit_class_important|through_coolant|sync_tapping_capability|interpolation_capability|shoulder_90_required|hfm_intent)$/.test(canonicalKey)) {\n        var normalizedBoolean = toNullableBoolean(value);\n        if (normalizedBoolean === true) return \"yes\";\n        if (normalizedBoolean === false) return \"no\";\n        return toNullableString(value);\n      }\n      if (Array.isArray(value)) {\n        return value.map(toNullableString).filter(Boolean);\n      }\n      return toNullableString(value) || value;\n    }\n    \n    exports.normalizeLegacyAnswers = normalizeLegacyAnswers;\n    exports.normalizeLegacyAnswerValue = normalizeLegacyAnswerValue;\n  },\n  \"compatibility/legacy-process-aliases.js\": function (exports, module, __bundle) {\n    var { PROCESS_IDS } = __bundle.require(\"catalog/contracts.js\");\n    const LEGACY_PROCESS_ALIASES = Object.freeze({\n      drilling_thread_blind: \"tapping_blind\",\n      drilling_thread_through: \"tapping_through\",\n    });\n    \n    /**\n     * @param {unknown} processId\n     * @returns {import(\"../catalog/contracts.js\").ProcessId|null}\n     */\n    function normalizeLegacyProcessId(processId) {\n      var token = processId == null ? \"\" : String(processId).trim();\n      if (!token) return null;\n      if (PROCESS_IDS.indexOf(token) >= 0) return /** @type {import(\"../catalog/contracts.js\").ProcessId} */ (token);\n      if (Object.prototype.hasOwnProperty.call(LEGACY_PROCESS_ALIASES, token)) {\n        return /** @type {import(\"../catalog/contracts.js\").ProcessId} */ (LEGACY_PROCESS_ALIASES[token]);\n      }\n      return null;\n    }\n    \n    /**\n     * @param {unknown} processId\n     * @returns {boolean}\n     */\n    function isLegacyProcessAlias(processId) {\n      return !!processId && Object.prototype.hasOwnProperty.call(LEGACY_PROCESS_ALIASES, String(processId));\n    }\n    \n    exports.normalizeLegacyProcessId = normalizeLegacyProcessId;\n    exports.isLegacyProcessAlias = isLegacyProcessAlias;\n    exports.LEGACY_PROCESS_ALIASES = LEGACY_PROCESS_ALIASES;\n  },\n  \"compatibility/legacy-question-aliases.js\": function (exports, module, __bundle) {\n    const LEGACY_QUESTION_ALIASES = Object.freeze({\n      diameter_mm: \"feature_diameter_mm\",\n      ream_diameter: \"feature_diameter_mm\",\n      exact_tool_dia: \"feature_diameter_mm\",\n      preferred_cutter_dia: \"feature_diameter_mm\",\n      target_or_tool_diameter: \"feature_diameter_mm\",\n      depth_mm: \"feature_depth_mm\",\n      slot_depth: \"feature_depth_mm\",\n      entry_depth: \"feature_depth_mm\",\n      thread_length: \"thread_length_mm\",\n      thread_depth: \"thread_depth_mm\",\n      slot_width: \"feature_width_mm\",\n      groove_width: \"feature_width_mm\",\n      operation_type: \"groove_operation_type\",\n      surface_vs_fidelity_priority: \"surface_vs_fidelity_goal\",\n      purpose: \"countersink_purpose\",\n      cam_capability_basic: \"cam_capability\",\n      lubrication: \"lubrication_quality\",\n    });\n    \n    /**\n     * @param {string} questionId\n     * @returns {string}\n     */\n    function normalizeLegacyQuestionId(questionId) {\n      return LEGACY_QUESTION_ALIASES[questionId] || questionId;\n    }\n    \n    exports.normalizeLegacyQuestionId = normalizeLegacyQuestionId;\n    exports.LEGACY_QUESTION_ALIASES = LEGACY_QUESTION_ALIASES;\n  },\n  \"core/contracts.js\": function (exports, module, __bundle) {\n    var { PROCESS_IDS, RESULT_BLOCK_TYPES, RESULT_OUTCOMES, deepClone, ensure } = __bundle.require(\"catalog/contracts.js\");\n    const QUESTION_TYPES = Object.freeze([\"number\", \"text\", \"select\", \"chips\", \"boolean\", \"display\"]);\n    const QUESTION_GROUPS = Object.freeze([\"core\", \"advanced\", \"machine\", \"safety\"]);\n    const HIDDEN_VALUE_POLICIES = Object.freeze([\"keep\", \"clear\"]);\n    const RESULT_ACTION_TYPES = Object.freeze([\n      \"open_product\",\n      \"add_to_cart\",\n      \"open_alternatives\",\n      \"open_bundle\",\n      \"back_to_step3\",\n      \"contact_support\",\n    ]);\n    \n    /**\n     * @param {Partial<QuestionDef>} input\n     * @returns {QuestionDef}\n     */\n    function createQuestionDef(input) {\n      var source = input || {};\n      ensure(QUESTION_TYPES.indexOf(source.type) >= 0, \"QuestionDef.type must be canonical\");\n      ensure(QUESTION_GROUPS.indexOf(source.group) >= 0, \"QuestionDef.group must be canonical\");\n      var hiddenValuePolicy = source.hiddenValuePolicy || \"keep\";\n      ensure(HIDDEN_VALUE_POLICIES.indexOf(hiddenValuePolicy) >= 0, \"QuestionDef.hiddenValuePolicy must be keep|clear\");\n      return {\n        kind: \"question_def\",\n        schemaVersion: \"question.v1.1\",\n        id: String(source.id),\n        type: source.type,\n        label: source.label || String(source.id),\n        helpText: source.helpText || null,\n        placeholder: source.placeholder || null,\n        unit: source.unit || null,\n        group: source.group,\n        required: Boolean(source.required),\n        expertOnly: Boolean(source.expertOnly),\n        options: Array.isArray(source.options) ? deepClone(source.options) : [],\n        defaultValue: source.defaultValue == null ? null : deepClone(source.defaultValue),\n        visibleWhen: typeof source.visibleWhen === \"function\" ? source.visibleWhen : null,\n        hiddenValuePolicy: hiddenValuePolicy,\n        normalize: typeof source.normalize === \"function\" ? source.normalize : null,\n        validate: typeof source.validate === \"function\" ? source.validate : null,\n        derive: typeof source.derive === \"function\" ? source.derive : null,\n        viewHint: {\n          width: source.viewHint && source.viewHint.width || \"full\",\n          emphasis: source.viewHint && source.viewHint.emphasis || \"normal\",\n        },\n        analytics: {\n          fragmentId: source.analytics && source.analytics.fragmentId || null,\n          source: source.analytics && source.analytics.source || \"process\",\n        },\n      };\n    }\n    \n    /**\n     * @param {QuestionDef} question\n     * @param {Partial<QuestionState>=} input\n     * @returns {QuestionState}\n     */\n    function createQuestionState(question, input) {\n      var source = input || {};\n      var hasValue = Object.prototype.hasOwnProperty.call(source, \"value\");\n      var hasNormalizedValue = Object.prototype.hasOwnProperty.call(source, \"normalizedValue\");\n      return {\n        id: question.id,\n        visible: source.visible !== false,\n        answered: Boolean(source.answered),\n        required: source.required == null ? question.required : Boolean(source.required),\n        disabled: Boolean(source.disabled),\n        value: hasValue ? deepClone(source.value) : deepClone(question.defaultValue),\n        normalizedValue: hasNormalizedValue\n          ? deepClone(source.normalizedValue)\n          : deepClone(hasValue ? source.value : question.defaultValue),\n        issues: Array.isArray(source.issues) ? deepClone(source.issues) : [],\n        derived: source.derived ? deepClone(source.derived) : {},\n      };\n    }\n    \n    /**\n     * @param {QuestionDef} question\n     * @param {QuestionState} state\n     * @returns {QuestionViewModel}\n     */\n    function toQuestionViewModel(question, state) {\n      return {\n        id: question.id,\n        type: question.type,\n        label: question.label,\n        helpText: question.helpText,\n        placeholder: question.placeholder,\n        unit: question.unit,\n        group: question.group,\n        required: state.required,\n        expertOnly: question.expertOnly,\n        visible: state.visible,\n        disabled: state.disabled,\n        value: deepClone(state.normalizedValue),\n        options: deepClone(question.options),\n        issues: deepClone(state.issues),\n        viewHint: deepClone(question.viewHint),\n      };\n    }\n    \n    /**\n     * @param {Partial<ResultBlock>} input\n     * @returns {ResultBlock}\n     */\n    function createResultBlock(input) {\n      var source = input || {};\n      ensure(RESULT_BLOCK_TYPES.indexOf(source.blockType) >= 0, \"ResultBlock.blockType must be canonical\");\n      return {\n        id: String(source.id || source.blockType),\n        blockType: source.blockType,\n        title: source.title || null,\n        visible: source.visible !== false,\n        priority: Number.isFinite(source.priority) ? source.priority : 0,\n        data: deepClone(source.data || {}),\n      };\n    }\n    \n    /**\n     * @param {Partial<ResultViewModel>} input\n     * @returns {ResultViewModel}\n     */\n    function createResultViewModel(input) {\n      var source = input || {};\n      ensure(PROCESS_IDS.indexOf(source.processId) >= 0, \"ResultViewModel.processId must be canonical\");\n      ensure(RESULT_OUTCOMES.indexOf(source.outcome) >= 0, \"ResultViewModel.outcome must be canonical\");\n      return {\n        kind: \"result_view_model\",\n        schemaVersion: \"result.v1.1\",\n        processId: source.processId,\n        outcome: source.outcome,\n        summary: source.summary || \"\",\n        heroVariantId: source.heroVariantId || null,\n        blocks: Array.isArray(source.blocks) ? source.blocks.map(createResultBlock) : [],\n        actions: Array.isArray(source.actions)\n          ? source.actions.map(function mapAction(action) {\n              ensure(RESULT_ACTION_TYPES.indexOf(action.type) >= 0, \"Result action type must be canonical\");\n              return { type: action.type, label: action.label || action.type, targetId: action.targetId || null };\n            })\n          : [],\n      };\n    }\n    \n    /**\n     * @param {ResultViewModel} viewModel\n     * @returns {ResultViewModel}\n     */\n    function assertResultViewModel(viewModel) {\n      ensure(viewModel.kind === \"result_view_model\", \"Expected ResultViewModel\");\n      if (viewModel.outcome === \"no_match\" || viewModel.outcome === \"insufficient_data\") {\n        ensure(viewModel.blocks.some(function hasGap(block) { return block.blockType === \"no_match_guidance\"; }), \"ResultViewModel must include no_match_guidance for no_match|insufficient_data\");\n      }\n      if (viewModel.outcome === \"match\" || viewModel.outcome === \"limited_match\") {\n        ensure(viewModel.blocks.some(function hasHero(block) { return block.blockType === \"hero_recommendation\"; }), \"ResultViewModel must include hero_recommendation for match|limited_match\");\n      }\n      return viewModel;\n    }\n    \n    /**\n     * @param {Partial<QuestionFragment>} input\n     * @returns {QuestionFragment}\n     */\n    function createQuestionFragment(input) {\n      return {\n        id: String(input.id),\n        questions: Array.isArray(input.questions) ? input.questions.map(createQuestionDef) : [],\n      };\n    }\n    \n    /**\n     * @param {unknown} moduleValue\n     * @returns {moduleValue is ProcessModule}\n     */\n    function isProcessModule(moduleValue) {\n      return !!moduleValue &&\n        typeof moduleValue === \"object\" &&\n        PROCESS_IDS.indexOf(moduleValue.id) >= 0 &&\n        typeof moduleValue.getQuestions === \"function\" &&\n        typeof moduleValue.derive === \"function\" &&\n        typeof moduleValue.validate === \"function\" &&\n        typeof moduleValue.prefilter === \"function\" &&\n        typeof moduleValue.score === \"function\" &&\n        typeof moduleValue.buildResultView === \"function\";\n    }\n    \n    /**\n     * @param {unknown} toolkit\n     * @returns {toolkit is FamilyToolkit}\n     */\n    function isFamilyToolkit(toolkit) {\n      return !!toolkit &&\n        typeof toolkit === \"object\" &&\n        typeof toolkit.normalizeRow === \"function\" &&\n        typeof toolkit.resolveRows === \"function\" &&\n        typeof toolkit.deriveFamilyValues === \"function\" &&\n        typeof toolkit.familyHardFilters === \"function\" &&\n        typeof toolkit.familyScoreParts === \"function\" &&\n        typeof toolkit.resolveRecipe === \"function\" &&\n        typeof toolkit.getSharedMetrics === \"function\";\n    }\n    \n    /**\n     * @typedef {\"number\"|\"text\"|\"select\"|\"chips\"|\"boolean\"|\"display\"} QuestionType\n     * @typedef {\"core\"|\"advanced\"|\"machine\"|\"safety\"} QuestionGroup\n     * @typedef {\"keep\"|\"clear\"} HiddenValuePolicy\n     * @typedef {{ value: string, label: string, description?: string|null }} QuestionOption\n     * @typedef {{ field: string, message: string, severity: \"error\"|\"warning\", code?: string|null }} ValidationIssue\n     * @typedef {string|number|boolean|string[]|null} QuestionAnswer\n     * @typedef {{\n     *   kind: \"question_def\",\n     *   schemaVersion: \"question.v1.1\",\n     *   id: string,\n     *   type: QuestionType,\n     *   label: string,\n     *   helpText: string|null,\n     *   placeholder: string|null,\n     *   unit: string|null,\n     *   group: QuestionGroup,\n     *   required: boolean,\n     *   expertOnly: boolean,\n     *   options: QuestionOption[],\n     *   defaultValue: QuestionAnswer,\n     *   visibleWhen: ((ctx: Record<string, unknown>) => boolean)|null,\n     *   hiddenValuePolicy: HiddenValuePolicy,\n     *   normalize: ((value: QuestionAnswer, ctx: Record<string, unknown>) => QuestionAnswer)|null,\n     *   validate: ((value: QuestionAnswer, ctx: Record<string, unknown>) => ValidationIssue[])|null,\n     *   derive: ((value: QuestionAnswer, ctx: Record<string, unknown>) => Record<string, unknown>)|null,\n     *   viewHint: { width: \"full\"|\"half\", emphasis: \"normal\"|\"high\" },\n     *   analytics: { fragmentId: string|null, source: \"process\"|\"fragment\"|string }\n     * }} QuestionDef\n     * @typedef {{\n     *   id: string,\n     *   visible: boolean,\n     *   answered: boolean,\n     *   required: boolean,\n     *   disabled: boolean,\n     *   value: QuestionAnswer,\n     *   normalizedValue: QuestionAnswer,\n     *   issues: ValidationIssue[],\n     *   derived: Record<string, unknown>\n     * }} QuestionState\n     * @typedef {{\n     *   id: string,\n     *   type: QuestionType,\n     *   label: string,\n     *   helpText: string|null,\n     *   placeholder: string|null,\n     *   unit: string|null,\n     *   group: QuestionGroup,\n     *   required: boolean,\n     *   expertOnly: boolean,\n     *   visible: boolean,\n     *   disabled: boolean,\n     *   value: QuestionAnswer,\n     *   options: QuestionOption[],\n     *   issues: ValidationIssue[],\n     *   viewHint: { width: \"full\"|\"half\", emphasis: \"normal\"|\"high\" }\n     * }} QuestionViewModel\n     * @typedef {{ id: string, questions: QuestionDef[] }} QuestionFragment\n     * @typedef {{ id: string, blockType: string, title: string|null, visible: boolean, priority: number, data: Record<string, unknown> }} ResultBlock\n     * @typedef {{ type: string, label: string, targetId?: string|null }} ResultAction\n     * @typedef {{\n     *   kind: \"result_view_model\",\n     *   schemaVersion: \"result.v1.1\",\n     *   processId: import(\"../catalog/contracts.js\").ProcessId,\n     *   outcome: import(\"../catalog/contracts.js\").RESULT_OUTCOMES[number],\n     *   summary: string,\n     *   heroVariantId: string|null,\n     *   blocks: ResultBlock[],\n     *   actions: ResultAction[]\n     * }} ResultViewModel\n     * @typedef {{\n     *   id: import(\"../catalog/contracts.js\").ProcessId,\n     *   family: import(\"../catalog/contracts.js\").FamilyId,\n     *   toolkits: import(\"../catalog/contracts.js\").FamilyId[],\n     *   getQuestions: (ctx: Record<string, unknown>) => QuestionDef[],\n     *   derive: (ctx: Record<string, unknown>, toolkits: Record<string, FamilyToolkit>) => Record<string, unknown>,\n     *   validate: (ctx: Record<string, unknown>, toolkits: Record<string, FamilyToolkit>) => ValidationIssue[],\n     *   prefilter: (pool: import(\"../catalog/contracts.js\").Candidate[], ctx: Record<string, unknown>, toolkits: Record<string, FamilyToolkit>) => import(\"../catalog/contracts.js\").Candidate[],\n     *   score: (pool: import(\"../catalog/contracts.js\").Candidate[], ctx: Record<string, unknown>, kernel: Record<string, Function>, toolkits: Record<string, FamilyToolkit>) => import(\"../catalog/contracts.js\").ScoredCandidate[],\n     *   buildResultView: (scored: import(\"../catalog/contracts.js\").ScoredCandidate[], ctx: Record<string, unknown>, toolkits: Record<string, FamilyToolkit>) => ResultViewModel\n     * }} ProcessModule\n     * @typedef {{\n     *   id: import(\"../catalog/contracts.js\").FamilyId,\n     *   normalizeRow: (raw: unknown, trace?: Record<string, unknown>) => import(\"../catalog/contracts.js\").NormalizedRow|null,\n     *   resolveRows: (candidate: import(\"../catalog/contracts.js\").Candidate, ctx: Record<string, unknown>) => import(\"../catalog/contracts.js\").NormalizedRow[],\n     *   deriveFamilyValues: (ctx: Record<string, unknown>) => Record<string, unknown>,\n     *   familyHardFilters: (candidate: import(\"../catalog/contracts.js\").Candidate, ctx: Record<string, unknown>) => ValidationIssue[],\n     *   familyScoreParts: (candidate: import(\"../catalog/contracts.js\").Candidate, ctx: Record<string, unknown>) => Record<string, number>,\n     *   resolveRecipe: (candidate: import(\"../catalog/contracts.js\").Candidate, ctx: Record<string, unknown>) => { source: \"exact\"|\"near\"|\"estimated\"|\"none\", recipe: import(\"../catalog/contracts.js\").Recipe|null },\n     *   getSharedMetrics: (candidate: import(\"../catalog/contracts.js\").Candidate, ctx: Record<string, unknown>) => Record<string, unknown>\n     * }} FamilyToolkit\n     */\n    \n    exports.createQuestionDef = createQuestionDef;\n    exports.createQuestionState = createQuestionState;\n    exports.toQuestionViewModel = toQuestionViewModel;\n    exports.createResultBlock = createResultBlock;\n    exports.createResultViewModel = createResultViewModel;\n    exports.assertResultViewModel = assertResultViewModel;\n    exports.createQuestionFragment = createQuestionFragment;\n    exports.isProcessModule = isProcessModule;\n    exports.isFamilyToolkit = isFamilyToolkit;\n    exports.QUESTION_TYPES = QUESTION_TYPES;\n    exports.QUESTION_GROUPS = QUESTION_GROUPS;\n    exports.HIDDEN_VALUE_POLICIES = HIDDEN_VALUE_POLICIES;\n    exports.RESULT_ACTION_TYPES = RESULT_ACTION_TYPES;\n  },\n  \"core/finder-context.js\": function (exports, module, __bundle) {\n    var { PROCESS_FAMILY_BY_ID } = __bundle.require(\"catalog/contracts.js\");\n    var { getMaterialProfile } = __bundle.require(\"materials/iso-subgroup-profiles.js\");\n    /**\n     * @param {object} input\n     * @param {string} input.processId\n     * @param {string=} input.materialCode\n     * @param {Record<string, unknown>=} input.answers\n     * @param {Record<string, unknown>=} input.derived\n     * @param {boolean=} input.expertMode\n     * @param {Record<string, unknown>=} input.ui\n     * @returns {Record<string, unknown>}\n     */\n    function createFinderContext(input) {\n      var processId = input.processId;\n      var materialCode = input.materialCode ? String(input.materialCode).trim().toUpperCase() : null;\n      var materialProfile = getMaterialProfile(materialCode);\n      return {\n        materialCode: materialCode,\n        material: {\n          subgroupCode: materialCode,\n          isoGroup: materialCode ? String(materialCode).charAt(0).toUpperCase() : null,\n          subgroupLabel: materialProfile ? materialProfile.label : materialCode,\n          profile: materialProfile,\n        },\n        process: {\n          id: processId,\n          family: PROCESS_FAMILY_BY_ID[processId] || null,\n        },\n        answers: Object.assign({}, input.answers || {}),\n        derived: Object.assign({}, input.derived || {}),\n        expertMode: Boolean(input.expertMode),\n        ui: Object.assign({}, input.ui || {}),\n      };\n    }\n    \n    exports.createFinderContext = createFinderContext;\n  },\n  \"core/question-engine.js\": function (exports, module, __bundle) {\n    var { deepClone } = __bundle.require(\"catalog/contracts.js\");\n    var { createQuestionState, toQuestionViewModel } = __bundle.require(\"core/contracts.js\");\n    /**\n     * @param {import(\"./contracts.js\").QuestionDef[]} questions\n     * @param {Record<string, unknown>} ctx\n     * @param {Record<string, unknown>} answers\n     * @returns {{ states: import(\"./contracts.js\").QuestionState[], derived: Record<string, unknown>, answers: Record<string, unknown>, viewModels: import(\"./contracts.js\").QuestionViewModel[] }}\n     */\n    function buildQuestionState(questions, ctx, answers) {\n      var derived = {};\n      var normalizedAnswers = {};\n      var states = questions.map(function build(question) {\n        var visible = question.visibleWhen ? Boolean(question.visibleWhen(ctx)) : true;\n        var value = Object.prototype.hasOwnProperty.call(answers, question.id) ? answers[question.id] : question.defaultValue;\n        var normalizedValue = question.normalize ? question.normalize(value, ctx) : value;\n        var nextValue = visible ? normalizedValue : (question.hiddenValuePolicy === \"clear\" ? null : normalizedValue);\n        var issues = [];\n        var localDerived = {};\n        if (question.type !== \"display\" && visible && question.validate) {\n          issues = question.validate(nextValue, ctx) || [];\n        }\n        if (question.type !== \"display\" && visible && question.derive) {\n          localDerived = question.derive(nextValue, ctx) || {};\n          Object.assign(derived, localDerived);\n        }\n        if (question.type !== \"display\") {\n          normalizedAnswers[question.id] = deepClone(nextValue);\n        }\n        return createQuestionState(question, {\n          visible: visible,\n          answered: nextValue != null && (!(Array.isArray(nextValue)) || nextValue.length > 0) && nextValue !== \"\",\n          required: question.required,\n          disabled: false,\n          value: value,\n          normalizedValue: nextValue,\n          issues: issues,\n          derived: localDerived,\n        });\n      });\n    \n      return {\n        states: states,\n        derived: derived,\n        answers: normalizedAnswers,\n        viewModels: states.map(function toVm(state, index) {\n          return toQuestionViewModel(questions[index], state);\n        }),\n      };\n    }\n    \n    /**\n     * @param {Record<string, unknown>} answers\n     * @param {string} questionId\n     * @param {unknown} value\n     * @returns {Record<string, unknown>}\n     */\n    function upsertAnswer(answers, questionId, value) {\n      var nextAnswers = Object.assign({}, answers || {});\n      nextAnswers[questionId] = deepClone(value);\n      return nextAnswers;\n    }\n    \n    /**\n     * @param {import(\"./contracts.js\").QuestionFragment[]} fragments\n     * @param {string[]} fragmentIds\n     * @returns {import(\"./contracts.js\").QuestionDef[]}\n     */\n    function expandQuestionFragments(fragments, fragmentIds) {\n      var map = {};\n      fragments.forEach(function each(fragment) {\n        map[fragment.id] = fragment.questions;\n      });\n      return fragmentIds.reduce(function collect(list, fragmentId) {\n        return list.concat(map[fragmentId] || []);\n      }, []);\n    }\n    \n    exports.buildQuestionState = buildQuestionState;\n    exports.upsertAnswer = upsertAnswer;\n    exports.expandQuestionFragments = expandQuestionFragments;\n  },\n  \"core/result-blocks.js\": function (exports, module, __bundle) {\n    var { createResultBlock } = __bundle.require(\"core/contracts.js\");\n    function heroRecommendation(data) {\n      return createResultBlock({ id: \"hero\", blockType: \"hero_recommendation\", title: \"Recommended tool\", priority: 10, data: data });\n    }\n    \n    function fitKpis(items) {\n      return createResultBlock({ id: \"fit-kpis\", blockType: \"fit_kpis\", title: \"Fit KPIs\", priority: 20, data: { items: items } });\n    }\n    \n    function recipeStartValues(data) {\n      return createResultBlock({ id: \"recipe\", blockType: \"recipe_start_values\", title: \"Start values\", priority: 30, data: data });\n    }\n    \n    function riskNotes(items) {\n      return createResultBlock({ id: \"risk\", blockType: \"risk_notes\", title: \"Risk notes\", priority: 40, data: { items: items } });\n    }\n    \n    function machineFeasibility(checks) {\n      return createResultBlock({ id: \"machine\", blockType: \"machine_feasibility\", title: \"Machine feasibility\", priority: 35, data: { checks: checks } });\n    }\n    \n    function toleranceNotes(notes) {\n      return createResultBlock({ id: \"tolerance\", blockType: \"tolerance_notes\", title: \"Tolerance notes\", priority: 32, data: { target: null, notes: notes } });\n    }\n    \n    function setupNotes(notes) {\n      return createResultBlock({ id: \"setup\", blockType: \"setup_notes\", title: \"Setup notes\", priority: 45, data: { notes: notes } });\n    }\n    \n    function geometryFit(items) {\n      return createResultBlock({ id: \"geometry\", blockType: \"geometry_fit\", title: \"Geometry fit\", priority: 22, data: { items: items } });\n    }\n    \n    function threadIdentity(data) {\n      return createResultBlock({ id: \"thread\", blockType: \"thread_identity\", title: \"Thread identity\", priority: 15, data: data });\n    }\n    \n    function holeSummary(data) {\n      return createResultBlock({ id: \"hole\", blockType: \"hole_summary\", title: \"Hole summary\", priority: 15, data: data });\n    }\n    \n    function featureSummary(items) {\n      return createResultBlock({ id: \"feature\", blockType: \"feature_summary\", title: \"Feature summary\", priority: 15, data: { items: items } });\n    }\n    \n    function alternatives(items) {\n      return createResultBlock({ id: \"alternatives\", blockType: \"alternatives\", title: \"Alternatives\", priority: 60, data: { items: items } });\n    }\n    \n    function bundleRecommendation(data) {\n      return createResultBlock({ id: \"bundle\", blockType: \"bundle_recommendation\", title: \"Recommended setup\", priority: 18, data: data });\n    }\n    \n    function commerceCta(data) {\n      return createResultBlock({ id: \"commerce\", blockType: \"commerce_cta\", title: \"Buy\", priority: 80, data: data });\n    }\n    \n    function explanation(paragraphs) {\n      return createResultBlock({ id: \"explanation\", blockType: \"explanation\", title: \"Explanation\", priority: 50, data: { paragraphs: paragraphs } });\n    }\n    \n    function warning(severity, message) {\n      return createResultBlock({ id: \"warning\", blockType: \"warning\", title: \"Warning\", priority: 12, data: { severity: severity, message: message } });\n    }\n    \n    function noMatchGuidance(data) {\n      return createResultBlock({ id: \"no-match\", blockType: \"no_match_guidance\", title: \"Next step\", priority: 11, data: data });\n    }\n    \n    exports.heroRecommendation = heroRecommendation;\n    exports.fitKpis = fitKpis;\n    exports.recipeStartValues = recipeStartValues;\n    exports.riskNotes = riskNotes;\n    exports.machineFeasibility = machineFeasibility;\n    exports.toleranceNotes = toleranceNotes;\n    exports.setupNotes = setupNotes;\n    exports.geometryFit = geometryFit;\n    exports.threadIdentity = threadIdentity;\n    exports.holeSummary = holeSummary;\n    exports.featureSummary = featureSummary;\n    exports.alternatives = alternatives;\n    exports.bundleRecommendation = bundleRecommendation;\n    exports.commerceCta = commerceCta;\n    exports.explanation = explanation;\n    exports.warning = warning;\n    exports.noMatchGuidance = noMatchGuidance;\n  },\n  \"core/result-engine.js\": function (exports, module, __bundle) {\n    var { createResultViewModel, assertResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { noMatchGuidance } = __bundle.require(\"core/result-blocks.js\");\n    function buildGuidanceResult(processId, outcome, summary, message, actions) {\n      return assertResultViewModel(createResultViewModel({\n        processId: processId,\n        outcome: outcome,\n        summary: summary,\n        heroVariantId: null,\n        blocks: [\n          noMatchGuidance({\n            reason: outcome,\n            message: message,\n          }),\n        ],\n        actions: actions || [{ type: \"back_to_step3\", label: \"Refine inputs\" }],\n      }));\n    }\n    \n    /**\n     * @param {string} processId\n     * @param {import(\"../catalog/contracts.js\").ScoredCandidate[]} scored\n     * @param {Record<string, unknown>} ctx\n     * @param {(scored: import(\"../catalog/contracts.js\").ScoredCandidate[], ctx: Record<string, unknown>) => import(\"./contracts.js\").ResultViewModel} presenter\n     * @returns {import(\"./contracts.js\").ResultViewModel}\n     */\n    function buildResult(processId, scored, ctx, presenter) {\n      var eligible = (scored || []).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      });\n    \n      if (!eligible || eligible.length === 0) {\n        return buildGuidanceResult(\n          processId,\n          \"no_match\",\n          \"No suitable tool was found for the current inputs.\",\n          \"Refine the inputs or relax the constraints.\",\n          [{ type: \"back_to_step3\", label: \"Refine inputs\" }]\n        );\n      }\n    \n      return assertResultViewModel(presenter(eligible, ctx));\n    }\n    \n    exports.buildGuidanceResult = buildGuidanceResult;\n    exports.buildResult = buildResult;\n  },\n  \"core/scoring-kernel.js\": function (exports, module, __bundle) {\n    var { toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    function codeMatchScore(candidateCodes, targetCode) {\n      if (!targetCode) return 0;\n      if (!candidateCodes || candidateCodes.length === 0) return 0;\n      return candidateCodes.indexOf(targetCode) >= 0 ? 1 : 0;\n    }\n    \n    function proximityScore(candidateValue, targetValue, toleranceRatio) {\n      if (candidateValue == null || targetValue == null || targetValue === 0) return 0;\n      var delta = Math.abs(candidateValue - targetValue);\n      var tolerance = Math.abs(targetValue) * (toleranceRatio == null ? 0.25 : toleranceRatio);\n      if (delta === 0) return 1;\n      if (delta > tolerance) return 0;\n      return Math.max(0, 1 - delta / tolerance);\n    }\n    \n    const scoringKernel = Object.freeze({\n      materialFit: function materialFit(candidate, ctx) {\n        return codeMatchScore(candidate.classification.materialSubgroupCodes, ctx.material && ctx.material.subgroupCode);\n      },\n      processFit: function processFit(candidate, ctx) {\n        var processId = ctx.process && ctx.process.id;\n        return candidate.classification.processIds.indexOf(processId) >= 0 ? 1 : 0;\n      },\n      diameterFit: function diameterFit(candidate, targetDiameter) {\n        return proximityScore(candidate.common.diameterMm, targetDiameter, 0.2);\n      },\n      reachFit: function reachFit(candidate, targetDepth) {\n        var usable = toNullableNumber(candidate.common.usableLengthMm) || toNullableNumber(candidate.common.apmxMm);\n        if (usable == null || targetDepth == null) return 0;\n        if (usable >= targetDepth) return 1;\n        if (usable <= 0) return 0;\n        return Math.max(0, usable / targetDepth);\n      },\n      machineWindow: function machineWindow(candidate, ctx) {\n        var rpm = toNullableNumber(ctx.answers && ctx.answers.machine_max_rpm);\n        var power = toNullableNumber(ctx.answers && ctx.answers.spindle_power_kw);\n        if (rpm == null && power == null) return 0.5;\n        var score = 0.5;\n        if (rpm != null) score += rpm > 10000 ? 0.25 : 0.1;\n        if (power != null) score += power > 5 ? 0.25 : 0.1;\n        return Math.min(score, 1);\n      },\n      risk: function risk(candidate, ctx) {\n        var coolant = candidate.common.coolantTsc;\n        var setup = String(ctx.answers && ctx.answers.setup_stability || \"\").toLowerCase();\n        var risk = 0;\n        if (coolant === false) risk += 0.2;\n        if (setup.indexOf(\"weak\") >= 0 || setup.indexOf(\"low\") >= 0) risk += 0.3;\n        return Math.min(risk, 1);\n      },\n    });\n    \n    exports.scoringKernel = scoringKernel;\n  },\n  \"core/troubleshooting-library.js\": function (exports, module, __bundle) {\n    function splitActions(value) {\n      return String(value || \"\")\n        .split(/\\s*,\\s*/)\n        .map(function mapAction(item) {\n          return String(item || \"\").trim();\n        })\n        .filter(Boolean);\n    }\n    \n    function createEntry(raw) {\n      return Object.freeze({\n        handle: raw.handle,\n        problem: raw.problem || null,\n        problemCategory: raw.problem_category || null,\n        dominantToolWear: raw.dominant_tool_wear || null,\n        cause: raw.cause || null,\n        actionsText: raw.actions || null,\n        actions: splitActions(raw.actions),\n        rootWorkholding: Boolean(raw.root_workholding),\n        rootMachinePower: Boolean(raw.root_machine_power),\n        rootPreprocessing: Boolean(raw.root_preprocessing),\n        alternativeProcess: raw.alternative_process || null,\n      });\n    }\n    \n    function parseJsonLines(text) {\n      return String(text || \"\")\n        .trim()\n        .split(/\\r?\\n+/)\n        .filter(Boolean)\n        .map(function parseLine(line) {\n          return JSON.parse(line);\n        });\n    }\n    \n    var RAW_TROUBLESHOOTING_JSONL = `\n    {\"handle\":\"reamer-chips-jam-in-bore\",\"problem\":\"Reamer chips jam in bore\",\"problem_category\":\"Chip Handling\",\"cause\":\"Chip load too high; insufficient lubrication; unsuitable flute space and guide geometry.\",\"actions\":\"Reduce feed, reduce allowance, increase coolant flow, choose polished flute or less flutes.\"}\n    {\"handle\":\"chips-pack-in-deep-grooves\",\"problem\":\"Chips pack in deep grooves\",\"problem_category\":\"Chip Handling\",\"cause\":\"Feed too low for reliable chip breaking; groove too narrow; unsuitable chipbreaker.\",\"actions\":\"Reduce feed, reduce axial depth, increase coolant, use tough grade, use stronger chipbreaker.\"}\n    {\"handle\":\"chips-pack-in-deep-holes\",\"problem\":\"Chips pack in deep holes\",\"problem_category\":\"Chip Handling\",\"cause\":\"Cut lengths too long; insufficient coolant; chip space too small.\",\"actions\":\"Reduce feed, limit drilling depth per peck, increase coolant, use tough grade, use deep-hole drill.\"}\n    {\"handle\":\"indentation-at-cutting-edge-poor-finish\",\"problem\":\"Indentation at cutting edge; poor finish\",\"problem_category\":\"Chip Handling\",\"dominant_tool_wear\":\"Fatigue (Cracks, Chipping)\",\"cause\":\"Working temperature too high with high pressure.\",\"actions\":\"Reduce feed, reduce axial depth, check toolholder, use tough grade, use drill with more helix.\"}\n    {\"handle\":\"long-chips-wrap-around-tool-workpiece\",\"problem\":\"Long chips wrap around tool/workpiece\",\"problem_category\":\"Chip Handling\",\"cause\":\"Feed rate/depth of cut too small; corner radius too large; incorrect entering angle.\",\"actions\":\"Increase feed, reduce axial depth, increase coolant, use tough grade, use stronger chipbreaker.\"}\n    {\"handle\":\"high-radial-cutting-forces\",\"problem\":\"High radial cutting forces\",\"problem_category\":\"Process Stability\",\"dominant_tool_wear\":\"Fatigue (Cracks, Chipping)\",\"cause\":\"Incorrect angle; corner radius too large; excessive flank wear.\",\"actions\":\"Reduce feed/speed, reduce axial/radial depth, shorten overhang, use tough grade, use positive rake.\"}\n    {\"handle\":\"high-tangential-cutting-forces\",\"problem\":\"High tangential cutting forces\",\"problem_category\":\"Process Stability\",\"dominant_tool_wear\":\"Fatigue (Cracks, Chipping)\",\"cause\":\"Aggressive chip breaking; small depth of cut; tool instability; unstable clamping.\",\"actions\":\"Reduce feed/speed, reduce axial depth, shorten overhang, use tough grade, use positive rake.\"}\n    {\"handle\":\"vibration-and-poor-surface-despite-correct-data\",\"problem\":\"Vibration and poor surface despite correct data\",\"cause\":\"Damaged/contaminated toolholder interface; corrosion; incorrect tightening torque.\",\"actions\":\"Reduce speed/feed, reduce axial/radial depth, shorten overhang, use tough grade, use fewer teeth.\"}\n    {\"handle\":\"vibration-and-poor-finish-in-narrow-slots-pockets\",\"problem\":\"Vibration and poor finish in narrow slots/pockets\",\"root_workholding\":true,\"cause\":\"Engagement too large at high overhang; insufficient stiffness; unfavourable toolpath.\",\"actions\":\"Reduce speed/feed, reduce radial engagement, shorten overhang, use tough grade, use fewer teeth.\"}\n    {\"handle\":\"part-breaks-off-uncontrollably-clamps-tool\",\"problem\":\"Part breaks off uncontrollably / clamps tool\",\"root_workholding\":true,\"cause\":\"No relief groove; incorrect sequence; insufficient clamping force.\",\"actions\":\"Reduce feed/speed, use multiple passes, clamp closer, use tough grade, use parting tool.\"}\n    {\"handle\":\"spindle-at-power-limit-or-stalls\",\"problem\":\"Spindle at power limit or stalls\",\"problem_category\":\"Process Stability\",\"root_machine_power\":true,\"cause\":\"Chip cross-section too large; unsuitable strategy; machine too weak.\",\"actions\":\"Reduce speed/feed, reduce axial/radial depth, shorten overhang, use tough grade, use positive rake.\"}\n    {\"handle\":\"tap-breaks-in-hole\",\"problem\":\"Tap breaks in hole\",\"problem_category\":\"Process Stability\",\"cause\":\"Core hole too small; insufficient lubrication; high cutting forces; chip packing.\",\"actions\":\"Reduce speed, increase coolant, use tough grade, use matched tap design.\"}\n    {\"handle\":\"tool-creeps-axially-depth-out-of-tolerance\",\"problem\":\"Tool creeps axially; depth out of tolerance\",\"problem_category\":\"Process Stability\",\"root_workholding\":true,\"cause\":\"Axial forces too high; insufficient clamping force; wrong clamping range; smooth shanks.\",\"actions\":\"Reduce feed, reduce axial depth, check toolholder, use tough grade, use positive rake.\"}\n    {\"handle\":\"coolant-foams-or-lubricates-poorly\",\"problem\":\"Coolant foams or lubricates poorly\",\"problem_category\":\"Thermal & Power\",\"dominant_tool_wear\":\"Oxidation\",\"cause\":\"Incorrect concentration; unsuitable type; air ingress; contaminated emulsion.\",\"actions\":\"Reduce speed, reduce axial depth, check concentration, use thermal shock resistant grade.\"}\n    {\"handle\":\"high-power-consumption-during-cutting\",\"problem\":\"High power consumption during cutting\",\"problem_category\":\"Thermal & Power\",\"dominant_tool_wear\":\"Diffusion\",\"cause\":\"Speed too high; insufficient wear resistance; diffusion wear from high temperature.\",\"actions\":\"Reduce speed/feed, reduce axial/radial depth, shorten overhang, use thermal shock resistant grade.\"}\n    {\"handle\":\"built-up-edge-on-cutting-edge\",\"problem\":\"Built-up edge on cutting edge\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Adhesive\",\"cause\":\"Unsuitable speed; low oil content; low temperature; negative honing too large.\",\"actions\":\"Increase speed, reduce axial depth, increase coolant, use sharp low-friction grade, use positive rake.\"}\n    {\"handle\":\"chipping-when-drilling-into-a-pre-hole\",\"problem\":\"Chipping when drilling into a pre-hole\",\"root_workholding\":true,\"cause\":\"Unstable conditions; TIR too high; feed too high; insufficient coolant.\",\"actions\":\"Reduce feed, reduce axial depth, shorten overhang, select tougher grade, use self-centering drill.\"}\n    {\"handle\":\"cutter-teeth-show-thermal-cracks-and-chipping\",\"problem\":\"Cutter teeth show thermal cracks and chipping\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Fatigue (Cracks, Chipping)\",\"cause\":\"Wet/dry alternating conditions; unsuitable coolant; high speed in intermittent cuts.\",\"actions\":\"Reduce speed, reduce axial depth, shorten overhang, use thermal shock resistant grade, use fewer teeth.\"}\n    {\"handle\":\"cutting-edge-breaks-in-interrupted-cuts\",\"problem\":\"Cutting edge breaks in interrupted cuts\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Fatigue (Cracks, Chipping)\",\"cause\":\"Speed too high; geometry not robust; wrong grade.\",\"actions\":\"Reduce speed/feed, reduce axial depth, shorten overhang, select tougher grade, use fewer teeth.\"}\n    {\"handle\":\"drill-breakage\",\"problem\":\"Drill breakage\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Fatigue (Cracks, Chipping)\",\"root_workholding\":true,\"cause\":\"TIR too high; unstable; insufficient power; chip packing; high feed.\",\"actions\":\"Reduce feed, reduce axial depth, check toolholder, select tougher grade, use deep-hole drill.\"}\n    {\"handle\":\"excessive-wear-at-chisel-edge\",\"problem\":\"Excessive wear at chisel edge\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Abrasive\",\"root_workholding\":true,\"cause\":\"TIR too high; speed too low; feed too high.\",\"actions\":\"Reduce feed/speed, reduce axial depth, check toolholder, select wear-resistant grade, use self-centering drill.\"}\n    {\"handle\":\"individual-teeth-wear-faster-than-others\",\"problem\":\"Individual teeth wear faster than others\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Abrasive\",\"root_workholding\":true,\"cause\":\"Run-out errors; excessive depth of cut; poor clamping; uneven engagement.\",\"actions\":\"Reduce feed/speed, reduce axial depth, check run-out, select wear-resistant grade, use fewer teeth.\"}\n    {\"handle\":\"insert-breakage\",\"problem\":\"Insert breakage\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Fatigue (Cracks, Chipping)\",\"root_workholding\":true,\"cause\":\"Cutting forces too high; insufficient stability.\",\"actions\":\"Reduce feed/speed, reduce axial/radial depth, shorten overhang, select tougher grade, use positive rake.\"}\n    {\"handle\":\"strong-bue-in-stainless-poor-surface-accuracy\",\"problem\":\"Strong BUE in stainless; poor surface/accuracy\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Adhesive\",\"cause\":\"Tough, work-hardening material; low speed; unsuitable geometry; incorrect cooling.\",\"actions\":\"Increase speed, reduce axial depth, increase coolant, select low-friction grade, use positive rake.\"}\n    {\"handle\":\"severe-notch-wear-in-titanium-turning\",\"problem\":\"Severe notch wear in titanium turning\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Notch\",\"cause\":\"Low thermal conductivity material; small depth of cut; unfavourable engagement.\",\"actions\":\"Reduce speed, increase feed slightly, reduce axial depth, increase coolant, use notch-resistant grade.\"}\n    {\"handle\":\"thread-flanks-with-built-up-edge-or-smearing\",\"problem\":\"Thread flanks with built-up edge or smearing\",\"problem_category\":\"Tool Life\",\"dominant_tool_wear\":\"Adhesive\",\"cause\":\"Tough, adhesive material; low speed; unsuitable lubrication; wrong cutting material.\",\"actions\":\"Increase speed, reduce axial depth, increase coolant, select low-friction grade, use matched tap design.\"}\n    {\"handle\":\"3-d-contours-show-steps-and-scallops\",\"problem\":\"3D contours show steps and scallops\",\"problem_category\":\"Workpiece Quality\",\"cause\":\"Step-over too large; large contact angle; unsuitable cutter radius; wrong strategy.\",\"actions\":\"Use separate finishing pass, use light finishing pass, shorten overhang, use tough grade, use larger nose radius.\"}\n    {\"handle\":\"bore-tapered-and-out-of-tolerance\",\"problem\":\"Bore tapered and out of tolerance\",\"root_workholding\":true,\"cause\":\"Bending of the boring bar; insufficient rigidity; incorrect position; high cutting forces.\",\"actions\":\"Use separate finishing pass, use light finishing pass, check toolholder, use tough grade, use reamer.\"}\n    {\"handle\":\"burrs-or-breakout-at-cross-hole-intersection\",\"problem\":\"Burrs or breakout at cross-hole intersection\",\"problem_category\":\"Workpiece Quality\",\"cause\":\"Unfavourable exit angle; no data adjustment; no deburring; chips remain.\",\"actions\":\"Reduce feed, reduce engagement, increase coolant, use tough grade, use back-chamfer tool.\"}\n    {\"handle\":\"burrs-at-entry-and-or-exit\",\"problem\":\"Burrs at entry and/or exit\",\"problem_category\":\"Workpiece Quality\",\"cause\":\"Edge not sharp; feed too low for radius; notch wear or chipping; burr at end of cut.\",\"actions\":\"Reduce feed, reduce engagement, increase coolant, use tough grade, use back-chamfer tool.\"}\n    {\"handle\":\"burrs-or-poor-edge-at-shoulders\",\"problem\":\"Burrs or poor edge at shoulders\",\"problem_category\":\"Workpiece Quality\",\"cause\":\"Unfavourable entry/exit; incorrect angle; feed too low in exit; unsuitable edge preparation.\",\"actions\":\"Reduce feed, reduce engagement, shorten overhang, use tough grade, use larger nose radius.\"}\n    {\"handle\":\"chatter-marks-and-poor-bore-finish\",\"problem\":\"Chatter marks and poor bore finish\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Feed too low; bar overhang too large; insufficient damping; incorrect insert distribution.\",\"actions\":\"Reduce speed/feed, reduce axial/radial depth, shorten overhang, use tough grade, use stiffest boring bar.\"}\n    {\"handle\":\"diameter-tapered-over-component-length\",\"problem\":\"Diameter tapered over component length\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Workpiece/tool deflection; insufficient support; high cutting forces; unsuitable infeed.\",\"actions\":\"Use separate finishing pass, use light finishing pass, check toolholder, use tough grade, use smaller nose radius.\"}\n    {\"handle\":\"drill-skids-on-inclined-curved-surface\",\"problem\":\"Drill skids on inclined/curved surface\",\"problem_category\":\"Workpiece Quality\",\"root_preprocessing\":true,\"cause\":\"No secure starting point; feed too high at entry; insufficient centering rigidity; unsuitable geometry.\",\"actions\":\"Reduce feed, reduce engagement, clamp closer, use tough grade, use self-centering drill.\"}\n    {\"handle\":\"drill-wanders-hole-off-position\",\"problem\":\"Drill wanders; hole off-position\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Insufficient centre drilling; unequal edge lengths; uneven entry; feed too high at entry.\",\"actions\":\"Reduce feed, reduce engagement, clamp closer, use tough grade, use self-centering drill.\"}\n    {\"handle\":\"hole-bell-mouthed-at-entry-exit\",\"problem\":\"Hole bell-mouthed at entry/exit\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"root_preprocessing\":true,\"cause\":\"Unstable guidance; overhang too large; insufficient clamping; incorrect pilot hole.\",\"actions\":\"Reduce feed, use light finishing pass, increase coolant, use tough grade, use deep-hole drill.\"}\n    {\"handle\":\"milled-planes-show-steps-or-waviness\",\"problem\":\"Milled planes show steps or waviness\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Insufficient run-out accuracy; uneven engagement; unsuitable step-over; vibrations.\",\"actions\":\"Use separate finishing pass, use light finishing pass, shorten overhang, use tough grade, use larger nose radius.\"}\n    {\"handle\":\"milled-thread-pitch-error-screw-jams-or-wobbles\",\"problem\":\"Milled thread pitch error; screw jams or wobbles\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Incorrect machine parameters; wrong tool compensation; run-out or positioning errors.\",\"actions\":\"Reduce speed, use multiple passes, ensure rigid tapping, use tough grade, use matched tap design.\"}\n    {\"handle\":\"pip-remains-on-workpiece-after-parting\",\"problem\":\"Pip remains on workpiece after parting\",\"problem_category\":\"Workpiece Quality\",\"cause\":\"Incorrect centre height/angle; uneven chip formation; incorrect final strategy.\",\"actions\":\"Reduce feed, reduce engagement, clamp closer, use tough grade, use optimized parting tool.\"}\n    {\"handle\":\"reamed-bore-bell-mouthed-or-barrel-shaped\",\"problem\":\"Reamed bore bell-mouthed or barrel-shaped\",\"root_preprocessing\":true,\"cause\":\"Unsuitable pilot hole; incorrect feed; worn or incorrectly dimensioned reamer.\",\"actions\":\"Use separate finishing pass, use light finishing pass, increase coolant, use tough grade, use reamer.\"}\n    {\"handle\":\"scrap-part-due-to-machining-fault\",\"problem\":\"Scrap part due to machining fault\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Insufficient stability; interrupted cut; insufficient coolant; speed/feed issues; worn insert.\",\"actions\":\"Adjust speed/feed, split operations, check toolholder, use tough grade, use finishing tool.\"}\n    {\"handle\":\"surface-finish-not-acceptable\",\"problem\":\"Surface finish not acceptable\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Unstable conditions; uneven surface; insufficient toughness; weak geometry; low coolant.\",\"actions\":\"Use separate finishing pass, use light finishing pass, shorten overhang, use tough grade, use larger nose radius.\"}\n    {\"handle\":\"fibrous-surface-dimension-not-achieved\",\"problem\":\"Fibrous surface; dimension not achieved\",\"dominant_tool_wear\":\"Notch\",\"cause\":\"Chips break against workpiece; excessive notch wear; high feed with small corner radius.\",\"actions\":\"Increase speed, use separate finishing pass, use light finishing pass, increase coolant, use tough grade.\"}\n    {\"handle\":\"thin-walls-deflect-scoring-and-dimension-errors\",\"problem\":\"Thin walls deflect; scoring and dimension errors\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Cutting forces too high; insufficient support; incorrect sequence.\",\"actions\":\"Reduce speed/feed, use smaller engagement, shorten overhang, use tough grade, use smaller nose radius.\"}\n    {\"handle\":\"thread-flanks-uneven-profile-incorrect\",\"problem\":\"Thread flanks uneven; profile incorrect\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Incorrect infeed strategy; infeed too small; unstable clamping; wrong setting angle.\",\"actions\":\"Reduce speed, ensure rigid tapping, use tough grade, use matched tap design.\"}\n    {\"handle\":\"thread-out-of-tolerance-core-hole-too-small-large\",\"problem\":\"Thread out of tolerance (core hole too small/large)\",\"problem_category\":\"Workpiece Quality\",\"root_workholding\":true,\"cause\":\"Incorrect core hole drilling; unsuitable tolerance; tool wear; unstable system.\",\"actions\":\"Reduce speed, ensure rigid tapping, use tough grade, use matched tap design.\"}\n    {\"handle\":\"lack-of-power\",\"problem\":\"Lack of power\",\"problem_category\":\"Workpiece Quality\",\"root_machine_power\":true,\"cause\":\"Power consumption varies with removal rate, thickness, geometry and speed.\",\"actions\":\"Reduce speed, reduce axial/radial depth, shorten overhang, use tough grade, use stronger chipbreaker.\"}\n    {\"handle\":\"white-layer-and-microcracks-after-hard-turning\",\"problem\":\"White layer and microcracks after hard turning\",\"problem_category\":\"Workpiece Quality\",\"dominant_tool_wear\":\"Oxidation\",\"root_machine_power\":true,\"root_workholding\":false,\"root_preprocessing\":false,\"cause\":\"Cutting speed and/or feed too high; depth of cut too large; insufficient cooling; thermal overload.\",\"actions\":\"Reduce cutting speed for hard turning to lower thermal load; reduce axial depth, split roughing and finishing; increase coolant flow, check concentration; use grade with improved thermal shock resistance.\",\"alternative_process\":\"Rough before heat treatment and finish after.\"}\n    `;\n    \n    var TROUBLESHOOTING_ENTRIES = Object.freeze(parseJsonLines(RAW_TROUBLESHOOTING_JSONL).map(createEntry));\n    \n    var TROUBLESHOOTING_ENTRY_BY_HANDLE = Object.freeze(TROUBLESHOOTING_ENTRIES.reduce(function reduceMap(map, entry) {\n      map[entry.handle] = entry;\n      return map;\n    }, {}));\n    \n    function getTroubleshootingEntry(handle) {\n      var normalizedHandle = String(handle == null ? \"\" : handle).trim();\n      return TROUBLESHOOTING_ENTRY_BY_HANDLE[normalizedHandle] || null;\n    }\n    \n    function getTroubleshootingEntries(handles) {\n      var seen = Object.create(null);\n      return (handles || []).reduce(function reduceEntries(list, handle) {\n        var entry = getTroubleshootingEntry(handle);\n        if (!entry || seen[entry.handle]) return list;\n        seen[entry.handle] = true;\n        list.push(entry);\n        return list;\n      }, []);\n    }\n    \n    exports.getTroubleshootingEntry = getTroubleshootingEntry;\n    exports.getTroubleshootingEntries = getTroubleshootingEntries;\n    exports.TROUBLESHOOTING_ENTRIES = TROUBLESHOOTING_ENTRIES;\n  },\n  \"core/validation-engine.js\": function (exports, module, __bundle) {\n    /**\n     * @param {import(\"./contracts.js\").QuestionState[]} questionStates\n     * @param {Record<string, unknown>} ctx\n     * @param {{ validate: Function }} processModule\n     * @param {Record<string, import(\"./contracts.js\").FamilyToolkit>} toolkits\n     * @returns {import(\"./contracts.js\").ValidationIssue[]}\n     */\n    function collectValidationIssues(questionStates, ctx, processModule, toolkits) {\n      var fieldIssues = questionStates.reduce(function reduceIssues(list, state) {\n        var issues = (state.issues || []).slice();\n        if (state.visible && state.required && !state.disabled && !state.answered) {\n          issues.push({\n            field: state.id,\n            message: \"This field is required.\",\n            severity: \"error\",\n            code: \"required\",\n          });\n        }\n        return list.concat(issues);\n      }, []);\n      var processIssues = processModule.validate(ctx, toolkits) || [];\n      return fieldIssues.concat(processIssues);\n    }\n    \n    /**\n     * @param {import(\"./contracts.js\").ValidationIssue[]} issues\n     * @returns {boolean}\n     */\n    function hasBlockingIssues(issues) {\n      return issues.some(function isBlocking(issue) {\n        return issue.severity === \"error\";\n      });\n    }\n    \n    exports.collectValidationIssues = collectValidationIssues;\n    exports.hasBlockingIssues = hasBlockingIssues;\n  },\n  \"family-toolkits/drilling-tools.js\": function (exports, module, __bundle) {\n    var { createNormalizedRow, normalizeBlindThrough, normalizeCoolantMode, normalizeMaterialCodeList, normalizeRowKind, toNullableNumber, toNullableString, unwrapReferenceValue } = __bundle.require(\"catalog/contracts.js\");\n    var { normalizeLegacyProcessId } = __bundle.require(\"compatibility/legacy-process-aliases.js\");\n    var { resolveRecipeRows, selectRowsByContext } = __bundle.require(\"family-toolkits/row-resolution.js\");\n    function selectRows(candidate, ctx) {\n      return selectRowsByContext(candidate.rows.drilling, ctx);\n    }\n    \n    const drillingTools = {\n      id: \"drilling\",\n      normalizeRow: function normalizeRow(raw, trace) {\n        var operationCode = raw && raw.operation_code;\n        var operationValues = Array.isArray(unwrapReferenceValue(operationCode))\n          ? unwrapReferenceValue(operationCode)\n          : [unwrapReferenceValue(operationCode)];\n        var processIds = Array.isArray(operationCode)\n          ? operationValues.map(function mapItem(item) { return normalizeLegacyProcessId(item); }).filter(Boolean)\n          : [normalizeLegacyProcessId(operationValues[0])].filter(Boolean);\n        return createNormalizedRow({\n          rowId: [trace && trace.variantId || \"variant\", \"drilling\", trace && trace.sourceProfileIndex || 0, trace && trace.sourceRowIndex || 0].join(\"|\"),\n          family: \"drilling\",\n          rowKind: normalizeRowKind(processIds[0] || \"drill\"),\n          label: toNullableString(unwrapReferenceValue(raw && raw.label_en)),\n          constraints: {\n            processIds: processIds,\n            materialCodes: normalizeMaterialCodeList(raw && raw.material_code),\n            secondaryMaterialCodes: normalizeMaterialCodeList(raw && raw.material_code1),\n            coolantMode: normalizeCoolantMode(raw && raw.coolant_method),\n            blindThrough: normalizeBlindThrough(raw && raw.blind_through),\n            conditionStage: null,\n            workpieceCondition: null,\n            engagementStyle: null,\n            radialEngagementClass: null,\n          },\n          recipe: {\n            vc: { min: toNullableNumber(raw && raw.vc_min), typ: toNullableNumber(raw && raw.vc_typ), max: toNullableNumber(raw && raw.vc_max) },\n            fz: { min: null, typ: null, max: null },\n            fn: { min: toNullableNumber(raw && raw.fn_min), typ: toNullableNumber(raw && raw.fn_typ), max: toNullableNumber(raw && raw.fn_max) },\n            ap: { min: null, typ: null, max: null },\n            ae: { min: null, typ: null, max: null },\n            aePct: { min: null, typ: null, max: null },\n          },\n          familyData: {\n            holeDepthClass: toNullableString(unwrapReferenceValue(raw && raw.hole_depth_class)),\n            preHoleStatus: toNullableString(unwrapReferenceValue(raw && raw.pre_hole_status)),\n            holeTolerance: toNullableString(unwrapReferenceValue(raw && raw.hole_tolerance)),\n          },\n          trace: Object.assign({}, trace || {}, {\n            sourceProcessHandleRaw: toNullableString(Array.isArray(operationValues) ? operationValues[0] : operationValues),\n          }),\n        });\n      },\n      resolveRows: function resolveRows(candidate, ctx) {\n        return selectRows(candidate, ctx);\n      },\n      deriveFamilyValues: function deriveFamilyValues(ctx) {\n        var depth = toNullableNumber(ctx.answers && ctx.answers.feature_depth_mm);\n        var diameter = toNullableNumber(ctx.answers && ctx.answers.feature_diameter_mm);\n        var ratio = depth != null && diameter ? depth / diameter : null;\n        var holeDepthClass = null;\n        if (ratio != null) {\n          if (ratio <= 3) holeDepthClass = \"3xD\";\n          else if (ratio <= 5) holeDepthClass = \"5xD\";\n          else if (ratio <= 8) holeDepthClass = \"8xD\";\n          else if (ratio <= 10) holeDepthClass = \"10xD\";\n          else holeDepthClass = \"12xD\";\n        }\n        return {\n          hole_depth_ratio: ratio,\n          hole_depth_class: holeDepthClass,\n          coolant_mode: normalizeCoolantMode(ctx.answers && (ctx.answers.through_coolant || ctx.answers.coolant_capability)),\n        };\n      },\n      familyHardFilters: function familyHardFilters(candidate, ctx) {\n        var issues = [];\n        var depth = toNullableNumber(ctx.answers && ctx.answers.feature_depth_mm);\n        if (depth != null && candidate.common.usableLengthMm != null && candidate.common.usableLengthMm < depth) {\n          issues.push({ field: \"feature_depth_mm\", message: \"Usable length is shorter than target depth.\", severity: \"error\", code: \"reach_short\" });\n        }\n        return issues;\n      },\n      familyScoreParts: function familyScoreParts(candidate, ctx) {\n        var rows = selectRows(candidate, ctx);\n        return {\n          row_match: rows.length > 0 ? 1 : 0,\n          tsc_match: ctx.answers && ctx.answers.through_coolant === \"yes\" && candidate.common.coolantTsc ? 1 : 0,\n        };\n      },\n      resolveRecipe: function resolveRecipe(candidate, ctx) {\n        var resolution = resolveRecipeRows(candidate.rows.drilling, ctx);\n        if (resolution.rows.length === 0) return { source: \"none\", recipe: null };\n        return { source: resolution.source, recipe: resolution.rows[0].recipe };\n      },\n      getSharedMetrics: function getSharedMetrics(candidate, ctx) {\n        var depth = toNullableNumber(ctx.answers && ctx.answers.feature_depth_mm);\n        var diameter = toNullableNumber(ctx.answers && ctx.answers.feature_diameter_mm);\n        return {\n          targetDepthMm: depth,\n          targetDiameterMm: diameter,\n          depthRatio: depth != null && diameter ? depth / diameter : null,\n          candidateUsableLengthMm: candidate.common.usableLengthMm,\n          coolantTsc: candidate.common.coolantTsc,\n        };\n      },\n    };\n    \n    exports.drillingTools = drillingTools;\n  },\n  \"family-toolkits/milling-tools.js\": function (exports, module, __bundle) {\n    var { createNormalizedRow, normalizeCoolantMode, normalizeMaterialCodeList, normalizeRowKind, toNullableNumber, toNullableString, unwrapReferenceValue } = __bundle.require(\"catalog/contracts.js\");\n    var { normalizeLegacyProcessId } = __bundle.require(\"compatibility/legacy-process-aliases.js\");\n    var { resolveRecipeRows, selectRowsByContext } = __bundle.require(\"family-toolkits/row-resolution.js\");\n    var PROCESS_BY_ROW_KIND = Object.freeze({\n      slot: \"slotting\",\n      shoulder: \"shoulder_milling\",\n      face: \"face_milling\",\n      pocket: \"pocket_milling\",\n      copy: \"copy_milling\",\n      hfm: \"high_feed_milling\",\n      trochoidal: \"trochoidal_milling\",\n      plunge: \"plunging\",\n      ramp: \"ramping_helical_interpolation\",\n    });\n    \n    var ROW_KIND_BY_PROCESS = Object.freeze({\n      slotting: \"slot\",\n      shoulder_milling: \"shoulder\",\n      face_milling: \"face\",\n      pocket_milling: \"pocket\",\n      copy_milling: \"copy\",\n      high_feed_milling: \"hfm\",\n      trochoidal_milling: \"trochoidal\",\n      plunging: \"plunge\",\n      ramping_helical_interpolation: \"ramp\",\n    });\n    \n    function firstOf(source, keys) {\n      var index;\n      for (index = 0; index < keys.length; index += 1) {\n        if (source && Object.prototype.hasOwnProperty.call(source, keys[index])) {\n          return source[keys[index]];\n        }\n      }\n      return undefined;\n    }\n    \n    function uniqueStrings(values) {\n      return Array.from(new Set((values || []).filter(Boolean)));\n    }\n    \n    function splitTokenString(text) {\n      var bullet = String.fromCharCode(8226);\n      return String(text)\n        .split(bullet).join(\",\")\n        .split(\"|\").join(\",\")\n        .split(\",\")\n        .map(function mapItem(item) { return item.trim(); })\n        .filter(Boolean);\n    }\n    \n    function toTokenArray(value) {\n      var resolved = unwrapReferenceValue(value);\n      var token;\n      var bullet = String.fromCharCode(8226);\n    \n      if (resolved == null) return [];\n      if (Array.isArray(resolved)) {\n        return resolved.reduce(function collect(result, item) {\n          return result.concat(toTokenArray(item));\n        }, []);\n      }\n      if (typeof resolved === \"object\") {\n        token = firstOf(resolved, [\"code\", \"handle\", \"label_en\", \"label\", \"title\", \"name\", \"value\"]);\n        return token == null || token === resolved ? [] : toTokenArray(token);\n      }\n    \n      token = toNullableString(resolved);\n      if (!token) return [];\n    \n      return token.indexOf(bullet) >= 0 || token.indexOf(\"|\") >= 0 || token.indexOf(\",\") >= 0\n        ? splitTokenString(token)\n        : [token];\n    }\n    \n    function normalizeStageToken(value) {\n      var token = toNullableString(unwrapReferenceValue(value));\n      if (!token) return null;\n      token = token.toLowerCase().replace(/\\s+/g, \"-\");\n      if (!token || token === \"all\" || token === \"*\") return \"all\";\n      if (token.indexOf(\"rough\") >= 0) return \"roughing\";\n      if (token.indexOf(\"semi\") >= 0) return \"semi-finishing\";\n      if (token.indexOf(\"finish\") >= 0) return \"finishing\";\n      return token;\n    }\n    \n    function expandStages(value, fallbackToken) {\n      var stages = uniqueStrings(toTokenArray(value).map(normalizeStageToken).filter(Boolean));\n      if (stages.length === 0) stages = [fallbackToken || \"all\"];\n      if (stages.indexOf(\"finishing\") >= 0 && stages.indexOf(\"semi-finishing\") >= 0) {\n        stages = stages.filter(function keepStage(stage) {\n          return stage !== \"semi-finishing\";\n        });\n      }\n      return stages;\n    }\n    \n    function normalizeStoredStage(value) {\n      var stage = normalizeStageToken(value);\n      return stage === \"all\" ? null : stage;\n    }\n    \n    function normalizeOperationToken(value) {\n      var token = toNullableString(unwrapReferenceValue(value));\n      var normalized;\n      var direct;\n    \n      if (!token) return null;\n    \n      normalized = token\n        .trim()\n        .toLowerCase()\n        .replace(/\\s+/g, \" \")\n        .replace(/\\s*\\/\\s*/g, \"_\")\n        .replace(/\\s*-\\s*/g, \"_\");\n    \n      if (normalized === \"*\" || normalized === \"all\") return \"*\";\n    \n      direct = normalizeLegacyProcessId(token)\n        || normalizeLegacyProcessId(normalized)\n        || normalizeLegacyProcessId(normalized.replace(/\\s+/g, \"_\"));\n      if (direct) return direct;\n    \n      if (normalized === \"face milling\" || normalized === \"face_milling\") return \"face_milling\";\n      if (normalized === \"shoulder milling\" || normalized === \"shoulder_milling\") return \"shoulder_milling\";\n      if (normalized === \"pocket milling\" || normalized === \"pocket_milling\" || normalized === \"pocket\") return \"pocket_milling\";\n      if (normalized === \"copy milling\" || normalized === \"copy_milling\" || normalized === \"copying\") return \"copy_milling\";\n      if (normalized === \"trochoidal milling\" || normalized === \"trochoidal_milling\") return \"trochoidal_milling\";\n      if (normalized === \"slotting\") return \"slotting\";\n      if (normalized.indexOf(\"high feed\") >= 0 || normalized.indexOf(\"high_feed\") >= 0 || normalized === \"hfm\") return \"high_feed_milling\";\n      if (normalized.indexOf(\"plung\") >= 0) return \"plunging\";\n      if ((normalized.indexOf(\"ramping\") >= 0 && normalized.indexOf(\"helical\") >= 0)\n        || (normalized.indexOf(\"helical\") >= 0 && normalized.indexOf(\"interpolation\") >= 0)\n        || normalized === \"ramping_helical_interpolation\") {\n        return \"ramping_helical_interpolation\";\n      }\n    \n      return null;\n    }\n    \n    function collectOperationIds(raw, allowWildcard) {\n      return uniqueStrings(\n        toTokenArray(firstOf(raw, [\"operation_code1\", \"operation_code\", \"operationCode\", \"operation\", \"operationId\"]))\n          .map(normalizeOperationToken)\n          .filter(function keepToken(token) {\n            return !!token && (allowWildcard || token !== \"*\");\n          })\n      );\n    }\n    \n    function collectMaterialCodes(raw) {\n      return uniqueStrings(\n        normalizeMaterialCodeList(firstOf(raw, [\"material_code\", \"materialCode\", \"material_handle\", \"materialHandle\", \"material\", \"isoKey\"]))\n          .concat(normalizeMaterialCodeList(firstOf(raw, [\"material_code1\", \"materialCode1\"])))\n      );\n    }\n    \n    function normalizeCoolantToken(value) {\n      var token = toNullableString(unwrapReferenceValue(value));\n      if (!token) return null;\n      token = token.toLowerCase();\n      if (token === \"*\" || token === \"all\") return null;\n      return normalizeCoolantMode(token);\n    }\n    \n    function expandCoolantModes(value) {\n      var coolants = uniqueStrings(toTokenArray(value).map(normalizeCoolantToken));\n      return coolants.length > 0 ? coolants : [null];\n    }\n    \n    function normalizeRecipeComponentKind(raw) {\n      var token = toNullableString(unwrapReferenceValue(firstOf(raw, [\"row_kind\", \"rowKind\", \"kind\", \"type\"])));\n      token = token ? token.toLowerCase() : null;\n      return token === \"vc\" || token === \"fz\" ? token : null;\n    }\n    \n    function createRowTrace(entry, options) {\n      return {\n        productId: options && options.productId,\n        variantId: options && options.variantId,\n        handle: options && options.handle,\n        sourceFamilyField: entry.sourceKey,\n        sourceRowIndex: entry.sourceRowIndex,\n        sourceProfileIndex: entry.sourceProfileIndex != null ? entry.sourceProfileIndex : null,\n      };\n    }\n    \n    function summarizeComponentTrace(trace) {\n      if (!trace) return null;\n      return {\n        productId: trace.productId || null,\n        variantId: trace.variantId || null,\n        handle: trace.handle || null,\n        sourceFamilyField: trace.sourceFamilyField || null,\n        sourceRowIndex: trace.sourceRowIndex != null ? trace.sourceRowIndex : null,\n        sourceProfileIndex: trace.sourceProfileIndex != null ? trace.sourceProfileIndex : null,\n        sourceProcessHandleRaw: trace.sourceProcessHandleRaw || null,\n      };\n    }\n    \n    function createLegacyRow(raw, trace) {\n      var rawRowKind = toNullableString(unwrapReferenceValue(firstOf(raw, [\"row_kind\", \"rowKind\", \"kind\", \"type\"])));\n      var processIds = collectOperationIds(raw, false);\n      var normalizedRowKind = normalizeRowKind(rawRowKind || processIds[0] || \"unknown\");\n    \n      if (processIds.length === 0 && PROCESS_BY_ROW_KIND[normalizedRowKind]) {\n        processIds = [PROCESS_BY_ROW_KIND[normalizedRowKind]];\n      }\n    \n      return createNormalizedRow({\n        rowId: [trace && trace.variantId || \"variant\", \"milling\", trace && trace.sourceProfileIndex || 0, trace && trace.sourceRowIndex || 0].join(\"|\"),\n        family: \"milling\",\n        rowKind: normalizedRowKind,\n        label: toNullableString(firstOf(raw, [\"label_en\", \"label\", \"title\"])),\n        constraints: {\n          processIds: processIds,\n          materialCodes: collectMaterialCodes(raw),\n          secondaryMaterialCodes: [],\n          coolantMode: normalizeCoolantToken(firstOf(raw, [\"coolant_method1\", \"coolant_method\", \"coolantMethod\", \"coolant\"])),\n          blindThrough: null,\n          conditionStage: normalizeStoredStage(firstOf(raw, [\"condition_stage1\", \"condition_stage\", \"conditionStage\", \"stage\"])),\n          workpieceCondition: toNullableString(unwrapReferenceValue(firstOf(raw, [\"workpiece_condition\", \"workpieceCondition\"]))),\n          engagementStyle: toNullableString(unwrapReferenceValue(firstOf(raw, [\"engagement_style\", \"engagementStyle\"]))),\n          radialEngagementClass: toNullableString(unwrapReferenceValue(firstOf(raw, [\"radial_engagement_class\", \"radialEngagementClass\"]))),\n        },\n        recipe: {\n          vc: { min: toNullableNumber(firstOf(raw, [\"vc_min\"])), typ: toNullableNumber(firstOf(raw, [\"vc_typ\"])), max: toNullableNumber(firstOf(raw, [\"vc_max\"])) },\n          fz: { min: toNullableNumber(firstOf(raw, [\"fz_min\"])), typ: toNullableNumber(firstOf(raw, [\"fz_typ\"])), max: toNullableNumber(firstOf(raw, [\"fz_max\"])) },\n          fn: { min: null, typ: null, max: null },\n          ap: { min: toNullableNumber(firstOf(raw, [\"ap_min\"])), typ: toNullableNumber(firstOf(raw, [\"ap_typ\"])), max: toNullableNumber(firstOf(raw, [\"ap_max\", \"ap_max_row\"])) },\n          ae: { min: null, typ: null, max: null },\n          aePct: {\n            min: toNullableNumber(firstOf(raw, [\"ae_pct_min\", \"ae_min\"])),\n            typ: toNullableNumber(firstOf(raw, [\"ae_pct_typ\", \"ae_typ\"])),\n            max: toNullableNumber(firstOf(raw, [\"ae_pct_max\", \"ae_max\"])),\n          },\n        },\n        familyData: {\n          recipeRowKind: rawRowKind,\n          rampAngleMaxDeg: toNullableNumber(firstOf(raw, [\"ramp_angle_max\", \"ramp_angle_max_row\"])),\n        },\n        trace: Object.assign({}, trace || {}, {\n          sourceProcessHandleRaw: toNullableString(unwrapReferenceValue(firstOf(raw, [\"operation_code1\", \"operation_code\", \"operationCode\", \"operation\", \"operationId\"]))),\n        }),\n      });\n    }\n    \n    function expandVcAtoms(entry) {\n      var raw = entry.row;\n      var materials = collectMaterialCodes(raw);\n      var operations = collectOperationIds(raw, true);\n      var stages = expandStages(firstOf(raw, [\"condition_stage1\", \"condition_stage\", \"conditionStage\", \"stage\"]), \"all\");\n      var coolantModes = expandCoolantModes(firstOf(raw, [\"coolant_method1\", \"coolant_method\", \"coolantMethod\", \"coolant\"]));\n    \n      if (materials.length === 0) return [];\n      if (operations.length === 0) operations = [\"*\"];\n    \n      return materials.reduce(function collectByMaterial(result, materialCode) {\n        return result.concat(operations.reduce(function collectByOperation(operationResult, operationId) {\n          return operationResult.concat(stages.reduce(function collectByStage(stageResult, stage) {\n            return stageResult.concat(coolantModes.map(function mapCoolant(coolantMode) {\n              return {\n                kind: \"vc\",\n                trace: entry.trace,\n                row: raw,\n                materialCode: materialCode,\n                operationId: operationId,\n                stage: stage,\n                coolantMode: coolantMode,\n                recipe: {\n                  vc: {\n                    min: toNullableNumber(firstOf(raw, [\"vc_min\"])),\n                    typ: toNullableNumber(firstOf(raw, [\"vc_typ\"])),\n                    max: toNullableNumber(firstOf(raw, [\"vc_max\"])),\n                  },\n                },\n              };\n            }));\n          }, []));\n        }, []));\n      }, []);\n    }\n    \n    function expandFzAtoms(entry) {\n      var raw = entry.row;\n      var operations = collectOperationIds(raw, false);\n      var stages = expandStages(firstOf(raw, [\"condition_stage1\", \"condition_stage\", \"conditionStage\", \"stage\"]), \"*\");\n    \n      if (operations.length === 0) operations = [\"*\"];\n    \n      return operations.reduce(function collectByOperation(result, operationId) {\n        return result.concat(stages.map(function mapStage(stage) {\n          return {\n            kind: \"fz\",\n            trace: entry.trace,\n            row: raw,\n            operationId: operationId,\n            stage: stage,\n            recipe: {\n              fz: {\n                min: toNullableNumber(firstOf(raw, [\"fz_min\"])),\n                typ: toNullableNumber(firstOf(raw, [\"fz_typ\"])),\n                max: toNullableNumber(firstOf(raw, [\"fz_max\"])),\n              },\n              ap: {\n                min: toNullableNumber(firstOf(raw, [\"ap_min\"])),\n                typ: toNullableNumber(firstOf(raw, [\"ap_typ\"])),\n                max: toNullableNumber(firstOf(raw, [\"ap_max\", \"ap_max_row\"])),\n              },\n              aePct: {\n                min: toNullableNumber(firstOf(raw, [\"ae_pct_min\", \"ae_min\"])),\n                typ: toNullableNumber(firstOf(raw, [\"ae_pct_typ\", \"ae_typ\"])),\n                max: toNullableNumber(firstOf(raw, [\"ae_pct_max\", \"ae_max\"])),\n              },\n            },\n            rampAngleMaxDeg: toNullableNumber(firstOf(raw, [\"ramp_angle_max\", \"ramp_angle_max_row\"])),\n          };\n        }));\n      }, []);\n    }\n    \n    function buildAssembledRowId(vcAtom, fzAtom, processId, conditionStage) {\n      return [\n        vcAtom && vcAtom.trace && vcAtom.trace.variantId || \"variant\",\n        \"milling\",\n        \"assembled\",\n        processId || \"any\",\n        vcAtom && vcAtom.materialCode || \"material\",\n        conditionStage || \"all\",\n        vcAtom && vcAtom.trace && vcAtom.trace.sourceRowIndex != null ? vcAtom.trace.sourceRowIndex : \"vc\",\n        fzAtom && fzAtom.trace && fzAtom.trace.sourceRowIndex != null ? fzAtom.trace.sourceRowIndex : \"fz\",\n      ].join(\"|\");\n    }\n    \n    function createAssembledRow(vcAtom, fzAtom, options) {\n      var processId = fzAtom && fzAtom.operationId !== \"*\" ? fzAtom.operationId : vcAtom.operationId;\n      var rowKind = normalizeRowKind(ROW_KIND_BY_PROCESS[processId] || processId || \"unknown\");\n      var apMaxFallback = toNullableNumber(firstOf(options && options.rawDetail, [\"dim_apmx_mm\", \"apmx_mm\"]));\n      var rampMaxFallback = toNullableNumber(firstOf(options && options.rawDetail, [\"ramp_angle_max\", \"millbody_e4\"]));\n      var conditionStage = vcAtom.stage === \"all\" ? null : vcAtom.stage;\n    \n      return createNormalizedRow({\n        rowId: buildAssembledRowId(vcAtom, fzAtom, processId, conditionStage),\n        family: \"milling\",\n        rowKind: rowKind,\n        label: toNullableString(firstOf(vcAtom.row, [\"label_en\", \"label\", \"title\"])) || toNullableString(firstOf(fzAtom && fzAtom.row, [\"label_en\", \"label\", \"title\"])),\n        constraints: {\n          processIds: processId && processId !== \"*\" ? [processId] : [],\n          materialCodes: vcAtom.materialCode ? [vcAtom.materialCode] : [],\n          secondaryMaterialCodes: [],\n          coolantMode: vcAtom.coolantMode,\n          blindThrough: null,\n          conditionStage: conditionStage,\n          workpieceCondition: toNullableString(unwrapReferenceValue(firstOf(vcAtom.row, [\"workpiece_condition\", \"workpieceCondition\"]))),\n          engagementStyle: toNullableString(unwrapReferenceValue(firstOf(vcAtom.row, [\"engagement_style\", \"engagementStyle\"]))),\n          radialEngagementClass: toNullableString(unwrapReferenceValue(firstOf(vcAtom.row, [\"radial_engagement_class\", \"radialEngagementClass\"]))),\n        },\n        recipe: {\n          vc: vcAtom.recipe.vc,\n          fz: fzAtom ? fzAtom.recipe.fz : { min: null, typ: null, max: null },\n          fn: { min: null, typ: null, max: null },\n          ap: fzAtom ? {\n            min: fzAtom.recipe.ap.min,\n            typ: fzAtom.recipe.ap.typ,\n            max: fzAtom.recipe.ap.max != null ? fzAtom.recipe.ap.max : apMaxFallback,\n          } : { min: null, typ: null, max: apMaxFallback },\n          ae: { min: null, typ: null, max: null },\n          aePct: fzAtom ? fzAtom.recipe.aePct : { min: null, typ: null, max: null },\n        },\n        familyData: {\n          recipeRowKind: \"vc_fz_assembled\",\n          rampAngleMaxDeg: fzAtom && fzAtom.rampAngleMaxDeg != null ? fzAtom.rampAngleMaxDeg : rampMaxFallback,\n          recipeAssembly: {\n            kind: \"vc_fz_assembled\",\n            processId: processId || null,\n            materialCode: vcAtom.materialCode || null,\n            conditionStage: conditionStage,\n            coolantMode: vcAtom.coolantMode || null,\n            vc: Object.assign({\n              kind: \"vc\",\n              operationId: vcAtom.operationId || null,\n              materialCode: vcAtom.materialCode || null,\n              conditionStage: vcAtom.stage && vcAtom.stage !== \"all\" ? vcAtom.stage : null,\n              coolantMode: vcAtom.coolantMode || null,\n            }, summarizeComponentTrace(vcAtom.trace)),\n            fz: fzAtom ? Object.assign({\n              kind: \"fz\",\n              operationId: fzAtom.operationId || null,\n              conditionStage: fzAtom.stage && fzAtom.stage !== \"*\" ? fzAtom.stage : null,\n              coolantMode: null,\n            }, summarizeComponentTrace(fzAtom.trace)) : null,\n          },\n        },\n        trace: Object.assign({}, vcAtom.trace || {}, {\n          sourceProcessHandleRaw: processId,\n        }),\n      });\n    }\n    \n    function compareNullableNumbers(a, b) {\n      if (a != null && b != null && a !== b) return a - b;\n      if (a != null && b == null) return -1;\n      if (a == null && b != null) return 1;\n      return 0;\n    }\n    \n    function readMetric(row, keys) {\n      var cursor = row;\n      var index;\n      for (index = 0; index < keys.length; index += 1) {\n        if (cursor == null) return null;\n        cursor = cursor[keys[index]];\n      }\n      return cursor == null ? null : cursor;\n    }\n    \n    function compareRowsConservatively(a, b) {\n      var score;\n      var keys = [\n        [\"recipe\", \"vc\", \"typ\"],\n        [\"recipe\", \"vc\", \"min\"],\n        [\"recipe\", \"fz\", \"typ\"],\n        [\"recipe\", \"fz\", \"min\"],\n        [\"recipe\", \"ap\", \"typ\"],\n        [\"recipe\", \"ap\", \"min\"],\n        [\"recipe\", \"ap\", \"max\"],\n        [\"recipe\", \"aePct\", \"max\"],\n        [\"familyData\", \"rampAngleMaxDeg\"],\n      ];\n      var index;\n    \n      score = (a.constraints && a.constraints.coolantMode ? 0 : 1) - (b.constraints && b.constraints.coolantMode ? 0 : 1);\n      if (score !== 0) return score;\n    \n      for (index = 0; index < keys.length; index += 1) {\n        score = compareNullableNumbers(readMetric(a, keys[index]), readMetric(b, keys[index]));\n        if (score !== 0) return score;\n      }\n    \n      return String(a.rowId || \"\").localeCompare(String(b.rowId || \"\"));\n    }\n    \n    function collapseConservativeRows(rows) {\n      var groups = new Map();\n    \n      (rows || []).forEach(function eachRow(row) {\n        var key = [\n          (row.constraints && row.constraints.materialCodes || []).join(\",\"),\n          (row.constraints && row.constraints.processIds || []).join(\",\"),\n          row.constraints && row.constraints.conditionStage || \"all\",\n        ].join(\"|\");\n        if (!groups.has(key)) groups.set(key, []);\n        groups.get(key).push(row);\n      });\n    \n      return Array.from(groups.values()).map(function pickRow(groupRows) {\n        return groupRows.slice().sort(compareRowsConservatively)[0];\n      });\n    }\n    \n    function selectRows(candidate, ctx) {\n      return selectRowsByContext(candidate.rows.milling, ctx);\n    }\n    \n    function buildRecipeSelectionDebug(row, source) {\n      var constraints = row && row.constraints ? row.constraints : {};\n      var familyData = row && row.familyData ? row.familyData : {};\n      var assembly = familyData.recipeAssembly || null;\n    \n      return {\n        selectedRecipeSource: source || \"none\",\n        selectedRecipeRow: row ? {\n          rowId: row.rowId || null,\n          rowKind: row.rowKind || null,\n          recipeRowKind: familyData.recipeRowKind || null,\n          processIds: uniqueStrings(constraints.processIds || []),\n          materialCodes: uniqueStrings([].concat(constraints.materialCodes || []).concat(constraints.secondaryMaterialCodes || [])),\n          conditionStage: constraints.conditionStage || null,\n          coolantMode: constraints.coolantMode || null,\n          trace: summarizeComponentTrace(row.trace),\n        } : null,\n        selectedVcRow: assembly && assembly.vc ? assembly.vc : null,\n        selectedFzRow: assembly && assembly.fz ? assembly.fz : null,\n      };\n    }\n    \n    const millingTools = {\n      id: \"milling\",\n      normalizeRow: function normalizeRow(raw, trace) {\n        return createLegacyRow(raw, trace || {});\n      },\n      normalizeRows: function normalizeRows(rawEntries, options) {\n        var legacyRows = [];\n        var componentEntries = [];\n        var vcAtoms = [];\n        var fzAtoms = [];\n        var assembledRows = [];\n    \n        (rawEntries || []).forEach(function eachEntry(entry) {\n          var trace = createRowTrace(entry, options || {});\n          var componentKind = normalizeRecipeComponentKind(entry && entry.row);\n          var normalizedEntry = Object.assign({}, entry || {}, { trace: trace });\n    \n          if (componentKind) {\n            normalizedEntry.componentKind = componentKind;\n            componentEntries.push(normalizedEntry);\n            return;\n          }\n    \n          legacyRows.push(createLegacyRow(entry.row, trace));\n        });\n    \n        if (componentEntries.length === 0) return legacyRows.filter(Boolean);\n    \n        componentEntries.forEach(function eachEntry(entry) {\n          if (entry.componentKind === \"vc\") {\n            vcAtoms = vcAtoms.concat(expandVcAtoms(entry));\n          } else if (entry.componentKind === \"fz\") {\n            fzAtoms = fzAtoms.concat(expandFzAtoms(entry));\n          }\n        });\n    \n        if (fzAtoms.length === 0) {\n          assembledRows = vcAtoms.map(function mapVcAtom(vcAtom) {\n            return createAssembledRow(vcAtom, null, options || {});\n          });\n        } else {\n          vcAtoms.forEach(function eachVcAtom(vcAtom) {\n            fzAtoms.forEach(function eachFzAtom(fzAtom) {\n              var isOperationMatch = vcAtom.operationId === \"*\" || vcAtom.operationId === fzAtom.operationId;\n              var isStageMatch = fzAtom.stage === \"*\" || fzAtom.stage === vcAtom.stage;\n              if (!isOperationMatch || !isStageMatch) return;\n              assembledRows.push(createAssembledRow(vcAtom, fzAtom, options || {}));\n            });\n          });\n        }\n    \n        return legacyRows.concat(collapseConservativeRows(assembledRows.filter(Boolean)));\n      },\n      resolveRows: function resolveRows(candidate, ctx) {\n        return selectRows(candidate, ctx);\n      },\n      deriveFamilyValues: function deriveFamilyValues(ctx) {\n        var depth = toNullableNumber(ctx.answers && ctx.answers.feature_depth_mm);\n        var diameter = toNullableNumber(ctx.answers && ctx.answers.feature_diameter_mm);\n        var width = toNullableNumber(ctx.answers && ctx.answers.feature_width_mm);\n        return {\n          ae_pct: width != null && diameter ? (width / diameter) * 100 : null,\n          reach_ratio: depth != null && diameter ? depth / diameter : null,\n        };\n      },\n      familyHardFilters: function familyHardFilters(candidate, ctx) {\n        var issues = [];\n        var depth = toNullableNumber(ctx.answers && ctx.answers.feature_depth_mm);\n        if (depth != null && candidate.common.usableLengthMm != null && candidate.common.usableLengthMm < depth) {\n          issues.push({ field: \"feature_depth_mm\", message: \"Usable length is shorter than feature depth.\", severity: \"error\", code: \"reach_short\" });\n        }\n        return issues;\n      },\n      familyScoreParts: function familyScoreParts(candidate, ctx) {\n        var rows = selectRows(candidate, ctx);\n        return {\n          row_match: rows.length > 0 ? 1 : 0,\n        };\n      },\n      resolveRecipe: function resolveRecipe(candidate, ctx) {\n        var resolution = resolveRecipeRows(candidate.rows.milling, ctx);\n        var row = resolution.rows[0] || null;\n        var source;\n        if (resolution.rows.length === 0) {\n          return {\n            source: \"none\",\n            recipe: null,\n            row: null,\n            debug: buildRecipeSelectionDebug(null, \"none\"),\n          };\n        }\n        source = resolution.source === \"estimated\" ? \"estimated\" : \"near\";\n        if (resolution.source === \"exact\") source = \"exact\";\n        return {\n          source: source,\n          recipe: row ? row.recipe : null,\n          row: row,\n          debug: buildRecipeSelectionDebug(row, source),\n        };\n      },\n      getSharedMetrics: function getSharedMetrics(candidate, ctx) {\n        return {\n          targetWidthMm: toNullableNumber(ctx.answers && ctx.answers.feature_width_mm),\n          targetDepthMm: toNullableNumber(ctx.answers && ctx.answers.feature_depth_mm),\n          cornerRadiusMm: candidate.milling.cornerRadiusMm || null,\n          helixAngleDeg: candidate.milling.helixAngleDeg || null,\n        };\n      },\n    };\n    \n    exports.millingTools = millingTools;\n  },\n  \"family-toolkits/row-resolution.js\": function (exports, module, __bundle) {\n    var { toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    function normalizeMaterialCode(value) {\n      var code = toNullableString(value);\n      return code ? code.toUpperCase() : null;\n    }\n    \n    function getMaterialFamily(code) {\n      var normalized = normalizeMaterialCode(code);\n      var match = normalized && normalized.match(/^([PMKNSH])/);\n      return match ? match[1] : null;\n    }\n    \n    function collectMaterialCodes(row) {\n      var constraints = row && row.constraints ? row.constraints : {};\n      var codes = []\n        .concat(constraints.materialCodes || [])\n        .concat(constraints.secondaryMaterialCodes || []);\n      return Array.from(new Set(codes.map(normalizeMaterialCode).filter(Boolean)));\n    }\n    \n    function isProcessMatch(row, processId) {\n      var processIds = row && row.constraints ? row.constraints.processIds || [] : [];\n      if (!processId) return true;\n      return processIds.length === 0 || processIds.indexOf(processId) >= 0;\n    }\n    \n    function classifyMaterialMatch(row, materialCode) {\n      var normalizedMaterial = normalizeMaterialCode(materialCode);\n      var rowCodes = collectMaterialCodes(row);\n      var requestedFamily;\n      var hasFamilyLevelMatch;\n      var hasSubgroupFamilyMatch;\n    \n      if (!normalizedMaterial) return \"exact\";\n      if (rowCodes.length === 0) return \"exact\";\n      if (rowCodes.indexOf(normalizedMaterial) >= 0) return \"exact\";\n    \n      requestedFamily = getMaterialFamily(normalizedMaterial);\n      if (!requestedFamily) return \"none\";\n    \n      hasFamilyLevelMatch = rowCodes.some(function hasFamily(code) {\n        return code === requestedFamily;\n      });\n      if (hasFamilyLevelMatch) return \"near\";\n    \n      hasSubgroupFamilyMatch = rowCodes.some(function hasSubgroupFamily(code) {\n        return getMaterialFamily(code) === requestedFamily;\n      });\n      return hasSubgroupFamilyMatch ? \"near\" : \"none\";\n    }\n    \n    function selectRowsByContext(rows, ctx) {\n      var processId = ctx.process && ctx.process.id;\n      var materialCode = ctx.material && ctx.material.subgroupCode;\n      return (rows || []).filter(function match(row) {\n        return isProcessMatch(row, processId) && classifyMaterialMatch(row, materialCode) !== \"none\";\n      });\n    }\n    \n    function resolveRecipeRows(rows, ctx) {\n      var processId = ctx.process && ctx.process.id;\n      var materialCode = ctx.material && ctx.material.subgroupCode;\n      var processRows = (rows || []).filter(function match(row) {\n        return isProcessMatch(row, processId);\n      });\n      var exactRows = processRows.filter(function match(row) {\n        return classifyMaterialMatch(row, materialCode) === \"exact\";\n      });\n      var nearRows = processRows.filter(function match(row) {\n        return classifyMaterialMatch(row, materialCode) === \"near\";\n      });\n    \n      if (exactRows.length > 0) {\n        return { rows: exactRows, source: \"exact\" };\n      }\n      if (nearRows.length > 0) {\n        return { rows: nearRows, source: \"near\" };\n      }\n      if (processRows.length > 0) {\n        return { rows: processRows, source: \"estimated\" };\n      }\n      return { rows: [], source: \"none\" };\n    }\n    \n    exports.selectRowsByContext = selectRowsByContext;\n    exports.resolveRecipeRows = resolveRecipeRows;\n  },\n  \"family-toolkits/threading-tools.js\": function (exports, module, __bundle) {\n    var { createNormalizedRow, normalizeCoolantMode, normalizeMaterialCodeList, normalizeRowKind, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { normalizeLegacyProcessId } = __bundle.require(\"compatibility/legacy-process-aliases.js\");\n    var { resolveRecipeRows, selectRowsByContext } = __bundle.require(\"family-toolkits/row-resolution.js\");\n    function parseThreadDesignation(designation) {\n      var value = toNullableString(designation);\n      var normalized;\n      var compact;\n      var metric;\n      var pipe;\n      var pitchPart;\n      if (!value) {\n        return { threadStandard: null, threadSize: null, pitch: null, pitchMm: null, pipeFlag: false };\n      }\n      normalized = value.replace(/\\s+/g, \" \").trim();\n      compact = normalized.replace(/\\s+/g, \"\");\n      metric = compact.match(/^([A-Za-z]+)([0-9]+(?:[.,][0-9]+)?)(?:[xX]([0-9]+(?:[.,][0-9]+)?))?$/i);\n      if (metric) {\n        pitchPart = metric[3] || null;\n        return {\n          threadStandard: metric[1].toUpperCase(),\n          threadSize: metric[1].toUpperCase() + metric[2] + (pitchPart ? \"x\" + pitchPart : \"\"),\n          pitch: pitchPart,\n          pitchMm: pitchPart ? toNullableNumber(pitchPart) : null,\n          pipeFlag: [\"G\", \"NPT\", \"R\"].indexOf(metric[1].toUpperCase()) >= 0,\n        };\n      }\n      pipe = compact.match(/^([A-Za-z]+)([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)$/i);\n      if (pipe) {\n        return {\n          threadStandard: pipe[1].toUpperCase(),\n          threadSize: pipe[1].toUpperCase() + pipe[2],\n          pitch: null,\n          pitchMm: null,\n          pipeFlag: true,\n        };\n      }\n      return {\n        threadStandard: (compact.match(/^[A-Za-z]+/) || [null])[0],\n        threadSize: compact,\n        pitch: null,\n        pitchMm: null,\n        pipeFlag: compact.toUpperCase().indexOf(\"NPT\") >= 0 || compact.toUpperCase().indexOf(\"G\") === 0,\n      };\n    }\n    \n    function selectRows(candidate, ctx) {\n      return selectRowsByContext(candidate.rows.threading, ctx);\n    }\n    \n    function getRequestedCoolantMode(ctx) {\n      return normalizeCoolantMode(\n        ctx && ctx.answers && (\n          ctx.answers.coolant_lubrication_mode ||\n          ctx.answers.coolant_capability\n        )\n      );\n    }\n    \n    function getRowCompletenessScore(row) {\n      var recipe = row && row.recipe ? row.recipe : {};\n      var vc = recipe.vc || {};\n      return [vc.min, vc.typ, vc.max].filter(function keep(value) {\n        return value != null;\n      }).length;\n    }\n    \n    function getCoolantPreferenceScore(row, requestedCoolantMode) {\n      var rowCoolantMode = row && row.constraints ? row.constraints.coolantMode : null;\n      if (!requestedCoolantMode) return rowCoolantMode ? 1 : 0;\n      if (rowCoolantMode === requestedCoolantMode) return 4;\n      if (!rowCoolantMode || rowCoolantMode === \"unknown\") return 3;\n      if (\n        (requestedCoolantMode === \"through\" && rowCoolantMode === \"external\") ||\n        (requestedCoolantMode === \"external\" && rowCoolantMode === \"through\")\n      ) return 2;\n      if (\n        (requestedCoolantMode === \"mist\" && rowCoolantMode === \"external\") ||\n        (requestedCoolantMode === \"external\" && rowCoolantMode === \"mist\")\n      ) return 1;\n      return 0;\n    }\n    \n    function selectBestRecipeRow(rows, ctx) {\n      var requestedCoolantMode = getRequestedCoolantMode(ctx);\n      return (rows || []).slice().sort(function sortRows(left, right) {\n        var coolantDelta = getCoolantPreferenceScore(right, requestedCoolantMode) - getCoolantPreferenceScore(left, requestedCoolantMode);\n        var completenessDelta;\n        if (coolantDelta !== 0) return coolantDelta;\n        completenessDelta = getRowCompletenessScore(right) - getRowCompletenessScore(left);\n        if (completenessDelta !== 0) return completenessDelta;\n        return String(left && left.rowId || \"\").localeCompare(String(right && right.rowId || \"\"));\n      })[0] || null;\n    }\n    \n    const threadingTools = {\n      id: \"threading\",\n      normalizeRow: function normalizeRow(raw, trace) {\n        var operationCode = raw && raw.operation_code;\n        var processIds = Array.isArray(operationCode)\n          ? operationCode.map(function mapItem(item) { return normalizeLegacyProcessId(item && (item.code || item.handle || item)); }).filter(Boolean)\n          : [normalizeLegacyProcessId(operationCode && (operationCode.code || operationCode.handle || operationCode))].filter(Boolean);\n        return createNormalizedRow({\n          rowId: [trace && trace.variantId || \"variant\", \"threading\", trace && trace.sourceProfileIndex || 0, trace && trace.sourceRowIndex || 0].join(\"|\"),\n          family: \"threading\",\n          rowKind: normalizeRowKind(processIds[0] || \"tap\"),\n          label: toNullableString(raw && raw.label_en),\n          constraints: {\n            processIds: processIds,\n            materialCodes: normalizeMaterialCodeList(raw && raw.material_code),\n            secondaryMaterialCodes: [],\n            coolantMode: normalizeCoolantMode(raw && raw.coolant_method),\n            blindThrough: null,\n            conditionStage: null,\n            workpieceCondition: null,\n            engagementStyle: null,\n            radialEngagementClass: null,\n          },\n          recipe: {\n            vc: { min: toNullableNumber(raw && raw.vc_min), typ: toNullableNumber(raw && raw.vc_typ), max: toNullableNumber(raw && raw.vc_max) },\n            fz: { min: null, typ: null, max: null },\n            fn: { min: null, typ: null, max: null },\n            ap: { min: null, typ: null, max: null },\n            ae: { min: null, typ: null, max: null },\n            aePct: { min: null, typ: null, max: null },\n          },\n          familyData: {\n            threadStandard: null,\n            threadSize: null,\n          },\n          trace: Object.assign({}, trace || {}, {\n            sourceProcessHandleRaw: toNullableString(Array.isArray(operationCode) ? operationCode[0] && (operationCode[0].code || operationCode[0].handle || operationCode[0]) : operationCode && (operationCode.code || operationCode.handle || operationCode)),\n          }),\n        });\n      },\n      resolveRows: function resolveRows(candidate, ctx) {\n        return selectRows(candidate, ctx);\n      },\n      deriveFamilyValues: function deriveFamilyValues(ctx) {\n        var parsed = parseThreadDesignation(ctx.answers && ctx.answers.thread_designation);\n        return {\n          thread_standard: parsed.threadStandard,\n          thread_size: parsed.threadSize,\n          pitch: parsed.pitch,\n          pitch_mm: parsed.pitchMm,\n          pipe_flag: parsed.pipeFlag,\n        };\n      },\n      familyHardFilters: function familyHardFilters(candidate, ctx) {\n        var issues = [];\n        var parsed = parseThreadDesignation(ctx.answers && ctx.answers.thread_designation);\n        if (parsed.threadSize && candidate.threading.threadSize && String(candidate.threading.threadSize) !== parsed.threadSize) {\n          issues.push({ field: \"thread_designation\", message: \"Candidate thread size does not match requested thread.\", severity: \"error\", code: \"thread_size_mismatch\" });\n        }\n        return issues;\n      },\n      familyScoreParts: function familyScoreParts(candidate, ctx) {\n        var parsed = parseThreadDesignation(ctx.answers && ctx.answers.thread_designation);\n        return {\n          thread_size_match: parsed.threadSize && candidate.threading.threadSize === parsed.threadSize ? 1 : 0,\n          coolant_match: normalizeCoolantMode(ctx.answers && ctx.answers.coolant_capability) && candidate.common.coolantTsc ? 1 : 0,\n        };\n      },\n      resolveRecipe: function resolveRecipe(candidate, ctx) {\n        var resolution = resolveRecipeRows(candidate.rows.threading, ctx);\n        var row;\n        if (resolution.rows.length === 0) return { source: \"none\", recipe: null, row: null };\n        row = selectBestRecipeRow(resolution.rows, ctx);\n        return { source: resolution.source, recipe: row ? row.recipe : null, row: row };\n      },\n      getSharedMetrics: function getSharedMetrics(candidate, ctx) {\n        var parsed = parseThreadDesignation(ctx.answers && ctx.answers.thread_designation);\n        return {\n          requestedThreadSize: parsed.threadSize,\n          candidateThreadSize: candidate.threading.threadSize || null,\n          tapTolerance: candidate.threading.tapTolerance || null,\n          tapHelixDeg: candidate.threading.tapHelixDeg || null,\n        };\n      },\n    };\n    \n    exports.parseThreadDesignation = parseThreadDesignation;\n    exports.threadingTools = threadingTools;\n  },\n  \"family-toolkits/turning-tools.js\": function (exports, module, __bundle) {\n    var { createNormalizedRow, normalizeCoolantMode, normalizeMaterialCodeList, normalizeRowKind, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { normalizeLegacyProcessId } = __bundle.require(\"compatibility/legacy-process-aliases.js\");\n    var { resolveRecipeRows, selectRowsByContext } = __bundle.require(\"family-toolkits/row-resolution.js\");\n    function selectRows(candidate, ctx) {\n      return selectRowsByContext(candidate.rows.turning, ctx);\n    }\n    \n    function getRequestedStage(ctx) {\n      return toNullableString(ctx && ctx.answers && (ctx.answers.operation_phase || ctx.answers.goal_stage));\n    }\n    \n    const turningTools = {\n      id: \"turning\",\n      normalizeRow: function normalizeRow(raw, trace) {\n        var operationCode = raw && raw.operation_code;\n        var processIds = Array.isArray(operationCode)\n          ? operationCode.map(function mapItem(item) { return normalizeLegacyProcessId(item && (item.code || item.handle || item)); }).filter(Boolean)\n          : [normalizeLegacyProcessId(operationCode && (operationCode.code || operationCode.handle || operationCode))].filter(Boolean);\n        return createNormalizedRow({\n          rowId: [trace && trace.variantId || \"variant\", \"turning\", trace && trace.sourceProfileIndex || 0, trace && trace.sourceRowIndex || 0].join(\"|\"),\n          family: \"turning\",\n          rowKind: normalizeRowKind(processIds[0] || \"profile\"),\n          label: toNullableString(raw && raw.label_en),\n          constraints: {\n            processIds: processIds,\n            materialCodes: normalizeMaterialCodeList(raw && raw.material_code),\n            secondaryMaterialCodes: [],\n            coolantMode: normalizeCoolantMode(raw && raw.coolant_method),\n            blindThrough: null,\n            conditionStage: toNullableString(raw && raw.condition_stage),\n            workpieceCondition: toNullableString(raw && raw.workpiece_condition),\n            engagementStyle: null,\n            radialEngagementClass: null,\n          },\n          recipe: {\n            vc: { min: toNullableNumber(raw && raw.vc_min), typ: toNullableNumber(raw && raw.vc_typ), max: toNullableNumber(raw && raw.vc_max) },\n            fz: { min: null, typ: null, max: null },\n            fn: { min: toNullableNumber(raw && raw.fn_min), typ: toNullableNumber(raw && raw.fn_typ), max: toNullableNumber(raw && raw.fn_max) },\n            ap: { min: toNullableNumber(raw && raw.ap_min), typ: toNullableNumber(raw && raw.ap_typ), max: toNullableNumber(raw && raw.ap_max) },\n            ae: { min: null, typ: null, max: null },\n            aePct: { min: null, typ: null, max: null },\n          },\n          familyData: {},\n          trace: Object.assign({}, trace || {}, {\n            sourceProcessHandleRaw: toNullableString(Array.isArray(operationCode) ? operationCode[0] && (operationCode[0].code || operationCode[0].handle || operationCode[0]) : operationCode && (operationCode.code || operationCode.handle || operationCode)),\n          }),\n        });\n      },\n      resolveRows: function resolveRows(candidate, ctx) {\n        return selectRows(candidate, ctx);\n      },\n      deriveFamilyValues: function deriveFamilyValues(ctx) {\n        return {\n          overhang_ratio: toNullableNumber(ctx.answers && ctx.answers.exact_overhang_mm),\n          stage_bias: getRequestedStage(ctx),\n        };\n      },\n      familyHardFilters: function familyHardFilters(candidate, ctx) {\n        var issues = [];\n        var boreDiameter = toNullableNumber(ctx.answers && ctx.answers.bore_diameter_mm);\n        if (boreDiameter != null && candidate.turning.turnSizeIcMm != null && candidate.turning.turnSizeIcMm > boreDiameter) {\n          issues.push({ field: \"bore_diameter_mm\", message: \"Insert size exceeds target bore diameter.\", severity: \"error\", code: \"bore_clearance\" });\n        }\n        return issues;\n      },\n      familyScoreParts: function familyScoreParts(candidate, ctx) {\n        var rows = selectRows(candidate, ctx);\n        return {\n          row_match: rows.length > 0 ? 1 : 0,\n          stage_match: rows.some(function match(row) {\n            return row.constraints.conditionStage && row.constraints.conditionStage === getRequestedStage(ctx);\n          }) ? 1 : 0,\n        };\n      },\n      resolveRecipe: function resolveRecipe(candidate, ctx) {\n        var resolution = resolveRecipeRows(candidate.rows.turning, ctx);\n        if (resolution.rows.length === 0) return { source: \"none\", recipe: null };\n        return { source: resolution.source, recipe: resolution.rows[0].recipe };\n      },\n      getSharedMetrics: function getSharedMetrics(candidate, ctx) {\n        return {\n          boreDiameterMm: toNullableNumber(ctx.answers && ctx.answers.bore_diameter_mm),\n          boreDepthMm: toNullableNumber(ctx.answers && ctx.answers.bore_depth_mm),\n          insertIcMm: candidate.turning.turnSizeIcMm || null,\n          noseRadiusMm: candidate.turning.turnNoseRadiusMm || null,\n        };\n      },\n    };\n    \n    exports.turningTools = turningTools;\n  },\n  \"materials/iso-subgroup-profiles.js\": function (exports, module, __bundle) {\n    function toRange(value) {\n      var text = String(value == null ? \"\" : value).trim();\n      var match;\n      var single;\n      if (!text || text === \"-\" || text.toLowerCase() === \"dry\") return null;\n      match = text.match(/^([<>])\\s*(\\d+(?:\\.\\d+)?)$/);\n      if (match) {\n        return Object.freeze({\n          label: text,\n          min: match[1] === \">\" ? Number(match[2]) : null,\n          max: match[1] === \"<\" ? Number(match[2]) : null,\n          qualifier: match[1] === \">\" ? \"gt\" : \"lt\",\n        });\n      }\n      match = text.match(/^(\\d+(?:\\.\\d+)?)\\s*-\\s*(\\d+(?:\\.\\d+)?)$/);\n      if (match) {\n        return Object.freeze({\n          label: text,\n          min: Number(match[1]),\n          max: Number(match[2]),\n          qualifier: \"range\",\n        });\n      }\n      single = Number(text);\n      if (Number.isFinite(single)) {\n        return Object.freeze({\n          label: text,\n          min: single,\n          max: single,\n          qualifier: \"exact\",\n        });\n      }\n      return null;\n    }\n    \n    function normalizeCoolantMode(value) {\n      var text = String(value == null ? \"\" : value).trim().toLowerCase();\n      if (!text) return null;\n      if (text.indexOf(\"through\") >= 0 || text.indexOf(\"internal\") >= 0 || text.indexOf(\"hpc\") >= 0) return \"through\";\n      if (text.indexOf(\"dry\") >= 0) return \"dry\";\n      if (text.indexOf(\"mql\") >= 0 || text.indexOf(\"mist\") >= 0) return \"mist\";\n      if (text.indexOf(\"oil\") >= 0 || text.indexOf(\"emulsion\") >= 0) return \"external\";\n      return \"unknown\";\n    }\n    \n    function createProfile(raw) {\n      return Object.freeze({\n        code: raw.code,\n        handle: raw.handle,\n        isoGroup: raw.isoGroup,\n        label: raw.label,\n        tensileStrengthMpa: raw.tensileStrengthMpa || null,\n        tensileStrengthRange: toRange(raw.tensileStrengthMpa),\n        hardnessHrc: raw.hardnessHrc || null,\n        hardnessRange: toRange(raw.hardnessHrc),\n        workHardening: raw.workHardening,\n        buildUpEdgeTendency: raw.buildUpEdgeTendency,\n        abrasiveness: raw.abrasiveness,\n        chipForm: raw.chipForm,\n        machinability: raw.machinability,\n        typicalVcMMin: raw.typicalVcMMin || null,\n        typicalVcRange: toRange(raw.typicalVcMMin),\n        preferredCoolant: raw.coolant || null,\n        preferredCoolantMode: normalizeCoolantMode(raw.coolant),\n        coolantPressureBar: raw.coolantPressureBar || null,\n        coolantPressureRange: toRange(raw.coolantPressureBar),\n        preferredGradeHighProductivity: raw.preferredGradeHighProductivity || null,\n        preferredGradeLowVolumeProduction: raw.preferredGradeLowVolumeProduction || null,\n        toolHolder: raw.toolHolder || null,\n        avoid: raw.avoid || null,\n        typicalFailure: raw.typicalFailure || null,\n      });\n    }\n    \n    var RAW_PROFILES = [\n      { code: \"P0\", handle: \"p0\", isoGroup: \"P\", label: \"Low-Carbon Steels, Long Chipping\", tensileStrengthMpa: \"<530\", hardnessHrc: null, workHardening: \"low\", buildUpEdgeTendency: \"high\", abrasiveness: \"low\", chipForm: \"long\", machinability: 80, typicalVcMMin: \"180-260\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"HSS coated\", toolHolder: null, avoid: \"vc too low -> build up edge, running dull edges\", typicalFailure: \"BUE, flank wear\" },\n      { code: \"P1\", handle: \"p1\", isoGroup: \"P\", label: \"Low-Carbon Steels, Short Chipping, Free Machining\", tensileStrengthMpa: \"<530\", hardnessHrc: null, workHardening: \"low\", buildUpEdgeTendency: \"medium\", abrasiveness: \"low\", chipForm: \"short\", machinability: 85, typicalVcMMin: \"180-260\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"HSS coated\", toolHolder: null, avoid: \"Wrong geometry for short chips; too low fz -> rubbing.\", typicalFailure: \"Flank wear, BUE\" },\n      { code: \"P2\", handle: \"p2\", isoGroup: \"P\", label: \"Medium- and High-Carbon Steels\", tensileStrengthMpa: \">530\", hardnessHrc: \"<25\", workHardening: \"medium\", buildUpEdgeTendency: \"medium\", abrasiveness: \"medium\", chipForm: \"short\", machinability: 70, typicalVcMMin: \"150-230\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"HSS coated\", toolHolder: null, avoid: \"Insufficient coolant; ap/ae too high without rigidity.\", typicalFailure: \"Flank and crater wear\" },\n      { code: \"P3\", handle: \"p3\", isoGroup: \"P\", label: \"Alloy Steels and Tool Steels\", tensileStrengthMpa: \"600-850\", hardnessHrc: \"<35\", workHardening: \"medium\", buildUpEdgeTendency: \"medium\", abrasiveness: \"medium\", chipForm: \"short\", machinability: 60, typicalVcMMin: \"120-200\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"Carbide uncoated\", toolHolder: null, avoid: \"Edges too sharp for alloyed steels; missing edge prep.\", typicalFailure: \"Crater wear, micro-chipping\" },\n      { code: \"P4\", handle: \"p4\", isoGroup: \"P\", label: \"Alloy Steels and Tool Steels\", tensileStrengthMpa: \"850-1400\", hardnessHrc: \"35-48\", workHardening: \"high\", buildUpEdgeTendency: \"low\", abrasiveness: \"high\", chipForm: \"short\", machinability: 55, typicalVcMMin: \"100-180\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: null, avoid: \"vc too high in hot-strength ranges; wrong grade -> rapid crater wear.\", typicalFailure: \"Plastic deformation, crater wear\" },\n      { code: \"P5\", handle: \"p5\", isoGroup: \"P\", label: \"Ferritic, Martensitic, and PH Stainless Steels\", tensileStrengthMpa: \"600-900\", hardnessHrc: \"<35\", workHardening: \"medium\", buildUpEdgeTendency: \"medium\", abrasiveness: \"medium\", chipForm: \"short\", machinability: 55, typicalVcMMin: \"100-180\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"Carbide uncoated\", toolHolder: null, avoid: \"Wrong coolant strategy; long engagement -> heat build-up.\", typicalFailure: \"Adhesion, flank wear\" },\n      { code: \"P6\", handle: \"p6\", isoGroup: \"P\", label: \"High-Strength Ferritic, Martensitic, and PH Stainless Steels\", tensileStrengthMpa: \"900-1350\", hardnessHrc: \"35-48\", workHardening: \"high\", buildUpEdgeTendency: \"medium\", abrasiveness: \"high\", chipForm: \"short\", machinability: 45, typicalVcMMin: \"80-150\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: null, avoid: \"fz/ap too aggressive; hone too small -> micro-chipping.\", typicalFailure: \"Micro-chipping, notch wear\" },\n      { code: \"M1\", handle: \"m1\", isoGroup: \"M\", label: \"Austenitic Stainless Steel\", tensileStrengthMpa: \"<600\", hardnessHrc: null, workHardening: \"very high\", buildUpEdgeTendency: \"high\", abrasiveness: \"medium\", chipForm: \"long\", machinability: 40, typicalVcMMin: \"80-160\", coolant: \"emulsion\", coolantPressureBar: \"20-50\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Prefer rigid toolholders with high-pressure internal coolant capability\", avoid: \"Dwells; re-entry at DOC line; insufficient high-pressure coolant.\", typicalFailure: \"Notch wear (at DOC), adhesion/BUE\" },\n      { code: \"M2\", handle: \"m2\", isoGroup: \"M\", label: \"High-Strength Austenitic Stainless and Cast Stainless Steels\", tensileStrengthMpa: \"600-800\", hardnessHrc: \"<25\", workHardening: \"very high\", buildUpEdgeTendency: \"high\", abrasiveness: \"high\", chipForm: \"long\", machinability: 35, typicalVcMMin: \"70-150\", coolant: \"emulsion\", coolantPressureBar: \"20-50\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Prefer rigid toolholders with high-pressure internal coolant capability\", avoid: \"Too negative geometry; too low vc -> severe work-hardening.\", typicalFailure: \"Notch wear, flank wear\" },\n      { code: \"M3\", handle: \"m3\", isoGroup: \"M\", label: \"Duplex Stainless Steel\", tensileStrengthMpa: \"<800\", hardnessHrc: \"<30\", workHardening: \"high\", buildUpEdgeTendency: \"medium\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 30, typicalVcMMin: \"60-140\", coolant: \"emulsion\", coolantPressureBar: \"20-50\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Prefer rigid toolholders with high-pressure internal coolant capability\", avoid: \"Poor stability; wrong entry/exit -> notch wear.\", typicalFailure: \"Abrasive wear, notch wear\" },\n      { code: \"K1\", handle: \"k1\", isoGroup: \"K\", label: \"Grey Cast Iron\", tensileStrengthMpa: \"125-500\", hardnessHrc: \"<32\", workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"high\", chipForm: \"powder\", machinability: 75, typicalVcMMin: \"180-280\", coolant: \"dry\", coolantPressureBar: null, preferredGradeHighProductivity: \"Ceramic\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Use robust, negative-rake holders and cutter bodies with strong insert seats; in milling, wide chip gullets and stable arbor clamping are beneficial.\", avoid: \"Coolant on/off -> thermal shock; edges too sharp.\", typicalFailure: \"Abrasive flank wear, thermal cracks\" },\n      { code: \"K2\", handle: \"k2\", isoGroup: \"K\", label: \"Low- and Medium-Strength Ductile Irons and CGI\", tensileStrengthMpa: \"<600\", hardnessHrc: \"<28\", workHardening: \"low\", buildUpEdgeTendency: \"medium\", abrasiveness: \"high\", chipForm: \"short\", machinability: 65, typicalVcMMin: \"150-250\", coolant: \"dry\", coolantPressureBar: null, preferredGradeHighProductivity: \"Ceramic\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Use robust, negative-rake holders and cutter bodies with strong insert seats; in milling, wide chip gullets and stable arbor clamping are beneficial.\", avoid: \"Ignoring skin/sand; wrong CVD/PVD selection.\", typicalFailure: \"Flank wear, edge chipping\" },\n      { code: \"K3\", handle: \"k3\", isoGroup: \"K\", label: \"High-Strength Ductile Irons and ADI\", tensileStrengthMpa: \">600\", hardnessHrc: \"<43\", workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 45, typicalVcMMin: \"120-200\", coolant: \"dry\", coolantPressureBar: null, preferredGradeHighProductivity: \"Ceramic\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Use robust, negative-rake holders and cutter bodies with strong insert seats; in milling, wide chip gullets and stable arbor clamping are beneficial.\", avoid: \"Coolant with ceramic/CBN; vc too high without stiffness.\", typicalFailure: \"Edge chipping, thermal cracks\" },\n      { code: \"N1\", handle: \"n1\", isoGroup: \"N\", label: \"Wrought Aluminium\", tensileStrengthMpa: null, hardnessHrc: null, workHardening: \"low\", buildUpEdgeTendency: \"high\", abrasiveness: \"low\", chipForm: \"long\", machinability: 90, typicalVcMMin: \"400-1200\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"PCD\", preferredGradeLowVolumeProduction: \"Carbide uncoated\", toolHolder: \"High-precision, low-runout holders (shrink-fit, hydraulic) are recommended\", avoid: \"vc too low -> BUE; coated edges instead of polished/DLC.\", typicalFailure: \"BUE/adhesion\" },\n      { code: \"N2\", handle: \"n2\", isoGroup: \"N\", label: \"Low-Silicon Aluminium Alloys and Magnesium Alloys\", tensileStrengthMpa: null, hardnessHrc: null, workHardening: \"low\", buildUpEdgeTendency: \"high\", abrasiveness: \"low\", chipForm: \"long\", machinability: 85, typicalVcMMin: \"350-1000\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"PCD\", preferredGradeLowVolumeProduction: \"Carbide uncoated\", toolHolder: \"High-precision, low-runout holders (shrink-fit, hydraulic) are recommended\", avoid: \"Chip space too small; unpolished edges -> burr formation.\", typicalFailure: \"BUE/adhesion, burr formation\" },\n      { code: \"N3\", handle: \"n3\", isoGroup: \"N\", label: \"High-Silicon Aluminium Alloys and Magnesium Alloys\", tensileStrengthMpa: null, hardnessHrc: null, workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 60, typicalVcMMin: \"350-1000\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"PCD\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"High-precision, low-runout holders (shrink-fit, hydraulic) are recommended\", avoid: \"Too much heat -> melting/burrs; dull edge.\", typicalFailure: \"Smearing/adhesion, burr formation\" },\n      { code: \"N4\", handle: \"n4\", isoGroup: \"N\", label: \"Copper-, Brass-, Zinc-Based (Machinability 70-100)\", tensileStrengthMpa: null, hardnessHrc: null, workHardening: \"medium\", buildUpEdgeTendency: \"medium\", abrasiveness: \"medium\", chipForm: \"short\", machinability: 70, typicalVcMMin: \"150-280\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"HSS coated\", toolHolder: \"High-precision, low-runout holders (shrink-fit, hydraulic) are recommended\", avoid: \"vc too low in Cu/Brass -> BUE; no oil for finishing.\", typicalFailure: \"Adhesion/BUE, flank wear\" },\n      { code: \"N5\", handle: \"n5\", isoGroup: \"N\", label: \"Nylon, Plastics, Rubbers, Phenolics, Resins, Fibreglass\", tensileStrengthMpa: null, hardnessHrc: null, workHardening: \"low\", buildUpEdgeTendency: \"medium\", abrasiveness: \"low\", chipForm: \"long\", machinability: 50, typicalVcMMin: \"100-250\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"Carbide uncoated\", preferredGradeLowVolumeProduction: \"HSS uncoated\", toolHolder: \"High-precision, low-runout holders (shrink-fit, hydraulic) are recommended\", avoid: \"Too much heat -> melting/burrs; dull edge.\", typicalFailure: \"Smearing/adhesion, burr formation\" },\n      { code: \"N6\", handle: \"n6\", isoGroup: \"N\", label: \"Carbon, Graphite Composites, CFRP\", tensileStrengthMpa: null, hardnessHrc: null, workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"powder\", machinability: 40, typicalVcMMin: \"150-300\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"PCD uncoated\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"High-precision, low-runout holders (shrink-fit, hydraulic) are recommended\", avoid: \"Wrong geometry (no serrated edge); missing dust extraction.\", typicalFailure: \"Abrasive fibre wear, delamination/fraying\" },\n      { code: \"N7\", handle: \"n7\", isoGroup: \"N\", label: \"Metal Matrix Composites (MMC)\", tensileStrengthMpa: null, hardnessHrc: null, workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 35, typicalVcMMin: \"120-250\", coolant: \"emulsion\", coolantPressureBar: \"20\", preferredGradeHighProductivity: \"PCD uncoated\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"High-precision, low-runout holders (shrink-fit, hydraulic) are recommended\", avoid: \"Carbide instead of PCD; ap too large -> instant wear.\", typicalFailure: \"Severe abrasion, micro-chipping\" },\n      { code: \"S1\", handle: \"s1\", isoGroup: \"S\", label: \"Iron-Based, Heat-Resistant Alloys\", tensileStrengthMpa: \"500-1200\", hardnessHrc: \"25-48\", workHardening: \"very high\", buildUpEdgeTendency: \"medium\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 30, typicalVcMMin: \"40-90\", coolant: \"emulsion\", coolantPressureBar: \"50-70\", preferredGradeHighProductivity: \"Ceramic\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Use reinforced, short-overhang toolholders with reliable HP coolant through the holder\", avoid: \"Long engagements; low coolant\", typicalFailure: \"Crater wear, plastic deformation\" },\n      { code: \"S2\", handle: \"s2\", isoGroup: \"S\", label: \"Cobalt-Based, Heat-Resistant Alloys\", tensileStrengthMpa: \"1000-1450\", hardnessHrc: \"25-48\", workHardening: \"high\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 25, typicalVcMMin: \"30-80\", coolant: \"emulsion\", coolantPressureBar: \"50-70\", preferredGradeHighProductivity: \"Ceramic\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Use reinforced, short-overhang toolholders with reliable HP coolant through the holder\", avoid: \"vc too high; no HP-coolant; overhang too long.\", typicalFailure: \"Thermal fatigue, edge chipping\" },\n      { code: \"S3\", handle: \"s3\", isoGroup: \"S\", label: \"Nickel-Based, Heat-Resistant Alloys\", tensileStrengthMpa: \"600-1700\", hardnessHrc: \"<48\", workHardening: \"very high\", buildUpEdgeTendency: \"medium\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 20, typicalVcMMin: \"25-70\", coolant: \"emulsion\", coolantPressureBar: \"50-70\", preferredGradeHighProductivity: \"Ceramic\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Use reinforced, short-overhang toolholders with reliable HP coolant through the holder\", avoid: \"No HPC (approx. 70 bar in drilling); dwells; wrong entry.\", typicalFailure: \"Notch wear, crater wear, diffusion\" },\n      { code: \"S4\", handle: \"s4\", isoGroup: \"S\", label: \"Titanium and Titanium Alloys\", tensileStrengthMpa: \"900-1600\", hardnessHrc: \"33-48\", workHardening: \"high\", buildUpEdgeTendency: \"high\", abrasiveness: \"medium\", chipForm: \"short\", machinability: 25, typicalVcMMin: \"40-110\", coolant: \"emulsion\", coolantPressureBar: \"50-70\", preferredGradeHighProductivity: \"Carbide coated\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Use reinforced, short-overhang toolholders with reliable HP coolant through the holder\", avoid: \"Hone too large in Ti; poor cooling; shaft rubbing.\", typicalFailure: \"Adhesion/chipping, diffusion\" },\n      { code: \"H1\", handle: \"h1\", isoGroup: \"H\", label: \"Hardened Materials HRC 44-48\", tensileStrengthMpa: null, hardnessHrc: \"44-48\", workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 25, typicalVcMMin: \"80-200\", coolant: \"dry\", coolantPressureBar: null, preferredGradeHighProductivity: \"PcBN\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Very rigid toolholders with minimal overhang; for CBN/ceramic, choose holders with strong support behind the insert and secure clamping against vibration.\", avoid: \"Coolant on/off (thermal shock); f too high in finishing.\", typicalFailure: \"Abrasive flank/notch wear\" },\n      { code: \"H2\", handle: \"h2\", isoGroup: \"H\", label: \"Hardened Materials HRC 48-55\", tensileStrengthMpa: null, hardnessHrc: \"48-55\", workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 25, typicalVcMMin: \"80-200\", coolant: \"dry\", coolantPressureBar: null, preferredGradeHighProductivity: \"PcBN\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Very rigid toolholders with minimal overhang; for CBN/ceramic, choose holders with strong support behind the insert and secure clamping against vibration.\", avoid: \"Wrong edge prep; ap too large in interrupted cuts.\", typicalFailure: \"Notch wear, chipping\" },\n      { code: \"H3\", handle: \"h3\", isoGroup: \"H\", label: \"Hardened Materials HRC 56-60\", tensileStrengthMpa: null, hardnessHrc: \"56-60\", workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 25, typicalVcMMin: \"80-200\", coolant: \"dry\", coolantPressureBar: null, preferredGradeHighProductivity: \"PcBN\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Very rigid toolholders with minimal overhang; for CBN/ceramic, choose holders with strong support behind the insert and secure clamping against vibration.\", avoid: \"Wrong grade (no PCBN); underestimated vibration.\", typicalFailure: \"Chipping, thermal cracks\" },\n      { code: \"H4\", handle: \"h4\", isoGroup: \"H\", label: \"Hardened Materials HRC >60\", tensileStrengthMpa: null, hardnessHrc: \">60\", workHardening: \"low\", buildUpEdgeTendency: \"low\", abrasiveness: \"very high\", chipForm: \"short\", machinability: 25, typicalVcMMin: \"80-200\", coolant: \"dry\", coolantPressureBar: null, preferredGradeHighProductivity: \"PcBN\", preferredGradeLowVolumeProduction: \"Carbide coated\", toolHolder: \"Very rigid toolholders with minimal overhang; for CBN/ceramic, choose holders with strong support behind the insert and secure clamping against vibration.\", avoid: \"Long stick-out; coolant in hard turning; wrong DOC strategy.\", typicalFailure: \"Chipping, thermal cracks\" },\n    ];\n    \n    var MATERIAL_SUBGROUP_PROFILES = Object.freeze(RAW_PROFILES.map(createProfile));\n    \n    var MATERIAL_SUBGROUP_PROFILE_BY_CODE = Object.freeze(MATERIAL_SUBGROUP_PROFILES.reduce(function reduceMap(map, profile) {\n      map[profile.code] = profile;\n      return map;\n    }, {}));\n    \n    function getMaterialProfile(code) {\n      var normalizedCode = String(code == null ? \"\" : code).trim().toUpperCase();\n      return MATERIAL_SUBGROUP_PROFILE_BY_CODE[normalizedCode] || null;\n    }\n    \n    function getMaterialProfileLabel(code) {\n      var profile = getMaterialProfile(code);\n      return profile ? profile.label : null;\n    }\n    \n    function listMaterialProfiles() {\n      return MATERIAL_SUBGROUP_PROFILES.slice();\n    }\n    \n    exports.getMaterialProfile = getMaterialProfile;\n    exports.getMaterialProfileLabel = getMaterialProfileLabel;\n    exports.listMaterialProfiles = listMaterialProfiles;\n    exports.MATERIAL_SUBGROUP_PROFILES = MATERIAL_SUBGROUP_PROFILES;\n  },\n  \"presentation/edgevend-simple-pdf-global.js\": function (exports, module, __bundle) {\n    (function(window){\n      \"use strict\";\n    \n      var PAGE = {\n        width: 595.28,\n        height: 841.89,\n        marginX: 42,\n        marginTop: 40,\n        marginBottom: 42,\n        footerHeight: 24,\n        firstHeaderHeight: 304,\n        nextHeaderHeight: 44,\n        sectionGap: 20\n      };\n    \n      var DEFAULT_THEME = {\n        primary: \"#123d4a\",\n        primary_dark: \"#0d2730\",\n        accent: \"#c47a33\",\n        panel: \"#f5f8fa\",\n        panel_alt: \"#eef3f6\",\n        text: \"#15212b\",\n        muted: \"#5f6974\",\n        line: \"#d7dfe5\",\n        line_soft: \"#e6edf1\",\n        line_strong: \"#c9d6dc\",\n        paper: \"#f7fafb\",\n        paper_alt: \"#eef4f6\",\n        surface: \"#ffffff\",\n        surface_alt: \"#f8fbfc\",\n        surface_cool: \"#e8f1f4\",\n        surface_warm: \"#f5ede4\",\n        success: \"#1b6a52\",\n        warning: \"#a46220\"\n      };\n    \n      var WIN_ANSI_MAP = {\n        \"\\u20ac\": 128,\n        \"\\u201a\": 130,\n        \"\\u0192\": 131,\n        \"\\u201e\": 132,\n        \"\\u2026\": 133,\n        \"\\u2020\": 134,\n        \"\\u2021\": 135,\n        \"\\u02c6\": 136,\n        \"\\u2030\": 137,\n        \"\\u0160\": 138,\n        \"\\u2039\": 139,\n        \"\\u0152\": 140,\n        \"\\u017d\": 142,\n        \"\\u2018\": 145,\n        \"\\u2019\": 146,\n        \"\\u201c\": 147,\n        \"\\u201d\": 148,\n        \"\\u2022\": 149,\n        \"\\u2013\": 150,\n        \"\\u2014\": 151,\n        \"\\u02dc\": 152,\n        \"\\u2122\": 153,\n        \"\\u0161\": 154,\n        \"\\u203a\": 155,\n        \"\\u0153\": 156,\n        \"\\u017e\": 158,\n        \"\\u0178\": 159\n      };\n    \n      function clamp(value, min, max){\n        return Math.max(min, Math.min(max, value));\n      }\n    \n      function normalizeText(value){\n        return String(value == null ? \"\" : value)\n          .replace(/\\r\\n/g, \"\\n\")\n          .replace(/\\r/g, \"\\n\")\n          .replace(/\\u00a0/g, \" \");\n      }\n    \n      function toByte(value){\n        return value & 255;\n      }\n    \n      function encodeAscii(text){\n        var source = String(text == null ? \"\" : text);\n        var bytes = new Uint8Array(source.length);\n        var idx;\n        for(idx = 0; idx < source.length; idx += 1){\n          bytes[idx] = toByte(source.charCodeAt(idx));\n        }\n        return bytes;\n      }\n    \n      function bytesToHex(bytes){\n        var out = \"\";\n        var idx;\n        for(idx = 0; idx < bytes.length; idx += 1){\n          out += (bytes[idx] < 16 ? \"0\" : \"\") + bytes[idx].toString(16);\n        }\n        return out.toUpperCase();\n      }\n    \n      function textToWinAnsiBytes(text){\n        var source = normalizeText(text);\n        var bytes = [];\n        var idx;\n        var code;\n        var mapped;\n        for(idx = 0; idx < source.length; idx += 1){\n          code = source.charCodeAt(idx);\n          if(code >= 32 && code <= 255){\n            bytes.push(code);\n            continue;\n          }\n          mapped = WIN_ANSI_MAP[source.charAt(idx)];\n          bytes.push(mapped != null ? mapped : 63);\n        }\n        return new Uint8Array(bytes);\n      }\n    \n      function textHex(text){\n        return bytesToHex(textToWinAnsiBytes(text));\n      }\n    \n      function trimNumber(value){\n        var rounded = Math.round(value * 100) / 100;\n        var stringValue = String(rounded.toFixed(2));\n        return stringValue.replace(/\\.00$/, \"\").replace(/(\\.\\d)0$/, \"$1\");\n      }\n    \n      function parseColor(hex){\n        var clean = String(hex || \"#000000\").replace(\"#\", \"\");\n        if(clean.length === 3){\n          clean = clean.replace(/(.)/g, \"$1$1\");\n        }\n        return {\n          r: parseInt(clean.slice(0, 2), 16) / 255,\n          g: parseInt(clean.slice(2, 4), 16) / 255,\n          b: parseInt(clean.slice(4, 6), 16) / 255\n        };\n      }\n    \n      function colorFillCommand(hex){\n        var color = parseColor(hex);\n        return trimNumber(color.r) + \" \" + trimNumber(color.g) + \" \" + trimNumber(color.b) + \" rg\";\n      }\n    \n      function colorStrokeCommand(hex){\n        var color = parseColor(hex);\n        return trimNumber(color.r) + \" \" + trimNumber(color.g) + \" \" + trimNumber(color.b) + \" RG\";\n      }\n    \n      function base64ToBytes(base64){\n        var binary = window.atob(base64);\n        var bytes = new Uint8Array(binary.length);\n        var idx;\n        for(idx = 0; idx < binary.length; idx += 1){\n          bytes[idx] = binary.charCodeAt(idx);\n        }\n        return bytes;\n      }\n    \n      function parseDataUrl(dataUrl){\n        var match = /^data:([^;,]+);base64,(.*)$/i.exec(String(dataUrl || \"\"));\n        if(!match){\n          return null;\n        }\n        return {\n          mime: match[1].toLowerCase(),\n          bytes: base64ToBytes(match[2])\n        };\n      }\n    \n      function mergeTheme(theme){\n        var merged = {};\n        var source = theme || {};\n        var key;\n        for(key in DEFAULT_THEME){\n          if(Object.prototype.hasOwnProperty.call(DEFAULT_THEME, key)){\n            merged[key] = source[key] || DEFAULT_THEME[key];\n          }\n        }\n        return merged;\n      }\n    \n      function charWidthFactor(char, isBold){\n        if(char === \" \"){ return 0.28; }\n        if(/[ilI\\.,:;!'|]/.test(char)){ return 0.24; }\n        if(/[mwMW@#%&]/.test(char)){ return isBold ? 0.92 : 0.84; }\n        if(/[A-Z0-9]/.test(char)){ return isBold ? 0.64 : 0.6; }\n        if(/[\\(\\)\\[\\]\\{\\}\\/\\\\\\-]/.test(char)){ return 0.34; }\n        return isBold ? 0.58 : 0.54;\n      }\n    \n      function measureText(text, fontSize, isBold){\n        var source = normalizeText(text);\n        var width = 0;\n        var idx;\n        for(idx = 0; idx < source.length; idx += 1){\n          width += charWidthFactor(source.charAt(idx), isBold) * fontSize;\n        }\n        return width;\n      }\n    \n      function wrapLine(line, maxWidth, fontSize, isBold){\n        var words = normalizeText(line).split(/\\s+/);\n        var lines = [];\n        var current = \"\";\n        var idx;\n        var candidate;\n        var word;\n        if(!words.length || !words[0]){\n          return [\"\"];\n        }\n        for(idx = 0; idx < words.length; idx += 1){\n          word = words[idx];\n          candidate = current ? current + \" \" + word : word;\n          if(measureText(candidate, fontSize, isBold) <= maxWidth){\n            current = candidate;\n            continue;\n          }\n          if(current){\n            lines.push(current);\n            current = \"\";\n          }\n          while(measureText(word, fontSize, isBold) > maxWidth && word.length > 1){\n            var split = word.length;\n            while(split > 1 && measureText(word.slice(0, split), fontSize, isBold) > maxWidth){\n              split -= 1;\n            }\n            lines.push(word.slice(0, split));\n            word = word.slice(split);\n          }\n          current = word;\n        }\n        if(current){\n          lines.push(current);\n        }\n        return lines.length ? lines : [\"\"];\n      }\n    \n      function wrapText(text, maxWidth, fontSize, isBold){\n        var parts = normalizeText(text).split(\"\\n\");\n        var lines = [];\n        var idx;\n        var wrapped;\n        for(idx = 0; idx < parts.length; idx += 1){\n          wrapped = wrapLine(parts[idx], maxWidth, fontSize, isBold);\n          Array.prototype.push.apply(lines, wrapped);\n        }\n        return lines.length ? lines : [\"\"];\n      }\n    \n      function buildDoc(spec){\n        var doc = {\n          spec: spec || {},\n          theme: mergeTheme(spec && spec.theme),\n          pages: [],\n          images: []\n        };\n        registerImages(doc);\n        renderDocument(doc);\n        appendFooters(doc);\n        return doc;\n      }\n    \n      function registerImageEntry(doc, entry, fallbackAlias){\n        var parsed;\n        var alias;\n        if(!entry || !entry.dataUrl){ return; }\n        parsed = parseDataUrl(entry.dataUrl);\n        if(!parsed || parsed.mime !== \"image/jpeg\"){ return; }\n        alias = entry.alias || fallbackAlias;\n        doc.images.push({\n          alias: alias,\n          resourceName: \"Im\" + String(doc.images.length + 1),\n          width: entry.width,\n          height: entry.height,\n          bytes: parsed.bytes\n        });\n      }\n    \n      function registerImages(doc){\n        var branding = doc.spec.branding || {};\n        var media = Array.isArray(doc.spec.media) ? doc.spec.media : [];\n        var idx;\n        if(branding.logo && branding.logo.dataUrl){\n          registerImageEntry(doc, {\n            alias: \"logo\",\n            dataUrl: branding.logo.dataUrl,\n            width: branding.logo.width,\n            height: branding.logo.height\n          }, \"logo\");\n        }\n        for(idx = 0; idx < media.length; idx += 1){\n          registerImageEntry(doc, media[idx], \"media_\" + String(idx + 1));\n        }\n      }\n    \n      function findImage(doc, alias){\n        var idx;\n        for(idx = 0; idx < doc.images.length; idx += 1){\n          if(doc.images[idx].alias === alias){\n            return doc.images[idx];\n          }\n        }\n        return null;\n      }\n    \n      function createPage(doc){\n        var page = {\n          ops: [],\n          xobjects: {}\n        };\n        doc.pages.push(page);\n        return page;\n      }\n    \n      function pushOp(page, operation){\n        page.ops.push(operation + \"\\n\");\n      }\n    \n      function drawRect(page, x, yTop, width, height, fillColor, strokeColor, lineWidth){\n        var y = PAGE.height - yTop - height;\n        var ops = [];\n        if(fillColor){\n          ops.push(colorFillCommand(fillColor));\n        }\n        if(strokeColor){\n          ops.push(colorStrokeCommand(strokeColor));\n          if(lineWidth){\n            ops.push(trimNumber(lineWidth) + \" w\");\n          }\n        }\n        ops.push(trimNumber(x) + \" \" + trimNumber(y) + \" \" + trimNumber(width) + \" \" + trimNumber(height) + \" re\");\n        ops.push(fillColor && strokeColor ? \"B\" : (fillColor ? \"f\" : \"S\"));\n        pushOp(page, ops.join(\"\\n\"));\n      }\n    \n      function drawLine(page, x1, y1, x2, y2, color, lineWidth){\n        var commands = [];\n        commands.push(colorStrokeCommand(color || \"#000000\"));\n        commands.push(trimNumber(lineWidth || 1) + \" w\");\n        commands.push(trimNumber(x1) + \" \" + trimNumber(PAGE.height - y1) + \" m\");\n        commands.push(trimNumber(x2) + \" \" + trimNumber(PAGE.height - y2) + \" l\");\n        commands.push(\"S\");\n        pushOp(page, commands.join(\"\\n\"));\n      }\n    \n      function drawTextLine(page, text, x, yTop, fontSize, fontName, color, align, boxWidth){\n        var width = measureText(text, fontSize, fontName === \"F2\");\n        var drawX = x;\n        var baselineY;\n        var ops;\n        if(align === \"right\"){\n          drawX = x + Math.max(0, boxWidth - width);\n        }else if(align === \"center\"){\n          drawX = x + Math.max(0, (boxWidth - width) / 2);\n        }\n        baselineY = PAGE.height - yTop - fontSize;\n        ops = [\n          \"BT\",\n          colorFillCommand(color || \"#000000\"),\n          \"/\" + fontName + \" \" + trimNumber(fontSize) + \" Tf\",\n          \"1 0 0 1 \" + trimNumber(drawX) + \" \" + trimNumber(baselineY) + \" Tm\",\n          \"<\" + textHex(text) + \"> Tj\",\n          \"ET\"\n        ];\n        pushOp(page, ops.join(\"\\n\"));\n      }\n    \n      function drawTextLines(page, lines, x, yTop, fontSize, fontName, color, lineHeight, align, boxWidth){\n        var idx;\n        for(idx = 0; idx < lines.length; idx += 1){\n          drawTextLine(page, lines[idx], x, yTop + (idx * lineHeight), fontSize, fontName, color, align, boxWidth);\n        }\n      }\n    \n      function drawBullet(page, x, yTop, color){\n        drawRect(page, x, yTop, 4, 4, color, null, 0);\n      }\n    \n      function drawImage(page, image, x, yTop, width, height){\n        var y = PAGE.height - yTop - height;\n        if(!image){ return; }\n        page.xobjects[image.alias] = image;\n        pushOp(page, [\n          \"q\",\n          trimNumber(width) + \" 0 0 \" + trimNumber(height) + \" \" + trimNumber(x) + \" \" + trimNumber(y) + \" cm\",\n          \"/\" + image.resourceName + \" Do\",\n          \"Q\"\n        ].join(\"\\n\"));\n      }\n    \n      function drawPill(page, text, x, yTop, options){\n        var config = options || {};\n        var fontSize = config.fontSize || 8.8;\n        var paddingX = config.paddingX || 11;\n        var height = config.height || 20;\n        var fillColor = config.fillColor || \"#EEF3F6\";\n        var textColor = config.textColor || \"#15212B\";\n        var isBold = config.bold === true;\n        var fontName = isBold ? \"F2\" : \"F1\";\n        var width = measureText(text || \"\", fontSize, isBold) + (paddingX * 2);\n    \n        drawRect(page, x, yTop, width, height, fillColor, null, 0);\n        drawTextLine(page, text || \"\", x + paddingX, yTop + ((height - fontSize) / 2), fontSize, fontName, textColor);\n        return width;\n      }\n    \n      function drawWrappedPills(page, items, x, yTop, maxWidth, options){\n        var config = options || {};\n        var list = Array.isArray(items) ? items.filter(Boolean) : [];\n        var gapX = config.gapX == null ? 6 : config.gapX;\n        var gapY = config.gapY == null ? 6 : config.gapY;\n        var rowHeight = config.height || 20;\n        var cursorX = x;\n        var cursorY = yTop;\n        var idx;\n        var width;\n    \n        for(idx = 0; idx < list.length; idx += 1){\n          width = measureText(list[idx], config.fontSize || 8.8, config.bold === true) + ((config.paddingX || 11) * 2);\n          if(cursorX > x && cursorX + width > x + maxWidth){\n            cursorX = x;\n            cursorY += rowHeight + gapY;\n          }\n          drawPill(page, list[idx], cursorX, cursorY, config);\n          cursorX += width + gapX;\n        }\n    \n        return list.length ? cursorY + rowHeight : yTop;\n      }\n    \n      function drawContainedImage(page, image, x, yTop, width, height, scaleLimit){\n        var scale;\n        var drawWidth;\n        var drawHeight;\n        var drawX;\n        var drawY;\n        if(!image){ return; }\n        scale = Math.min(width / image.width, height / image.height, scaleLimit || 1);\n        drawWidth = image.width * scale;\n        drawHeight = image.height * scale;\n        drawX = x + ((width - drawWidth) / 2);\n        drawY = yTop + ((height - drawHeight) / 2);\n        drawImage(page, image, drawX, drawY, drawWidth, drawHeight);\n      }\n    \n      function getCalloutTone(theme, tone){\n        switch(String(tone || \"accent\")){\n          case \"primary\":\n            return { fill: \"#EEF4F7\", accent: theme.primary, text: theme.text, eyebrow: theme.primary, border: theme.line_strong, band: theme.surface_cool };\n          case \"warning\":\n            return { fill: \"#FBF1E6\", accent: theme.accent, text: theme.text, eyebrow: theme.accent, border: \"#E6D3BF\", band: theme.surface_warm };\n          case \"neutral\":\n            return { fill: theme.panel, accent: theme.line, text: theme.text, eyebrow: theme.muted, border: theme.line_soft, band: theme.surface_alt };\n          default:\n            return { fill: theme.panel_alt, accent: theme.accent, text: theme.text, eyebrow: theme.accent, border: theme.line_strong, band: theme.surface_warm };\n        }\n      }\n    \n      function getSectionTone(theme, variant){\n        switch(String(variant || \"default\")){\n          case \"summary\":\n            return {\n              fill: \"#FBFDFE\",\n              border: theme.line_strong,\n              bandLeft: theme.surface_cool,\n              bandRight: theme.surface_warm,\n              accent: theme.primary,\n              summaryFill: theme.surface,\n              summaryBorder: theme.line_soft\n            };\n          case \"inputs\":\n            return {\n              fill: theme.surface,\n              border: theme.line_soft,\n              bandLeft: theme.surface_cool,\n              bandRight: theme.surface_alt,\n              accent: theme.primary,\n              summaryFill: theme.surface_alt,\n              summaryBorder: theme.line_soft\n            };\n          case \"recipe\":\n            return {\n              fill: \"#FCF8F3\",\n              border: \"#E5D7C8\",\n              bandLeft: theme.surface_warm,\n              bandRight: theme.surface_cool,\n              accent: theme.accent,\n              summaryFill: \"#FFFDF9\",\n              summaryBorder: \"#EEE1D3\"\n            };\n          case \"bundle\":\n            return {\n              fill: theme.surface,\n              border: theme.line_soft,\n              bandLeft: theme.surface_cool,\n              bandRight: theme.surface_alt,\n              accent: theme.primary,\n              summaryFill: \"#F9FBFC\",\n              summaryBorder: theme.line_soft\n            };\n          case \"warning\":\n            return {\n              fill: \"#FBF3EA\",\n              border: \"#E6D3BF\",\n              bandLeft: theme.surface_warm,\n              bandRight: theme.surface_alt,\n              accent: theme.accent,\n              summaryFill: \"#FFF8F1\",\n              summaryBorder: \"#EFDCC9\"\n            };\n          default:\n            return {\n              fill: theme.surface,\n              border: theme.line_soft,\n              bandLeft: theme.surface_cool,\n              bandRight: theme.surface_alt,\n              accent: theme.primary,\n              summaryFill: theme.surface_alt,\n              summaryBorder: theme.line_soft\n            };\n        }\n      }\n    \n      function renderDocument(doc){\n        var state = { page: null, cursorY: 0 };\n        var idx;\n        startPage(doc, state);\n        for(idx = 0; idx < (doc.spec.sections || []).length; idx += 1){\n          renderSection(doc, state, doc.spec.sections[idx]);\n        }\n      }\n    \n      function startPage(doc, state){\n        state.page = createPage(doc);\n        if(doc.pages.length === 1){\n          state.cursorY = renderFirstPageHeader(doc, state.page);\n        }else{\n          renderContinuationHeader(doc, state.page);\n          state.cursorY = PAGE.nextHeaderHeight + 18;\n        }\n      }\n    \n      function ensureSpace(doc, state, requiredHeight){\n        var limit = PAGE.height - PAGE.marginBottom - PAGE.footerHeight;\n        if(!state.page){\n          startPage(doc, state);\n          return;\n        }\n        if(state.cursorY + requiredHeight <= limit){\n          return;\n        }\n        startPage(doc, state);\n      }\n    \n      function renderFirstPageHeader(doc, page){\n        var theme = doc.theme;\n        var logo = findImage(doc, \"logo\");\n        var cover = doc.spec.cover || {};\n        var brandText = (cover.kicker || (doc.spec.branding || {}).brand_name || \"EdgeVend Tool Finder\").toUpperCase();\n        var heroX = 18;\n        var heroY = 20;\n        var heroWidth = PAGE.width - 36;\n        var heroHeight = PAGE.firstHeaderHeight - 22;\n        var rightWidth = 188;\n        var gap = 28;\n        var leftX = heroX + 20;\n        var leftWidth = heroWidth - rightWidth - gap - 42;\n        var rightX = heroX + heroWidth - rightWidth - 20;\n        var titleLines = wrapText(cover.title || doc.spec.title || \"EdgeVend Tool Finder Summary\", leftWidth, 30, true);\n        var subtitleLines = wrapText(cover.subtitle || doc.spec.subtitle || \"\", leftWidth, 12.3, false);\n        var metaLines = wrapText(cover.meta || doc.spec.meta || \"\", leftWidth, 9.2, false);\n        var productImage = findImage(doc, cover.product && cover.product.imageAlias);\n        var advisorImage = findImage(doc, cover.advisor && cover.advisor.avatarAlias);\n        var stats = Array.isArray(cover.stats) ? cover.stats.slice(0, 4) : [];\n        var tags = Array.isArray(cover.tags) ? cover.tags.slice(0, 3) : [];\n        var signals = Array.isArray(cover.signals) ? cover.signals.slice(0, 5) : [];\n        var subtitleY = heroY + 44 + (titleLines.length * 32) + 4;\n        var metaY = subtitleY + (subtitleLines.length ? (subtitleLines.length * 14) + 10 : 0);\n        var tagY = metaY + (metaLines.length ? (metaLines.length * 12) + 10 : 6);\n        var tagsBottom = tagY;\n        var signalsY;\n        var signalsBottom;\n        var statY;\n        var statGap = 10;\n        var statWidth = (leftWidth - statGap) / 2;\n        var statHeight = 64;\n        var statsBottom = tagY;\n        var productCardBottom = 0;\n        var advisorBottom = 0;\n        var idx;\n    \n        drawRect(page, 0, 0, PAGE.width, PAGE.firstHeaderHeight + 18, theme.paper, null, 0);\n        drawRect(page, heroX, heroY, heroWidth, heroHeight, \"#FBFDFE\", theme.line_strong, 0.95);\n        drawRect(page, heroX, heroY, heroWidth, 10, theme.surface_cool, null, 0);\n        drawRect(page, heroX + 126, heroY, 162, 10, theme.surface_warm, null, 0);\n        drawRect(page, heroX + heroWidth - 120, heroY, 120, 10, theme.surface_cool, null, 0);\n        drawRect(page, rightX - 10, heroY + 16, rightWidth + 10, heroHeight - 32, \"#F2F7F9\", \"#DFE8ED\", 0.7);\n        drawLine(page, rightX - 16, heroY + 22, rightX - 16, heroY + heroHeight - 22, theme.line_soft, 0.9);\n        drawRect(page, heroX + 14, heroY + 18, leftWidth + 14, heroHeight - 36, \"#FFFFFF\", null, 0);\n    \n        drawTextLine(page, brandText, leftX, heroY + 18, 9.2, \"F2\", theme.primary);\n        drawTextLines(page, titleLines, leftX, heroY + 44, 30, \"F2\", theme.text, 32);\n        if(subtitleLines.length && subtitleLines[0]){\n          drawTextLines(page, subtitleLines, leftX, subtitleY, 12.3, \"F1\", theme.muted, 15);\n        }\n        if(metaLines.length && metaLines[0]){\n          drawTextLines(page, metaLines, leftX, metaY, 9.2, \"F1\", theme.muted, 12);\n        }\n    \n        if(tags.length){\n          tagsBottom = drawWrappedPills(page, tags, leftX, tagY, leftWidth, {\n            fontSize: 8.4,\n            paddingX: 10,\n            height: 20,\n            fillColor: \"#F2F5F7\",\n            textColor: theme.text,\n            bold: false\n          });\n        }\n        signalsY = tagsBottom + (tags.length ? 8 : 0);\n        signalsBottom = signals.length ? drawWrappedPills(page, signals, leftX, signalsY, leftWidth, {\n          fontSize: 8.6,\n          paddingX: 10,\n          height: 22,\n          fillColor: \"#EAF2F5\",\n          textColor: theme.text,\n          bold: false\n        }) : signalsY;\n        statY = signalsBottom + 16;\n    \n        for(idx = 0; idx < stats.length; idx += 1){\n          var statRow = Math.floor(idx / 2);\n          var statCol = idx % 2;\n          var statX = leftX + ((statWidth + statGap) * statCol);\n          var statTop = statY + (statRow * (statHeight + 10));\n          var valueLines = wrapText(stats[idx].value || \"\", statWidth - 18, 12.3, true);\n          var noteLines = stats[idx].note ? wrapText(stats[idx].note, statWidth - 16, 8.3, false) : [];\n          var statFill = stats[idx].tone === \"warm\" ? \"#FFF8F1\" : idx % 2 === 0 ? theme.surface : theme.surface_alt;\n          var bandFill = stats[idx].tone === \"warm\" ? theme.surface_warm : theme.surface_cool;\n          drawRect(page, statX, statTop, statWidth, statHeight, statFill, theme.line_soft, 0.7);\n          drawRect(page, statX, statTop, statWidth, 7, bandFill, null, 0);\n          drawRect(page, statX, statTop, 4, statHeight, idx === 0 ? theme.accent : theme.primary, null, 0);\n          drawTextLine(page, String(stats[idx].label || \"\").toUpperCase(), statX + 10, statTop + 14, 8.1, \"F1\", theme.muted);\n          drawTextLines(page, valueLines, statX + 10, statTop + 28, 12.3, \"F2\", theme.text, 14);\n          if(noteLines.length){\n            drawTextLines(page, noteLines, statX + 10, statTop + 44, 8.3, \"F1\", theme.muted, 10);\n          }\n        }\n        statsBottom = statY + (Math.max(1, Math.ceil(stats.length / 2)) * statHeight) + ((Math.max(1, Math.ceil(stats.length / 2)) - 1) * 10);\n    \n        if(logo){\n          drawRect(page, rightX, heroY + 14, rightWidth, 28, \"#FFFFFF\", theme.line_soft, 0.7);\n          drawRect(page, rightX, heroY + 14, rightWidth, 5, theme.surface_cool, null, 0);\n          drawImage(page, logo, rightX + 12, heroY + 18, Math.min(logo.width, rightWidth - 24), 16);\n        }\n    \n        if(cover.product){\n          var productCardTop = heroY + 50;\n          var productCardHeight = 154;\n          var stageTop = productCardTop + 28;\n    \n          drawRect(page, rightX, productCardTop, rightWidth, productCardHeight, \"#FFFFFF\", theme.line_strong, 0.8);\n          drawRect(page, rightX, productCardTop, rightWidth, 7, theme.surface_cool, null, 0);\n          drawRect(page, rightX + 10, stageTop, rightWidth - 20, 82, \"#F8FBFC\", null, 0);\n          drawTextLine(page, cover.product.label || \"\", rightX + 10, productCardTop + 12, 8.2, \"F2\", theme.primary);\n          if(productImage){\n            drawContainedImage(page, productImage, rightX + 12, stageTop + 4, rightWidth - 24, 74, 1);\n          }\n          drawTextLines(page, wrapText(cover.product.title || \"\", rightWidth - 18, 9.8, true), rightX + 9, productCardTop + 118, 9.8, \"F2\", theme.text, 11);\n          if(cover.product.caption){\n            drawTextLines(page, wrapText(cover.product.caption, rightWidth - 18, 7.8, false), rightX + 9, productCardTop + 131, 7.8, \"F1\", theme.muted, 9);\n          }\n          productCardBottom = productCardTop + productCardHeight;\n        }\n    \n        if(cover.advisor){\n          var advisorNoteLines = cover.advisor.note ? wrapText(cover.advisor.note, rightWidth - 20, 8.2, false) : [];\n          var advisorTop = productCardBottom ? productCardBottom + 14 : heroY + 212;\n          var advisorHeight = 54 + (advisorNoteLines.length ? (advisorNoteLines.length * 10) + 8 : 0);\n          drawRect(page, rightX, advisorTop, rightWidth, advisorHeight, \"#F2F7F9\", theme.line_soft, 0.8);\n          drawRect(page, rightX, advisorTop, rightWidth, 6, theme.surface_warm, null, 0);\n          if(advisorImage){\n            drawRect(page, rightX + 10, advisorTop + 10, 34, 34, \"#FFFFFF\", \"#DCE5EA\", 0.6);\n            drawImage(page, advisorImage, rightX + 12, advisorTop + 12, 30, 30);\n          }\n          drawTextLine(page, cover.advisor.label || \"\", rightX + 50, advisorTop + 12, 8.1, \"F2\", theme.primary);\n          drawTextLine(page, cover.advisor.name || \"\", rightX + 50, advisorTop + 25, 10.2, \"F2\", theme.text);\n          drawTextLines(page, wrapText(cover.advisor.role || \"\", rightWidth - 60, 8.2, false), rightX + 50, advisorTop + 37, 8.2, \"F1\", theme.muted, 9);\n          if(advisorNoteLines.length){\n            drawLine(page, rightX + 10, advisorTop + 51, rightX + rightWidth - 10, advisorTop + 51, theme.line_soft, 0.7);\n            drawTextLines(page, advisorNoteLines, rightX + 10, advisorTop + 58, 8.2, \"F1\", theme.text, 10);\n          }\n          advisorBottom = advisorTop + advisorHeight;\n        }\n    \n        return Math.max(heroY + heroHeight, statsBottom, productCardBottom, advisorBottom) + 28;\n      }\n    \n      function renderContinuationHeader(doc, page){\n        var theme = doc.theme;\n        var brandText = (doc.spec.branding && doc.spec.branding.brand_name) || \"EdgeVend\";\n        drawRect(page, PAGE.marginX, 8, 62, 6, theme.surface_cool, null, 0);\n        drawRect(page, PAGE.marginX + 66, 8, 52, 6, theme.surface_warm, null, 0);\n        drawLine(page, PAGE.marginX, 26, PAGE.width - PAGE.marginX, 26, theme.line, 0.85);\n        drawTextLine(page, brandText, PAGE.marginX, 10, 8.8, \"F2\", theme.muted);\n        drawTextLine(page, doc.spec.title || \"\", PAGE.width - PAGE.marginX - 220, 10, 8.8, \"F1\", theme.muted, \"right\", 220);\n      }\n    \n      function renderSectionIntro(doc, state, section){\n        var theme = doc.theme;\n        var tone = getSectionTone(theme, section && section.variant);\n        var contentWidth = PAGE.width - (PAGE.marginX * 2);\n        var titleFontSize = section && section.variant === \"summary\" ? 17.2 : 15.2;\n        var titleLineHeight = section && section.variant === \"summary\" ? 20 : 18;\n        var titleLines = wrapText(section.title || \"\", contentWidth - 30, titleFontSize, true);\n        var summaryLines = section.summary ? wrapText(section.summary, contentWidth - 58, section && section.variant === \"summary\" ? 11.1 : 10.4, false) : [];\n        var summaryBoxHeight = summaryLines.length ? 14 + (summaryLines.length * 14) + 14 : 0;\n        var headerHeight = 22 + (titleLines.length * titleLineHeight) + (summaryBoxHeight ? (12 + summaryBoxHeight) : 0) + 16;\n        var idx;\n    \n        ensureSpace(doc, state, headerHeight + 30);\n        drawRect(state.page, PAGE.marginX, state.cursorY, contentWidth, headerHeight, tone.fill, tone.border, 0.9);\n        drawRect(state.page, PAGE.marginX, state.cursorY, contentWidth, 8, tone.bandLeft, null, 0);\n        drawRect(state.page, PAGE.marginX + (contentWidth * 0.38), state.cursorY, contentWidth * 0.24, 8, tone.bandRight, null, 0);\n        drawRect(state.page, PAGE.marginX, state.cursorY, 6, headerHeight, tone.accent, null, 0);\n        drawTextLines(state.page, titleLines, PAGE.marginX + 18, state.cursorY + 18, titleFontSize, \"F2\", theme.text, titleLineHeight);\n        if(summaryLines.length && summaryLines[0]){\n          var summaryTop = state.cursorY + 18 + (titleLines.length * titleLineHeight) + 12;\n          drawRect(state.page, PAGE.marginX + 18, summaryTop, contentWidth - 36, summaryBoxHeight, tone.summaryFill, tone.summaryBorder, 0.7);\n          drawTextLines(state.page, summaryLines, PAGE.marginX + 30, summaryTop + 14, section && section.variant === \"summary\" ? 11.1 : 10.4, \"F1\", section && section.variant === \"summary\" ? theme.text : theme.muted, 14);\n        }\n        state.cursorY += headerHeight + 14;\n        state._sectionRowAlt = false;\n        return tone;\n      }\n    \n      function renderSummaryVariantBody(doc, state, section){\n        var theme = doc.theme;\n        var contentWidth = PAGE.width - (PAGE.marginX * 2);\n        var gap = 12;\n        var rightWidth = 184;\n        var leftWidth = contentWidth - rightWidth - gap;\n        var decision = section && section.decision || {};\n        var guidance = decision.guidance || {};\n        var tool = decision.tool || {};\n        var advisor = decision.advisor || {};\n        var guidanceEyebrow = guidance.eyebrow ? wrapText(String(guidance.eyebrow).toUpperCase(), leftWidth - 28, 8.4, false) : [];\n        var guidanceTitle = guidance.title ? wrapText(guidance.title, leftWidth - 28, 13.8, true) : [];\n        var guidanceText = guidance.text ? wrapText(guidance.text, leftWidth - 28, 10.7, false) : [];\n        var toolLabel = tool.label ? wrapText(String(tool.label).toUpperCase(), rightWidth - 22, 8.1, false) : [];\n        var toolTitle = tool.title ? wrapText(tool.title, rightWidth - 22, 10.4, true) : [];\n        var toolMeta = tool.meta ? wrapText(tool.meta, rightWidth - 22, 8, false) : [];\n        var advisorRole = advisor.role ? wrapText(advisor.role, leftWidth - 82, 8.1, false) : [];\n        var productImage = findImage(doc, tool.imageAlias);\n        var advisorImage = findImage(doc, advisor.avatarAlias);\n        var signals = Array.isArray(decision.signals) ? decision.signals.slice(0, 4) : [];\n        var blockTop;\n        var leftHeight = 18 + (guidanceEyebrow.length * 10) + (guidanceTitle.length * 17) + (guidanceText.length * 14) + (advisorImage ? 48 : 22) + 18;\n        var rightHeight = 18 + (toolLabel.length * 10) + 88 + (toolTitle.length * 12) + (toolMeta.length * 10) + (signals.length ? 34 : 0) + 14;\n        var blockHeight = Math.max(leftHeight, rightHeight);\n        var rightX = PAGE.marginX + leftWidth + gap;\n        var signalBottom;\n    \n        ensureSpace(doc, state, blockHeight + 12);\n        blockTop = state.cursorY;\n    \n        drawRect(state.page, PAGE.marginX, blockTop, leftWidth, blockHeight, \"#FFFFFF\", theme.line_soft, 0.75);\n        drawRect(state.page, PAGE.marginX, blockTop, leftWidth, 7, theme.surface_warm, null, 0);\n        drawRect(state.page, PAGE.marginX, blockTop, 5, blockHeight, theme.accent, null, 0);\n        if(guidanceEyebrow.length){\n          drawTextLines(state.page, guidanceEyebrow, PAGE.marginX + 16, blockTop + 14, 8.4, \"F2\", theme.accent, 10);\n        }\n        if(guidanceTitle.length){\n          drawTextLines(state.page, guidanceTitle, PAGE.marginX + 16, blockTop + 18 + (guidanceEyebrow.length * 10), 13.8, \"F2\", theme.text, 17);\n        }\n        if(guidanceText.length){\n          drawTextLines(state.page, guidanceText, PAGE.marginX + 16, blockTop + 22 + (guidanceEyebrow.length * 10) + (guidanceTitle.length * 17), 10.7, \"F1\", theme.text, 14);\n        }\n        if(advisorImage){\n          drawRect(state.page, PAGE.marginX + 16, blockTop + blockHeight - 50, 34, 34, \"#FFFFFF\", theme.line_soft, 0.6);\n          drawImage(state.page, advisorImage, PAGE.marginX + 18, blockTop + blockHeight - 48, 30, 30);\n          drawTextLine(state.page, advisor.name || \"\", PAGE.marginX + 58, blockTop + blockHeight - 45, 9.5, \"F2\", theme.text);\n          if(advisorRole.length){\n            drawTextLines(state.page, advisorRole, PAGE.marginX + 58, blockTop + blockHeight - 32, 8.1, \"F1\", theme.muted, 9);\n          }\n        }\n    \n        drawRect(state.page, rightX, blockTop, rightWidth, blockHeight, \"#F8FBFC\", theme.line_soft, 0.75);\n        drawRect(state.page, rightX, blockTop, rightWidth, 7, theme.surface_cool, null, 0);\n        drawRect(state.page, rightX, blockTop, 5, blockHeight, theme.primary, null, 0);\n        if(toolLabel.length){\n          drawTextLines(state.page, toolLabel, rightX + 14, blockTop + 14, 8.1, \"F2\", theme.primary, 10);\n        }\n        drawRect(state.page, rightX + 12, blockTop + 28, rightWidth - 24, 88, \"#FFFFFF\", null, 0);\n        if(productImage){\n          drawContainedImage(state.page, productImage, rightX + 16, blockTop + 34, rightWidth - 32, 76, 1);\n        }\n        if(toolTitle.length){\n          drawTextLines(state.page, toolTitle, rightX + 14, blockTop + 124, 10.4, \"F2\", theme.text, 12);\n        }\n        if(toolMeta.length){\n          drawTextLines(state.page, toolMeta, rightX + 14, blockTop + 138 + (toolTitle.length * 12), 8, \"F1\", theme.muted, 10);\n        }\n        if(signals.length){\n          drawWrappedPills(state.page, signals, rightX + 14, blockTop + blockHeight - 28, rightWidth - 28, {\n            fontSize: 8.1,\n            paddingX: 8,\n            height: 20,\n            fillColor: \"#EAF2F5\",\n            textColor: theme.text\n          });\n        }\n    \n        state.cursorY += blockHeight + 10;\n        if(Array.isArray(decision.snapshot) && decision.snapshot.length){\n          renderStatsGrid(doc, state, { items: decision.snapshot.slice(0, 4), columns: 2, style: \"spotlight\" });\n        }\n        if(Array.isArray(decision.reasons) && decision.reasons.length){\n          renderSubheading(doc, state, decision.reasonsTitle || \"\");\n          renderBullets(doc, state, decision.reasons);\n        }\n      }\n    \n      function renderInputVariantBody(doc, state, section){\n        var board = section && section.board || {};\n        if(Array.isArray(board.spotlight) && board.spotlight.length){\n          renderStatsGrid(doc, state, {\n            items: board.spotlight,\n            columns: Math.min(2, board.spotlight.length),\n            style: \"spotlight\"\n          });\n        }\n        if(Array.isArray(board.entries) && board.entries.length){\n          renderStatsGrid(doc, state, {\n            items: board.entries,\n            columns: 2,\n            style: \"fingerprint\"\n          });\n        }\n      }\n    \n      function renderRecipeVariantBody(doc, state, section){\n        var recipe = section && section.recipe || {};\n        if(recipe.sourceValue || recipe.description){\n          renderCallout(doc, state, {\n            eyebrow: recipe.sourceLabel || \"Data basis\",\n            title: recipe.sourceValue || \"\",\n            text: recipe.description || \"\",\n            tone: \"neutral\"\n          });\n        }\n        if(Array.isArray(recipe.primary) && recipe.primary.length){\n          renderStatsGrid(doc, state, {\n            items: recipe.primary,\n            columns: recipe.primary.length >= 4 ? 4 : Math.max(2, recipe.primary.length),\n            style: \"technical\"\n          });\n        }\n        if(Array.isArray(recipe.machine) && recipe.machine.length){\n          renderStatsGrid(doc, state, {\n            items: recipe.machine,\n            columns: Math.min(3, recipe.machine.length),\n            style: \"technical\"\n          });\n        }\n        if(Array.isArray(recipe.bands) && recipe.bands.length){\n          renderSubheading(doc, state, \"Recommended start values\");\n          renderBullets(doc, state, recipe.bands);\n        }\n      }\n    \n      function renderBundleShowcaseCard(doc, page, x, yTop, width, config){\n        var theme = doc.theme;\n        var titleLines = wrapText(config.title || \"\", width - 22, config.large ? 10.8 : 10.2, true);\n        var metaLines = config.meta ? wrapText(config.meta, width - 22, 8, false) : [];\n        var linkLines = config.link ? wrapText(config.link, width - 22, 7.8, false) : [];\n        var attributes = Array.isArray(config.attributes) ? config.attributes : [];\n        var image = findImage(doc, config.imageAlias);\n        var stageHeight = config.large ? 100 : 78;\n        var height = 26 + stageHeight + (titleLines.length * 12) + (metaLines.length * 10) + (linkLines.length * 9) + (attributes.length * 12) + 24;\n        var attrIndex;\n    \n        drawRect(page, x, yTop, width, height, \"#FFFFFF\", theme.line_soft, 0.75);\n        drawRect(page, x, yTop, width, 7, config.large ? theme.surface_cool : theme.surface_warm, null, 0);\n        drawRect(page, x, yTop, 5, height, config.large ? theme.primary : theme.accent, null, 0);\n        drawTextLine(page, String(config.label || \"\").toUpperCase(), x + 14, yTop + 14, 8.2, \"F2\", config.large ? theme.primary : theme.accent);\n        drawRect(page, x + 12, yTop + 28, width - 24, stageHeight, \"#F8FBFC\", null, 0);\n        if(image){\n          drawContainedImage(page, image, x + 14, yTop + 32, width - 28, stageHeight - 8, config.large ? 1 : 0.62);\n        }\n        if(titleLines.length){\n          drawTextLines(page, titleLines, x + 14, yTop + 38 + stageHeight, config.large ? 10.8 : 10.2, \"F2\", theme.text, 12);\n        }\n        if(metaLines.length){\n          drawTextLines(page, metaLines, x + 14, yTop + 50 + stageHeight + (titleLines.length * 12), 8, \"F1\", theme.muted, 10);\n        }\n        if(linkLines.length){\n          drawTextLines(page, linkLines, x + 14, yTop + 54 + stageHeight + (titleLines.length * 12) + (metaLines.length * 10), 7.8, \"F1\", theme.muted, 9);\n        }\n        for(attrIndex = 0; attrIndex < attributes.length; attrIndex += 1){\n          drawTextLine(page, String(attributes[attrIndex].label || \"\").toUpperCase(), x + 14, yTop + 62 + stageHeight + (titleLines.length * 12) + (metaLines.length * 10) + (linkLines.length * 9) + (attrIndex * 12), 7.8, \"F1\", theme.muted);\n          drawTextLine(page, attributes[attrIndex].value || \"\", x + 72, yTop + 62 + stageHeight + (titleLines.length * 12) + (metaLines.length * 10) + (linkLines.length * 9) + (attrIndex * 12), 8.6, \"F2\", theme.text);\n        }\n        return height;\n      }\n    \n      function renderBundleVariantBody(doc, state, section){\n        var theme = doc.theme;\n        var bundle = section && section.bundle || {};\n        var contentWidth = PAGE.width - (PAGE.marginX * 2);\n        var gap = 12;\n        var leftWidth = 324;\n        var rightWidth = contentWidth - leftWidth - gap;\n        var factsBottom;\n        var leftHeight;\n        var rightHeight;\n        var cardHeight;\n        var estimatedHeight = (bundle.facts && bundle.facts.length ? 34 : 0) + 250 + (bundle.notes && bundle.notes.length ? Math.min(bundle.notes.length, 4) * 28 : 0);\n    \n        ensureSpace(doc, state, estimatedHeight);\n        factsBottom = state.cursorY;\n    \n        if(Array.isArray(bundle.facts) && bundle.facts.length){\n          factsBottom = drawWrappedPills(state.page, bundle.facts, PAGE.marginX, state.cursorY, contentWidth, {\n            fontSize: 8.4,\n            paddingX: 10,\n            height: 20,\n            fillColor: \"#EEF4F7\",\n            textColor: theme.text\n          });\n          state.cursorY = factsBottom + 10;\n        }\n    \n        leftHeight = renderBundleShowcaseCard(doc, state.page, PAGE.marginX, state.cursorY, leftWidth, Object.assign({}, bundle.body || {}, { large: true }));\n        rightHeight = renderBundleShowcaseCard(doc, state.page, PAGE.marginX + leftWidth + gap, state.cursorY, rightWidth, Object.assign({}, bundle.insert || {}, { large: false }));\n        cardHeight = Math.max(leftHeight, rightHeight);\n        state.cursorY += cardHeight + 10;\n    \n        if(Array.isArray(bundle.notes) && bundle.notes.length){\n          renderBullets(doc, state, bundle.notes);\n        }\n      }\n    \n      function renderSection(doc, state, section){\n        var idx;\n        renderSectionIntro(doc, state, section);\n    \n        if(section && section.variant === \"summary\" && section.decision){\n          renderSummaryVariantBody(doc, state, section);\n          state.cursorY += PAGE.sectionGap;\n          return;\n        }\n        if(section && section.variant === \"inputs\" && section.board){\n          renderInputVariantBody(doc, state, section);\n          state.cursorY += PAGE.sectionGap;\n          return;\n        }\n        if(section && section.variant === \"recipe\" && section.recipe){\n          renderRecipeVariantBody(doc, state, section);\n          state.cursorY += PAGE.sectionGap;\n          return;\n        }\n        if(section && section.variant === \"bundle\" && section.bundle){\n          renderBundleVariantBody(doc, state, section);\n          state.cursorY += PAGE.sectionGap;\n          return;\n        }\n    \n        for(idx = 0; idx < (section.items || []).length; idx += 1){\n          renderItem(doc, state, section.items[idx]);\n        }\n    \n        state.cursorY += PAGE.sectionGap;\n      }\n    \n      function renderItem(doc, state, item){\n        if(!item){ return; }\n        if(item.type === \"key_value\"){\n          renderKeyValue(doc, state, item);\n          return;\n        }\n        if(item.type === \"paragraph\"){\n          renderParagraph(doc, state, item.text);\n          return;\n        }\n        if(item.type === \"subheading\"){\n          renderSubheading(doc, state, item.text);\n          return;\n        }\n        if(item.type === \"bullets\"){\n          renderBullets(doc, state, item.items || []);\n          return;\n        }\n        if(item.type === \"callout\"){\n          renderCallout(doc, state, item);\n          return;\n        }\n        if(item.type === \"stats_grid\"){\n          renderStatsGrid(doc, state, item);\n        }\n      }\n    \n      function renderKeyValue(doc, state, item){\n        var theme = doc.theme;\n        var contentWidth = PAGE.width - (PAGE.marginX * 2);\n        var labelWidth = 154;\n        var gap = 14;\n        var valueWidth = contentWidth - labelWidth - gap - 20;\n        var labelLines = wrapText((item.label || \"\").toUpperCase(), labelWidth, 8.6, false);\n        var valueLines = wrapText(item.value || \"\", valueWidth, 11.8, true);\n        var rowHeight = 14 + Math.max(labelLines.length * 11, valueLines.length * 15) + 14;\n        var fill = state && state._sectionRowAlt ? theme.surface : theme.surface_alt;\n        var labelFill = state && state._sectionRowAlt ? theme.surface_cool : theme.surface_warm;\n    \n        ensureSpace(doc, state, rowHeight + 6);\n        drawRect(state.page, PAGE.marginX, state.cursorY, contentWidth, rowHeight, fill, theme.line_soft, 0.65);\n        drawRect(state.page, PAGE.marginX, state.cursorY, labelWidth + 16, rowHeight, labelFill, null, 0);\n        drawRect(state.page, PAGE.marginX, state.cursorY, 4, rowHeight, theme.primary, null, 0);\n        drawTextLines(state.page, labelLines, PAGE.marginX + 12, state.cursorY + 12, 8.6, \"F2\", theme.primary, 11);\n        drawTextLines(state.page, valueLines, PAGE.marginX + labelWidth + gap + 10, state.cursorY + 11, 11.8, \"F2\", theme.text, 15);\n        state.cursorY += rowHeight + 6;\n        state._sectionRowAlt = !state._sectionRowAlt;\n      }\n    \n      function renderParagraph(doc, state, text){\n        var theme = doc.theme;\n        var contentWidth = PAGE.width - (PAGE.marginX * 2);\n        var lines = wrapText(text || \"\", contentWidth - 28, 10.9, false);\n        var height = (lines.length * 15) + 18;\n    \n        ensureSpace(doc, state, height + 6);\n        drawRect(state.page, PAGE.marginX, state.cursorY, contentWidth, height, theme.surface, theme.line_soft, 0.6);\n        drawRect(state.page, PAGE.marginX, state.cursorY, 4, height, theme.accent, null, 0);\n        drawTextLines(state.page, lines, PAGE.marginX + 16, state.cursorY + 10, 10.9, \"F1\", theme.text, 15);\n        state.cursorY += height + 6;\n      }\n    \n      function renderSubheading(doc, state, text){\n        var theme = doc.theme;\n        ensureSpace(doc, state, 24);\n        drawTextLine(state.page, text || \"\", PAGE.marginX, state.cursorY + 4, 10.4, \"F2\", theme.accent);\n        state.cursorY += 20;\n      }\n    \n      function renderBullets(doc, state, bullets){\n        var theme = doc.theme;\n        var idx;\n        var lines;\n        var height;\n        for(idx = 0; idx < bullets.length; idx += 1){\n          lines = wrapText(bullets[idx], PAGE.width - (PAGE.marginX * 2) - 34, 10.6, false);\n          height = (lines.length * 14) + 14;\n          ensureSpace(doc, state, height + 4);\n          drawRect(state.page, PAGE.marginX, state.cursorY, PAGE.width - (PAGE.marginX * 2), height, idx % 2 === 0 ? theme.surface : theme.surface_alt, theme.line_soft, 0.55);\n          drawRect(state.page, PAGE.marginX, state.cursorY, 4, height, idx % 2 === 0 ? theme.accent : theme.primary, null, 0);\n          drawBullet(state.page, PAGE.marginX + 11, state.cursorY + 12, idx % 2 === 0 ? theme.accent : theme.primary);\n          drawTextLines(state.page, lines, PAGE.marginX + 24, state.cursorY + 8, 10.6, \"F1\", theme.text, 14);\n          state.cursorY += height + 4;\n        }\n      }\n    \n      function renderCallout(doc, state, item){\n        var theme = doc.theme;\n        var tone = getCalloutTone(theme, item && item.tone);\n        var contentWidth = PAGE.width - (PAGE.marginX * 2);\n        var eyebrowLines = item && item.eyebrow ? wrapText(item.eyebrow.toUpperCase(), contentWidth - 28, 8.4, false) : [];\n        var titleLines = item && item.title ? wrapText(item.title, contentWidth - 28, 13.2, true) : [];\n        var textLines = item && item.text ? wrapText(item.text, contentWidth - 28, 10.6, false) : [];\n        var height = 14 + (eyebrowLines.length * 10) + (titleLines.length * 16) + (textLines.length * 14) + 16;\n    \n        ensureSpace(doc, state, height + 6);\n        drawRect(state.page, PAGE.marginX, state.cursorY, contentWidth, height, tone.fill, tone.border, 0.75);\n        drawRect(state.page, PAGE.marginX, state.cursorY, contentWidth, 8, tone.band, null, 0);\n        drawRect(state.page, PAGE.marginX, state.cursorY, 6, height, tone.accent, null, 0);\n        if(eyebrowLines.length){\n          drawTextLines(state.page, eyebrowLines, PAGE.marginX + 16, state.cursorY + 12, 8.4, \"F2\", tone.eyebrow, 10);\n        }\n        if(titleLines.length){\n          drawTextLines(state.page, titleLines, PAGE.marginX + 16, state.cursorY + 16 + (eyebrowLines.length * 10), 13.6, \"F2\", theme.text, 16);\n        }\n        if(textLines.length){\n          drawTextLines(state.page, textLines, PAGE.marginX + 16, state.cursorY + 20 + (eyebrowLines.length * 10) + (titleLines.length * 16), 10.7, \"F1\", tone.text, 14);\n        }\n        state.cursorY += height + 10;\n      }\n    \n      function renderStatsGrid(doc, state, item){\n        var theme = doc.theme;\n        var contentWidth = PAGE.width - (PAGE.marginX * 2);\n        var items = item && Array.isArray(item.items) ? item.items : [];\n        var columns = item && item.columns ? item.columns : 3;\n        var style = item && item.style ? item.style : \"default\";\n        var gap = 10;\n        var cardWidth = (contentWidth - (gap * (columns - 1))) / columns;\n        var index = 0;\n    \n        while(index < items.length){\n          var rowItems = items.slice(index, index + columns);\n          var rowHeight = 0;\n          var measure = rowItems.map(function mapItem(entry){\n            var labelFont = style === \"spotlight\" ? 8.4 : 8.1;\n            var valueFont = style === \"spotlight\"\n              ? (entry.emphasis === \"hero\" ? 13.6 : 12.6)\n              : style === \"technical\"\n                ? (entry.emphasis === \"metric\" ? 12.6 : 11.6)\n                : style === \"fingerprint\"\n                  ? (entry.emphasis === \"metric\" ? 12.8 : 11.6)\n                  : 11.4;\n            var valueWidth = cardWidth - 18;\n            var labelLines = wrapText(String(entry.label || \"\").toUpperCase(), cardWidth - 16, labelFont, false);\n            var valueLines = wrapText(entry.value || \"\", valueWidth, valueFont, true);\n            var noteLines = entry.note ? wrapText(entry.note, cardWidth - 16, 8.3, false) : [];\n            var boxHeight = 12 + (labelLines.length * (style === \"spotlight\" ? 11 : 10)) + (valueLines.length * (style === \"spotlight\" ? 15 : 13)) + (noteLines.length ? (6 + (noteLines.length * 9)) : 0) + 10;\n            if(style === \"spotlight\"){ boxHeight = Math.max(boxHeight, 68); }\n            if(style === \"fingerprint\"){ boxHeight = Math.max(boxHeight, 60); }\n            if(style === \"technical\"){ boxHeight = Math.max(boxHeight, 58); }\n            rowHeight = Math.max(rowHeight, boxHeight);\n            return {\n              labelLines: labelLines,\n              valueLines: valueLines,\n              noteLines: noteLines,\n              boxHeight: boxHeight,\n              labelFont: labelFont,\n              valueFont: valueFont\n            };\n          });\n          var rowIndex;\n    \n          ensureSpace(doc, state, rowHeight + 10);\n          for(rowIndex = 0; rowIndex < rowItems.length; rowIndex += 1){\n            var cardX = PAGE.marginX + (rowIndex * (cardWidth + gap));\n            var entry = rowItems[rowIndex];\n            var topFill = entry.tone === \"warm\" ? theme.surface_warm : theme.surface_cool;\n            var fill = style === \"spotlight\"\n              ? (entry.tone === \"warm\" ? \"#FFF8F1\" : \"#F7FBFC\")\n              : style === \"technical\"\n                ? (entry.tone === \"warm\" ? \"#FFF9F2\" : \"#FCFDFC\")\n                : rowIndex % 2 === 0 ? theme.surface : theme.surface_alt;\n            var accent = entry.tone === \"warm\" ? theme.accent : rowIndex === 0 ? theme.accent : theme.primary;\n            drawRect(state.page, cardX, state.cursorY, cardWidth, rowHeight, fill, theme.line_soft, 0.6);\n            drawRect(state.page, cardX, state.cursorY, cardWidth, 6, topFill, null, 0);\n            drawRect(state.page, cardX, state.cursorY, 4, rowHeight, accent, null, 0);\n            drawTextLines(state.page, measure[rowIndex].labelLines, cardX + 10, state.cursorY + 12, measure[rowIndex].labelFont, \"F1\", theme.muted, style === \"spotlight\" ? 11 : 10);\n            drawTextLines(state.page, measure[rowIndex].valueLines, cardX + 10, state.cursorY + 27, measure[rowIndex].valueFont, \"F2\", theme.text, style === \"spotlight\" ? 15 : 13);\n            if(measure[rowIndex].noteLines.length){\n              drawTextLines(state.page, measure[rowIndex].noteLines, cardX + 10, state.cursorY + 31 + (measure[rowIndex].valueLines.length * (style === \"spotlight\" ? 15 : 13)), 8.3, \"F1\", theme.muted, 9);\n            }\n          }\n          state.cursorY += rowHeight + 10;\n          index += columns;\n        }\n      }\n    \n      function appendFooters(doc){\n        var theme = doc.theme;\n        var total = doc.pages.length;\n        var idx;\n        var label;\n        for(idx = 0; idx < total; idx += 1){\n          drawLine(doc.pages[idx], PAGE.marginX, PAGE.height - 34, PAGE.width - PAGE.marginX, PAGE.height - 34, theme.line, 0.75);\n          label = ((doc.spec.branding || {}).brand_name || \"EdgeVend\") + \" | \" + (doc.spec.title || \"\");\n          drawTextLine(doc.pages[idx], label, PAGE.marginX, PAGE.height - 26, 8.5, \"F1\", theme.muted);\n          drawTextLine(doc.pages[idx], String(idx + 1) + \" / \" + String(total), PAGE.width - PAGE.marginX - 40, PAGE.height - 26, 8.5, \"F1\", theme.muted, \"right\", 40);\n        }\n      }\n    \n      function joinChunks(parts){\n        var total = 0;\n        var idx;\n        var out;\n        var offset = 0;\n        for(idx = 0; idx < parts.length; idx += 1){\n          total += parts[idx].length;\n        }\n        out = new Uint8Array(total);\n        for(idx = 0; idx < parts.length; idx += 1){\n          out.set(parts[idx], offset);\n          offset += parts[idx].length;\n        }\n        return out;\n      }\n    \n      function streamObject(dict, bodyBytes){\n        var header = encodeAscii(\"<< \" + dict + \" /Length \" + bodyBytes.length + \" >>\\nstream\\n\");\n        var footer = encodeAscii(\"\\nendstream\");\n        return [header, bodyBytes, footer];\n      }\n    \n      function buildPdfBytes(doc){\n        var objects = [null];\n        var offsets = [];\n        var chunks = [];\n        var header = new Uint8Array([37, 80, 68, 70, 45, 49, 46, 52, 10, 37, 226, 227, 207, 211, 10]);\n        var catalogId;\n        var pagesId;\n        var fontRegularId;\n        var fontBoldId;\n        var idx;\n        var imageIds = {};\n        var pageIds = [];\n        var contentIds = [];\n        var offset = 0;\n        var xrefParts;\n        var trailer;\n    \n        function reserveObject(){\n          objects.push(null);\n          return objects.length - 1;\n        }\n    \n        function setObject(id, value){\n          objects[id] = value;\n        }\n    \n        function chunkLength(value){\n          if(value == null){ return 0; }\n          if(value instanceof Uint8Array){ return value.length; }\n          return joinChunks(value).length;\n        }\n    \n        catalogId = reserveObject();\n        pagesId = reserveObject();\n        fontRegularId = reserveObject();\n        fontBoldId = reserveObject();\n    \n        setObject(fontRegularId, encodeAscii(\"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >>\"));\n        setObject(fontBoldId, encodeAscii(\"<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >>\"));\n    \n        for(idx = 0; idx < doc.images.length; idx += 1){\n          imageIds[doc.images[idx].alias] = reserveObject();\n          setObject(imageIds[doc.images[idx].alias], streamObject(\"/Type /XObject /Subtype /Image /Width \" + doc.images[idx].width + \" /Height \" + doc.images[idx].height + \" /ColorSpace /DeviceRGB /BitsPerComponent 8 /Filter /DCTDecode\", doc.images[idx].bytes));\n        }\n    \n        for(idx = 0; idx < doc.pages.length; idx += 1){\n          contentIds[idx] = reserveObject();\n          pageIds[idx] = reserveObject();\n          setObject(contentIds[idx], streamObject(\"\", encodeAscii(doc.pages[idx].ops.join(\"\"))));\n        }\n    \n        for(idx = 0; idx < doc.pages.length; idx += 1){\n          var xObjectEntries = [];\n          var imageAlias;\n          var resources;\n          for(imageAlias in doc.pages[idx].xobjects){\n            if(Object.prototype.hasOwnProperty.call(doc.pages[idx].xobjects, imageAlias)){\n              xObjectEntries.push(\"/\" + doc.pages[idx].xobjects[imageAlias].resourceName + \" \" + imageIds[imageAlias] + \" 0 R\");\n            }\n          }\n          resources = \"<< /Font << /F1 \" + fontRegularId + \" 0 R /F2 \" + fontBoldId + \" 0 R >>\";\n          if(xObjectEntries.length){\n            resources += \" /XObject << \" + xObjectEntries.join(\" \") + \" >>\";\n          }\n          resources += \" >>\";\n          setObject(pageIds[idx], encodeAscii(\"<< /Type /Page /Parent \" + pagesId + \" 0 R /MediaBox [0 0 \" + trimNumber(PAGE.width) + \" \" + trimNumber(PAGE.height) + \"] /Resources \" + resources + \" /Contents \" + contentIds[idx] + \" 0 R >>\"));\n        }\n    \n        setObject(pagesId, encodeAscii(\"<< /Type /Pages /Count \" + doc.pages.length + \" /Kids [\" + pageIds.map(function(id){ return id + \" 0 R\"; }).join(\" \") + \"] >>\"));\n        setObject(catalogId, encodeAscii(\"<< /Type /Catalog /Pages \" + pagesId + \" 0 R >>\"));\n    \n        chunks.push(header);\n        offset += header.length;\n    \n        for(idx = 1; idx < objects.length; idx += 1){\n          var prefix = encodeAscii(idx + \" 0 obj\\n\");\n          var suffix = encodeAscii(\"\\nendobj\\n\");\n          var body = objects[idx] instanceof Uint8Array ? [objects[idx]] : objects[idx];\n          offsets[idx] = offset;\n          chunks.push(prefix);\n          offset += prefix.length;\n          Array.prototype.forEach.call(body, function(part){\n            chunks.push(part);\n            offset += part.length;\n          });\n          chunks.push(suffix);\n          offset += suffix.length;\n        }\n    \n        xrefParts = [\"xref\\n0 \" + objects.length + \"\\n\", \"0000000000 65535 f \\n\"];\n        for(idx = 1; idx < objects.length; idx += 1){\n          xrefParts.push(String(offsets[idx]).padStart(10, \"0\") + \" 00000 n \\n\");\n        }\n        trailer = \"trailer\\n<< /Size \" + objects.length + \" /Root \" + catalogId + \" 0 R >>\\nstartxref\\n\" + offset + \"\\n%%EOF\";\n        chunks.push(encodeAscii(xrefParts.join(\"\")));\n        chunks.push(encodeAscii(trailer));\n        return joinChunks(chunks);\n      }\n    \n      function buildPdf(spec){\n        var doc = buildDoc(spec);\n        return new Blob([buildPdfBytes(doc)], { type: \"application/pdf\" });\n      }\n    \n      function download(spec, filename){\n        var blob = buildPdf(spec);\n        var url = window.URL.createObjectURL(blob);\n        var link = document.createElement(\"a\");\n        link.href = url;\n        link.download = filename || \"edgevend-report.pdf\";\n        document.body.appendChild(link);\n        link.click();\n        window.setTimeout(function(){\n          window.URL.revokeObjectURL(url);\n          if(link.parentNode){\n            link.parentNode.removeChild(link);\n          }\n        }, 0);\n        return blob;\n      }\n    \n      window.EdgeVendSimplePdf = {\n        buildPdf: buildPdf,\n        download: download\n      };\n    })(window);\n  },\n  \"presentation/i18n.js\": function (exports, module, __bundle) {\n    function getOwn(source, key) {\n      return source && Object.prototype.hasOwnProperty.call(source, key) ? source[key] : null;\n    }\n    \n    function getPath(source, path) {\n      var current = source;\n      var segments = Array.isArray(path) ? path : String(path || \"\").split(\".\").filter(Boolean);\n      var index;\n    \n      for (index = 0; index < segments.length; index += 1) {\n        if (!current || typeof current !== \"object\" || !Object.prototype.hasOwnProperty.call(current, segments[index])) {\n          return null;\n        }\n        current = current[segments[index]];\n      }\n    \n      return current;\n    }\n    \n    function formatTemplate(template, replacements) {\n      return String(template == null ? \"\" : template).replace(/\\{\\{\\s*([A-Za-z0-9_]+)\\s*\\}\\}/g, function replaceToken(match, token) {\n        return replacements && getOwn(replacements, token) != null ? String(replacements[token]) : \"\";\n      });\n    }\n    \n    function normalizeText(value) {\n      return String(value == null ? \"\" : value).replace(/\\s+/g, \" \").trim();\n    }\n    \n    function normalizeLocale(value) {\n      var normalized = normalizeText(value).toLowerCase();\n      if (!normalized) return \"\";\n      return normalized.split(/[-_]/)[0];\n    }\n    \n    var runtimeI18n = {};\n    \n    function isTranslationMissingToken(value) {\n      return /^translation missing:\\s*[a-z0-9_-]+\\./i.test(normalizeText(value));\n    }\n    \n    function hasTextValue(value) {\n      var normalized = normalizeText(value);\n      return normalized !== \"\" && !isTranslationMissingToken(normalized);\n    }\n    \n    function toTextOrNull(value) {\n      return hasTextValue(value) ? String(value) : null;\n    }\n    \n    function logI18nDiagnostic(kind, payload) {\n      return;\n    }\n    \n    function getCurrentLocale() {\n      return normalizeLocale(getPath(runtimeI18n, \"__locale\") || getPath(runtimeI18n, \"locale\")) || getSourceLocale();\n    }\n    \n    function getSourceLocale() {\n      return normalizeLocale(getPath(runtimeI18n, \"__sourceLocale\")) || \"en\";\n    }\n    \n    function isNonSourceLocaleActive() {\n      return getCurrentLocale() !== getSourceLocale();\n    }\n    \n    function buildResolutionPayload(logicalPath, localeValue, metaobjectValue, winningSource, reason) {\n      return {\n        logicalPath: logicalPath || null,\n        currentLocale: getCurrentLocale(),\n        localeValuePresent: hasTextValue(localeValue),\n        metaobjectValuePresent: hasTextValue(metaobjectValue),\n        winningSource: winningSource,\n        reason: reason,\n      };\n    }\n    \n    function logResolution(logicalPath, localeValue, metaobjectValue, winningSource, reason) {\n      logI18nDiagnostic(\"resolution\", buildResolutionPayload(logicalPath, localeValue, metaobjectValue, winningSource, reason));\n    }\n    \n    function matchesText(left, right) {\n      var normalizedLeft = normalizeText(left);\n      var normalizedRight = normalizeText(right);\n      if (!normalizedLeft || !normalizedRight) return false;\n      return normalizedLeft === normalizedRight;\n    }\n    \n    function getMetaobjectPaths() {\n      var value = getPath(runtimeI18n, \"metaobject.paths\");\n      return value && typeof value === \"object\" ? value : null;\n    }\n    \n    function getMetaobjectExactIndexes() {\n      var value = getPath(runtimeI18n, \"metaobject.exact_indexes\");\n      return value && typeof value === \"object\" ? value : null;\n    }\n    \n    function getMetaobjectRuntimeOverrides() {\n      var value = getPath(runtimeI18n, \"metaobject.runtime_overrides\");\n      return value && typeof value === \"object\" ? value : null;\n    }\n    \n    function getMetaobjectSourceTextValues() {\n      var value = getPath(runtimeI18n, \"metaobject.source_text_values\");\n      return value && typeof value === \"object\" ? value : null;\n    }\n    \n    function ensureObjectBranch(target, key) {\n      var current = target && Object.prototype.hasOwnProperty.call(target, key) ? target[key] : null;\n      if (!current || typeof current !== \"object\") {\n        target[key] = {};\n        return target[key];\n      }\n      return current;\n    }\n    \n    function setPathIfMissing(target, path, value) {\n      var segments = Array.isArray(path) ? path : String(path || \"\").split(\".\").filter(Boolean);\n      var current = target;\n      var index;\n      var key;\n    \n      if (!target || !segments.length || !hasTextValue(value)) return;\n      for (index = 0; index < segments.length - 1; index += 1) {\n        key = segments[index];\n        current = ensureObjectBranch(current, key);\n      }\n      key = segments[segments.length - 1];\n      if (!hasTextValue(current[key])) {\n        current[key] = String(value);\n      }\n    }\n    \n    function hydrateDirectMetaobjectRuntimeTrees(target) {\n      var paths = target && target.metaobject && target.metaobject.paths;\n      var questionPrefix = \"sections.edgevend_tool_finder.questions.\";\n      var processPrefix = \"sections.edgevend_tool_finder.processes.\";\n    \n      if (!paths || typeof paths !== \"object\") return target;\n    \n      Object.keys(paths).forEach(function eachLogicalPath(logicalPath) {\n        var textValue = toTextOrNull(paths[logicalPath]);\n        if (!textValue) return;\n        if (logicalPath.indexOf(questionPrefix) === 0) {\n          setPathIfMissing(target, logicalPath.slice(\"sections.edgevend_tool_finder.\".length), textValue);\n          return;\n        }\n        if (logicalPath.indexOf(processPrefix) === 0) {\n          setPathIfMissing(target, logicalPath.slice(\"sections.edgevend_tool_finder.\".length), textValue);\n        }\n      });\n    \n      return target;\n    }\n    \n    function normalizeLogicalPath(path) {\n      var normalized = String(path == null ? \"\" : path).trim();\n      if (!normalized) return \"\";\n      if (normalized.indexOf(\"sections.edgevend_tool_finder.\") === 0) {\n        return normalized;\n      }\n      if (normalized.indexOf(\"questions.\") === 0 || normalized.indexOf(\"processes.\") === 0) {\n        return \"sections.edgevend_tool_finder.\" + normalized;\n      }\n      return \"sections.edgevend_tool_finder.runtime.\" + normalized;\n    }\n    \n    function isMetaobjectRuntimePathMigrated(logicalPath) {\n      var runtimeOverrides;\n    \n      if (!logicalPath) return false;\n      if (logicalPath.indexOf(\"sections.edgevend_tool_finder.runtime.patterns.\") === 0) {\n        return true;\n      }\n      if (logicalPath.indexOf(\"sections.edgevend_tool_finder.runtime.validation.\") === 0) {\n        return true;\n      }\n      if (logicalPath.indexOf(\"sections.edgevend_tool_finder.questions.\") === 0) {\n        return true;\n      }\n      if (logicalPath.indexOf(\"sections.edgevend_tool_finder.processes.\") === 0) {\n        return true;\n      }\n      runtimeOverrides = getMetaobjectRuntimeOverrides();\n      return !!(runtimeOverrides && Object.prototype.hasOwnProperty.call(runtimeOverrides, logicalPath));\n    }\n    \n    function getMetaobjectPathValue(logicalPath) {\n      var paths = getMetaobjectPaths();\n      var rawValue;\n    \n      if (!paths || !logicalPath) return null;\n      if (!Object.prototype.hasOwnProperty.call(paths, logicalPath)) return null;\n      rawValue = paths[logicalPath];\n      if (isTranslationMissingToken(rawValue)) {\n        logI18nDiagnostic(\"logicalPath found, but value is translation-missing sentinel\", {\n          source: \"metaobject.paths\",\n          logicalPath: logicalPath,\n          currentLocale: getCurrentLocale(),\n          value: rawValue,\n          reason: \"translation_missing_rejected\",\n        });\n      } else if (rawValue != null && !hasTextValue(rawValue)) {\n        logI18nDiagnostic(\"logicalPath found, but value is empty\", {\n          source: \"metaobject.paths\",\n          logicalPath: logicalPath,\n          currentLocale: getCurrentLocale(),\n          value: rawValue,\n          reason: \"empty_value_rejected\",\n        });\n      }\n      return toTextOrNull(rawValue);\n    }\n    \n    function translateMetaobjectRuntimePath(path) {\n      var logicalPath = normalizeLogicalPath(path);\n    \n      if (!isMetaobjectRuntimePathMigrated(logicalPath)) return null;\n      return getMetaobjectPathValue(logicalPath);\n    }\n    \n    function getMetaobjectExactPath(text) {\n      var exactIndexes = getMetaobjectExactIndexes();\n      var generatedIndex = exactIndexes && exactIndexes.generated_dictionary;\n      var dictionaryIndex = exactIndexes && exactIndexes.dictionary;\n    \n      if (!text || !exactIndexes) return null;\n      if (generatedIndex && Object.prototype.hasOwnProperty.call(generatedIndex, text)) {\n        return generatedIndex[text];\n      }\n      if (dictionaryIndex && Object.prototype.hasOwnProperty.call(dictionaryIndex, text)) {\n        return dictionaryIndex[text];\n      }\n      return null;\n    }\n    \n    function translateMetaobjectExactText(text) {\n      var logicalPath = getMetaobjectExactPath(text);\n      if (!logicalPath) return null;\n      return getMetaobjectPathValue(logicalPath);\n    }\n    \n    function translateMetaobjectSourceText(text) {\n      var sourceTextValues = getMetaobjectSourceTextValues();\n      var rawValue;\n      var resolvedValue = null;\n      var index;\n    \n      if (!sourceTextValues || !text) return null;\n      if (!Object.prototype.hasOwnProperty.call(sourceTextValues, text)) return null;\n      rawValue = sourceTextValues[text];\n      if (Array.isArray(rawValue)) {\n        for (index = 0; index < rawValue.length; index += 1) {\n          if (typeof rawValue[index] !== \"string\") continue;\n          if (rawValue[index].indexOf(\"sections.edgevend_tool_finder.\") === 0) {\n            resolvedValue = getMetaobjectPathValue(rawValue[index]);\n          } else {\n            resolvedValue = toTextOrNull(rawValue[index]);\n          }\n          if (hasTextValue(resolvedValue)) return resolvedValue;\n        }\n        return null;\n      }\n      if (typeof rawValue === \"string\" && rawValue.indexOf(\"sections.edgevend_tool_finder.\") === 0) {\n        return getMetaobjectPathValue(rawValue);\n      }\n      return toTextOrNull(rawValue);\n    }\n    \n    function setRuntimeI18n(value) {\n      runtimeI18n = value && typeof value === \"object\" ? value : {};\n      hydrateDirectMetaobjectRuntimeTrees(runtimeI18n);\n    }\n    \n    function getRuntimeI18n() {\n      return runtimeI18n;\n    }\n    \n    function shouldUseMetaobjectRuntimeOverride(logicalPath, localeValue, metaobjectValue, fallback) {\n      if (!hasTextValue(metaobjectValue)) return false;\n      if (!hasTextValue(localeValue)) return true;\n      if (!isNonSourceLocaleActive()) return true;\n      if (matchesText(metaobjectValue, localeValue)) return false;\n      if (isProbablyWrongLocale(metaobjectValue, getCurrentLocale(), logicalPath, localeValue, fallback)) return false;\n      return matchesText(localeValue, fallback);\n    }\n    \n    function t(path, fallback, replacements) {\n      var logicalPath = normalizeLogicalPath(path);\n      var localeValue = toTextOrNull(getPath(runtimeI18n, path));\n      var metaobjectValue = translateMetaobjectRuntimePath(path);\n      var runtimeValue;\n      var resolved = null;\n      var reason = null;\n      var winningSource = null;\n    \n      runtimeValue = getPath(runtimeI18n, path);\n      if (isTranslationMissingToken(runtimeValue)) {\n        logI18nDiagnostic(\"logicalPath found, but value is translation-missing sentinel\", {\n          source: \"runtime\",\n          logicalPath: logicalPath,\n          currentLocale: getCurrentLocale(),\n          value: runtimeValue,\n          reason: \"translation_missing_rejected\",\n        });\n      } else if (runtimeValue != null && !hasTextValue(runtimeValue)) {\n        logI18nDiagnostic(\"logicalPath found, but value is empty\", {\n          source: \"runtime\",\n          logicalPath: logicalPath,\n          currentLocale: getCurrentLocale(),\n          value: runtimeValue,\n          reason: \"empty_value_rejected\",\n        });\n      }\n    \n      if (hasTextValue(localeValue) && isNonSourceLocaleActive()) {\n        if (shouldUseMetaobjectRuntimeOverride(logicalPath, localeValue, metaobjectValue, fallback)) {\n          resolved = metaobjectValue;\n          winningSource = \"metaobject\";\n          reason = \"metaobject_override_used\";\n          logResolution(logicalPath, localeValue, metaobjectValue, winningSource, reason);\n          return formatTemplate(resolved == null ? \"\" : resolved, replacements || null);\n        }\n        resolved = localeValue;\n        winningSource = \"locale\";\n        reason = hasTextValue(metaobjectValue) ? \"locale_preferred_for_runtime_copy\" : \"locale_value_used\";\n        if (hasTextValue(metaobjectValue)) {\n          logResolution(logicalPath, localeValue, metaobjectValue, winningSource, reason);\n        }\n      } else if (hasTextValue(metaobjectValue)) {\n        resolved = metaobjectValue;\n        winningSource = \"metaobject\";\n        reason = \"metaobject_override_used\";\n        logResolution(logicalPath, localeValue, metaobjectValue, winningSource, reason);\n      } else if (hasTextValue(localeValue)) {\n        resolved = localeValue;\n        winningSource = \"locale\";\n        reason = \"locale_value_used\";\n      } else {\n        resolved = fallback;\n        winningSource = \"fallback\";\n        reason = \"runtime_fallback_used\";\n        logI18nDiagnostic(\"runtime fallback used because locale/metaobject value missing\", {\n          logicalPath: logicalPath,\n          currentLocale: getCurrentLocale(),\n          localeValuePresent: hasTextValue(localeValue),\n          metaobjectValuePresent: hasTextValue(metaobjectValue),\n          winningSource: winningSource,\n          reason: reason,\n          fallback: fallback,\n        });\n      }\n      return formatTemplate(resolved == null ? \"\" : resolved, replacements || null);\n    }\n    \n    function isProbablyWrongLocale(value, currentLocale, logicalPath, localeValue, sourceText) {\n      var normalizedCurrentLocale = normalizeLocale(currentLocale);\n      var normalizedSourceLocale = getSourceLocale();\n      var normalizedValue = normalizeText(value);\n      var normalizedLocaleValue = normalizeText(localeValue);\n      var normalizedSourceText = normalizeText(sourceText);\n    \n      if (!normalizedCurrentLocale || normalizedCurrentLocale === normalizedSourceLocale) return false;\n      if (!hasTextValue(localeValue)) return false;\n      if (!normalizedValue) return false;\n      if (normalizedValue === normalizedLocaleValue) return false;\n      return normalizedValue === normalizedSourceText;\n    }\n    \n    function translateExactText(text) {\n      var dictionary = getPath(runtimeI18n, \"dictionary\");\n      var generatedDictionary = getPath(runtimeI18n, \"generated_dictionary\");\n      var logicalPath = getMetaobjectExactPath(text);\n      var metaobjectExact = translateMetaobjectExactText(text);\n      var rawDictionaryValue = dictionary && Object.prototype.hasOwnProperty.call(dictionary, text)\n        ? dictionary[text]\n        : null;\n      var rawGeneratedDictionaryValue = generatedDictionary && Object.prototype.hasOwnProperty.call(generatedDictionary, text)\n        ? generatedDictionary[text]\n        : null;\n      var localeDictionaryValue = dictionary && Object.prototype.hasOwnProperty.call(dictionary, text)\n        ? toTextOrNull(rawDictionaryValue)\n        : null;\n      var generatedDictionaryValue = generatedDictionary && Object.prototype.hasOwnProperty.call(generatedDictionary, text)\n        ? toTextOrNull(rawGeneratedDictionaryValue)\n        : null;\n      var localeValue = localeDictionaryValue || generatedDictionaryValue;\n      var currentLocale = getCurrentLocale();\n    \n      if (!text) return text;\n      if (logicalPath && !hasTextValue(metaobjectExact)) {\n        logI18nDiagnostic(\"exact index hit, but resolved text invalid\", {\n          text: text,\n          logicalPath: logicalPath,\n          currentLocale: currentLocale,\n          source: \"metaobject.exact_indexes\",\n          winningSource: hasTextValue(localeValue) ? \"locale\" : \"original\",\n          reason: isTranslationMissingToken(metaobjectExact) ? \"translation_missing_rejected\" : \"empty_value_rejected\",\n        });\n      }\n      if (isTranslationMissingToken(rawDictionaryValue)) {\n        logI18nDiagnostic(\"exact index hit, but resolved text invalid\", {\n          text: text,\n          logicalPath: \"dictionary.\" + text,\n          currentLocale: currentLocale,\n          source: \"dictionary\",\n          value: rawDictionaryValue,\n          winningSource: generatedDictionaryValue ? \"locale\" : \"original\",\n          reason: \"translation_missing_rejected\",\n        });\n      }\n      if (isTranslationMissingToken(rawGeneratedDictionaryValue)) {\n        logI18nDiagnostic(\"exact index hit, but resolved text invalid\", {\n          text: text,\n          logicalPath: \"generated_dictionary.\" + text,\n          currentLocale: currentLocale,\n          source: \"generated_dictionary\",\n          value: rawGeneratedDictionaryValue,\n          winningSource: localeDictionaryValue ? \"locale\" : \"original\",\n          reason: \"translation_missing_rejected\",\n        });\n      } else if (rawGeneratedDictionaryValue != null && !hasTextValue(rawGeneratedDictionaryValue)) {\n        logI18nDiagnostic(\"exact index hit, but resolved text invalid\", {\n          text: text,\n          logicalPath: \"generated_dictionary.\" + text,\n          currentLocale: currentLocale,\n          source: \"generated_dictionary\",\n          value: rawGeneratedDictionaryValue,\n          winningSource: localeDictionaryValue ? \"locale\" : \"original\",\n          reason: \"empty_value_rejected\",\n        });\n      }\n      if (hasTextValue(metaobjectExact) && isProbablyWrongLocale(metaobjectExact, currentLocale, logicalPath, localeValue, text)) {\n        logI18nDiagnostic(\"exact index hit, but resolved text invalid\", {\n          text: text,\n          logicalPath: logicalPath,\n          currentLocale: currentLocale,\n          source: \"metaobject.exact_indexes\",\n          localeValuePresent: hasTextValue(localeValue),\n          metaobjectValuePresent: true,\n          winningSource: hasTextValue(localeValue) ? \"locale\" : \"original\",\n          reason: \"locale_preferred_for_runtime_copy\",\n        });\n        metaobjectExact = null;\n      }\n      if (hasTextValue(metaobjectExact)) {\n        logResolution(logicalPath, localeValue, metaobjectExact, \"metaobject\", \"metaobject_override_used\");\n        return String(metaobjectExact);\n      }\n      if (localeDictionaryValue) {\n        logResolution(logicalPath || \"dictionary.\" + text, localeDictionaryValue, metaobjectExact, \"locale\", \"locale_value_used\");\n        return localeDictionaryValue;\n      }\n      if (generatedDictionaryValue) {\n        logResolution(logicalPath || \"generated_dictionary.\" + text, generatedDictionaryValue, metaobjectExact, \"locale\", \"locale_value_used\");\n        return generatedDictionaryValue;\n      }\n      return null;\n    }\n    \n    function buildReplacements(match, keys) {\n      return keys.reduce(function reduceReplacements(replacements, key, index) {\n        replacements[key] = translateText(match[index + 1]);\n        return replacements;\n      }, {});\n    }\n    \n    function translatePatternText(text) {\n      var match = null;\n    \n      match = /^([^:]+):\\s*(.+?)\\s-\\s(.+)$/.exec(text);\n      if (match) {\n        return t(\"patterns.label_value_note\", \"\", buildReplacements(match, [\"label\", \"value\", \"note\"]));\n      }\n    \n      match = /^([^:]+):\\s*(.+)$/.exec(text);\n      if (match) {\n        return t(\"patterns.label_value\", \"\", buildReplacements(match, [\"label\", \"value\"]));\n      }\n    \n      match = /^Best face-milling fit for (.+) and (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.face_milling\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best shoulder-milling fit for (.+) and (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.shoulder_milling\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best slotting fit for (.+) and (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.slotting\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best pocket-milling fit for (.+) and (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.pocket_milling\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best trochoidal-milling fit for (.+) and (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.trochoidal_milling\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best plunge-milling fit for (.+) and (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.plunging\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best copy-milling fit for (.+) and (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.copy_milling\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best helical-interpolation fit for (.+) and (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.helical_interpolation\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best high-feed-milling fit for (.+) with (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.high_feed_milling\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best fit for (.+) Blind-Hole Drilling in (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.drilling_blind\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best fit for (.+) Through-Hole Drilling in (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.drilling_through\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best fit for (.+) - Blind-Hole Thread Forming in (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.forming_blind\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Best fit for (.+) - Through-Hole Thread Forming in (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.summary.forming_through\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Focused troubleshooting loaded for (.+) likely issue paths$/.exec(text);\n      if (match) return t(\"patterns.focused_troubleshooting_count\", \"\", buildReplacements(match, [\"count\"]));\n    \n      match = /^Focused troubleshooting loaded for (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.focused_troubleshooting_titles\", \"\", buildReplacements(match, [\"titles\"]));\n    \n      match = /^Actual pre-drill differs from the candidate recommendation by (.+)\\. Expect load or gauge risk\\.$/.exec(text);\n      if (match) return t(\"patterns.actual_predrill_delta\", \"\", buildReplacements(match, [\"delta\"]));\n    \n      match = /^Previous issue flagged:\\s+(.+)\\. Review the guidance before release\\.$/.exec(text);\n      if (match) return t(\"patterns.previous_issue\", \"\", buildReplacements(match, [\"issue\"]));\n    \n      match = /^Recipe row uses (.+) with (.+) coolant and vc (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.recipe_row\", \"\", buildReplacements(match, [\"operation\", \"coolant\", \"band\"]));\n    \n      match = /^Chamfer form (.+) with helix (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.chamfer_helix\", \"\", buildReplacements(match, [\"form\", \"helix\"]));\n    \n      match = /^Recommended chamfer class for this setup:\\s+(.+), estimated chamfer length (.+), run-out (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.chamfer_class_blind\", \"\", buildReplacements(match, [\"class\", \"length\", \"runout\"]));\n    \n      match = /^Recommended chamfer class for this setup:\\s+(.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.chamfer_class\", \"\", buildReplacements(match, [\"class\"]));\n    \n      match = /^APMX margin (.+), usable-length margin (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.length_window\", \"\", buildReplacements(match, [\"apmx\", \"usable\"]));\n    \n      match = /^Series (.+), substrate (.+), coating (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.series_substrate_coating\", \"\", buildReplacements(match, [\"series\", \"substrate\", \"coating\"]));\n    \n      match = /^spanless blind-hole process with (.+) lead and (.+)$/.exec(text);\n      if (match) return t(\"patterns.spanless_blind_process\", \"\", buildReplacements(match, [\"lead\", \"material\"]));\n    \n      match = /^spanless process with (.+) lead and (.+)$/.exec(text);\n      if (match) return t(\"patterns.spanless_process\", \"\", buildReplacements(match, [\"lead\", \"material\"]));\n    \n      match = /^blind-hole drilling at (.+) with row class (.+)$/.exec(text);\n      if (match) return t(\"patterns.drilling_blind_row\", \"\", buildReplacements(match, [\"depth_ratio\", \"row_class\"]));\n    \n      match = /^through-hole drilling at (.+) with row class (.+)$/.exec(text);\n      if (match) return t(\"patterns.drilling_through_row\", \"\", buildReplacements(match, [\"depth_ratio\", \"row_class\"]));\n    \n      match = /^entry (.+), hole (.+)$/.exec(text);\n      if (match) return t(\"patterns.entry_hole\", \"\", buildReplacements(match, [\"entry\", \"hole\"]));\n    \n      match = /^entry (.+), exit (.+), hole (.+)$/.exec(text);\n      if (match) return t(\"patterns.entry_exit_hole\", \"\", buildReplacements(match, [\"entry\", \"exit\", \"hole\"]));\n    \n      match = /^target (.+), feasibility (.+)$/.exec(text);\n      if (match) return t(\"patterns.target_feasibility\", \"\", buildReplacements(match, [\"target\", \"feasibility\"]));\n    \n      match = /^The current case reads as (.+) with (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.case_reads_with\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^The current case reads as (.+) on (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.case_reads_on\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^The case reads as (.+) with (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.case_reads_with_short\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^The case reads as (.+) on (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.case_reads_on_short\", \"\", buildReplacements(match, [\"primary\", \"secondary\"]));\n    \n      match = /^Target hole (.+) with tool (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.target_hole_tool\", \"\", buildReplacements(match, [\"hole\", \"tool\"]));\n    \n      match = /^Rigidity risk is (.+) with (.+) overhang\\.$/.exec(text);\n      if (match) return t(\"patterns.rigidity_overhang\", \"\", buildReplacements(match, [\"risk\", \"overhang\"]));\n    \n      match = /^Rigidity risk is currently (.+) with (.+) turning\\.$/.exec(text);\n      if (match) return t(\"patterns.rigidity_turning\", \"\", buildReplacements(match, [\"risk\", \"turning\"]));\n    \n      match = /^Radial-force conflict is currently (.+) on a (.+) face\\.$/.exec(text);\n      if (match) return t(\"patterns.radial_force_face\", \"\", buildReplacements(match, [\"conflict\", \"face\"]));\n    \n      match = /^Insert shape (.+) is being used against (.+) access\\.$/.exec(text);\n      if (match) return t(\"patterns.insert_shape_access\", \"\", buildReplacements(match, [\"shape\", \"access\"]));\n    \n      match = /^Internal profiling is being evaluated with (.+) overhang\\.$/.exec(text);\n      if (match) return t(\"patterns.internal_profiling_overhang\", \"\", buildReplacements(match, [\"overhang\"]));\n    \n      match = /^Current boring-bar routing suggests (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.boring_bar_routing\", \"\", buildReplacements(match, [\"route\"]));\n    \n      match = /^Overhang class (.+) drives the current rigidity risk\\.$/.exec(text);\n      if (match) return t(\"patterns.overhang_rigidity\", \"\", buildReplacements(match, [\"overhang\"]));\n    \n      match = /^Overhang class (.+) drives the current internal-profile deflection risk\\.$/.exec(text);\n      if (match) return t(\"patterns.overhang_profile_deflection\", \"\", buildReplacements(match, [\"overhang\"]));\n    \n      match = /^Requested topology:\\s+(.+)\\. Candidate reads as (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.requested_topology_candidate\", \"\", buildReplacements(match, [\"topology\", \"candidate\"]));\n    \n      match = /^Recommended predrill (.+), risk (.+)$/.exec(text);\n      if (match) return t(\"patterns.recommended_predrill_risk\", \"\", buildReplacements(match, [\"predrill\", \"risk\"]));\n    \n      match = /^Lead length (.+), reserve (.+), fit (.+)$/.exec(text);\n      if (match) return t(\"patterns.lead_reserve_fit\", \"\", buildReplacements(match, [\"lead\", \"reserve\", \"fit\"]));\n    \n      match = /^Lubrication (.+) with (.+)$/.exec(text);\n      if (match) return t(\"patterns.lubrication_with\", \"\", buildReplacements(match, [\"lubrication\", \"mode\"]));\n    \n      match = /^Entry\\/exit sensitivity (.+) with (.+)$/.exec(text);\n      if (match) return t(\"patterns.entry_exit_sensitivity\", \"\", buildReplacements(match, [\"sensitivity\", \"protection\"]));\n    \n      match = /^Center-zone requirement:\\s+(.+) with setup quality (.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.center_zone_quality\", \"\", buildReplacements(match, [\"center\", \"quality\"]));\n    \n      match = /^Tool route:\\s+(.+);\\s+material route:\\s+(.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.tool_route_material_route\", \"\", buildReplacements(match, [\"tool_route\", \"material_route\"]));\n    \n      match = /^(.+)\\s+for\\s+(.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.value_for\", \"\", buildReplacements(match, [\"first\", \"second\"]));\n    \n      match = /^(.+)\\s+with\\s+(.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.value_with\", \"\", buildReplacements(match, [\"first\", \"second\"]));\n    \n      match = /^(.+)\\s+on\\s+(.+)\\.$/.exec(text);\n      if (match) return t(\"patterns.value_on\", \"\", buildReplacements(match, [\"first\", \"second\"]));\n    \n      return null;\n    }\n    \n    function translateValidationText(text) {\n      var match;\n    \n      if (!text) return null;\n    \n      if (matchesText(text, \"This field is required.\")) {\n        return t(\"validation.required_field\", text);\n      }\n    \n      if (matchesText(text, \"Please enter a positive value.\")) {\n        return t(\"validation.positive_value\", text);\n      }\n    \n      match = /^(.+)\\s+is required\\.$/.exec(text);\n      if (match) {\n        return t(\"validation.required_field_with_label\", text, {\n          label: translateText(match[1]),\n        });\n      }\n    \n      return null;\n    }\n    \n    function translateText(value) {\n      var text;\n      var validation;\n      var exact;\n      var sourceTextValue;\n      var localeCandidate;\n      var pattern;\n      var punctuationMatch;\n      var translatedCore;\n    \n      if (value && typeof value === \"object\") {\n        if (value.i18nKey) {\n          return t(value.i18nKey, value.fallback || \"\", value.replacements || null);\n        }\n        if (Object.prototype.hasOwnProperty.call(value, \"text\")) {\n          return translateText(value.text);\n        }\n      }\n    \n      text = normalizeText(value);\n      if (!hasTextValue(text)) {\n        return \"\";\n      }\n      validation = translateValidationText(text);\n      exact = translateExactText(text);\n      sourceTextValue = translateMetaobjectSourceText(text);\n      localeCandidate = hasTextValue(validation) ? validation : exact;\n      if (\n        hasTextValue(sourceTextValue) &&\n        hasTextValue(localeCandidate) &&\n        isProbablyWrongLocale(sourceTextValue, getCurrentLocale(), \"metaobject.source_text_values\", localeCandidate, text)\n      ) {\n        sourceTextValue = null;\n      }\n      if (hasTextValue(sourceTextValue)) return sourceTextValue;\n      if (hasTextValue(validation)) return validation;\n      if (hasTextValue(exact)) return exact;\n      pattern = translatePatternText(text);\n      if (hasTextValue(pattern)) return pattern;\n      punctuationMatch = /^(.*?)([.!?])$/.exec(text);\n      if (punctuationMatch && punctuationMatch[1]) {\n        translatedCore = translateText(punctuationMatch[1]);\n        if (hasTextValue(translatedCore) && translatedCore !== punctuationMatch[1]) {\n          return translatedCore + punctuationMatch[2];\n        }\n      }\n      return text;\n    }\n    \n    function localizeQuestionViewModel(viewModel) {\n      var localized;\n      var optionMapPath;\n    \n      if (!viewModel || typeof viewModel !== \"object\") return viewModel;\n    \n      localized = Object.assign({}, viewModel, {\n        label: t(\"questions.\" + viewModel.id + \".label\", translateText(viewModel.label)),\n        helpText: t(\"questions.\" + viewModel.id + \".help_text\", translateText(viewModel.helpText)),\n        placeholder: t(\"questions.\" + viewModel.id + \".placeholder\", translateText(viewModel.placeholder)),\n      });\n    \n      if (Array.isArray(viewModel.options)) {\n        optionMapPath = \"questions.\" + viewModel.id + \".options\";\n        localized.options = viewModel.options.map(function mapOption(option) {\n          var optionValue = option && option.value != null ? String(option.value) : \"\";\n          return Object.assign({}, option, {\n            label: t(optionMapPath + \".\" + optionValue, translateText(option && option.label)),\n          });\n        });\n      }\n    \n      if (Array.isArray(viewModel.issues)) {\n        localized.issues = viewModel.issues.map(function mapIssue(issue) {\n          return Object.assign({}, issue, {\n            message: translateText(issue && issue.message),\n          });\n        });\n      }\n    \n      return localized;\n    }\n    \n    exports.isTranslationMissingToken = isTranslationMissingToken;\n    exports.setRuntimeI18n = setRuntimeI18n;\n    exports.getRuntimeI18n = getRuntimeI18n;\n    exports.t = t;\n    exports.translateText = translateText;\n    exports.localizeQuestionViewModel = localizeQuestionViewModel;\n  },\n  \"presentation/shared-components.js\": function (exports, module, __bundle) {\n    var { translateText } = __bundle.require(\"presentation/i18n.js\");\n    function clearNode(node) {\n      while (node.firstChild) {\n        node.removeChild(node.firstChild);\n      }\n    }\n    \n    function appendChildren(node, children) {\n      (children || []).forEach(function eachChild(child) {\n        if (child == null) return;\n        if (typeof child === \"string\") {\n          node.appendChild(document.createTextNode(translateText(child)));\n          return;\n        }\n        node.appendChild(child);\n      });\n      return node;\n    }\n    \n    function createElement(tagName, attributes, children) {\n      var node = document.createElement(tagName);\n      var attrs = attributes || {};\n      Object.keys(attrs).forEach(function eachKey(key) {\n        var value = attrs[key];\n        if (value == null) return;\n        if (key === \"className\") {\n          node.className = value;\n          return;\n        }\n        if (key === \"text\") {\n          node.textContent = translateText(value);\n          return;\n        }\n        if (key.slice(0, 2) === \"on\" && typeof value === \"function\") {\n          node.addEventListener(key.slice(2).toLowerCase(), value);\n          return;\n        }\n        if (key === \"dataset\" && typeof value === \"object\") {\n          Object.keys(value).forEach(function eachDataKey(dataKey) {\n            node.dataset[dataKey] = value[dataKey];\n          });\n          return;\n        }\n        if (key === \"placeholder\" || key === \"title\" || key === \"aria-label\" || key === \"alt\") {\n          node.setAttribute(key, translateText(value));\n          return;\n        }\n        node.setAttribute(key, String(value));\n      });\n      return appendChildren(node, children || []);\n    }\n    \n    function createButton(label, onClick, options) {\n      return createElement(\"button\", Object.assign({\n        type: \"button\",\n        className: \"tfv1-button\",\n        text: label,\n        onClick: onClick,\n      }, options || {}));\n    }\n    \n    function createCard(title, bodyChildren) {\n      return createElement(\"section\", { className: \"tfv1-card\" }, [\n        title ? createElement(\"h3\", { className: \"tfv1-card-title\", text: title }) : null,\n        createElement(\"div\", { className: \"tfv1-card-body\" }, bodyChildren || []),\n      ]);\n    }\n    \n    function createList(items, renderer) {\n      var listNode = createElement(\"ul\", { className: \"tfv1-list\" });\n      (items || []).forEach(function eachItem(item, index) {\n        listNode.appendChild(createElement(\"li\", { className: \"tfv1-list-item\" }, [\n          renderer ? renderer(item, index) : document.createTextNode(translateText(String(item))),\n        ]));\n      });\n      return listNode;\n    }\n    \n    function createStatusPill(label, status) {\n      return createElement(\"span\", {\n        className: \"tfv1-pill tfv1-pill-\" + (status || \"neutral\"),\n        text: label,\n      });\n    }\n    \n    function createFieldWrapper(labelText, control, helpText, issues) {\n      return createElement(\"label\", { className: \"tfv1-field\" }, [\n        createElement(\"span\", { className: \"tfv1-field-label\", text: labelText }),\n        control,\n        helpText ? createElement(\"small\", { className: \"tfv1-field-help\", text: helpText }) : null,\n        (issues || []).length > 0 ? createList(issues, function renderIssue(issue) {\n          return createElement(\"span\", { className: \"tfv1-issue tfv1-issue-\" + issue.severity, text: issue.message });\n        }) : null,\n      ]);\n    }\n    \n    exports.clearNode = clearNode;\n    exports.appendChildren = appendChildren;\n    exports.createElement = createElement;\n    exports.createButton = createButton;\n    exports.createCard = createCard;\n    exports.createList = createList;\n    exports.createStatusPill = createStatusPill;\n    exports.createFieldWrapper = createFieldWrapper;\n  },\n  \"presentation/shell.js\": function (exports, module, __bundle) {\n    var { clearNode, createElement } = __bundle.require(\"presentation/shared-components.js\");\n    var { t, translateText } = __bundle.require(\"presentation/i18n.js\");\n    var { renderStep1Material } = __bundle.require(\"presentation/step1-material.js\");\n    var { renderStep2Process } = __bundle.require(\"presentation/step2-process.js\");\n    var { renderStep3 } = __bundle.require(\"presentation/step3-renderer.js\");\n    var { renderStep4 } = __bundle.require(\"presentation/step4-renderer.js\");\n    function getAdvisorInitials(name) {\n      var parts = String(name == null ? \"\" : name)\n        .trim()\n        .split(/\\s+/)\n        .filter(Boolean)\n        .slice(0, 2);\n    \n      if (!parts.length) return \"EA\";\n      return parts.map(function mapPart(part) {\n        return part.charAt(0).toUpperCase();\n      }).join(\"\");\n    }\n    \n    function createVideoNode(media) {\n      var sources = media && Array.isArray(media.loadingVideoSources) ? media.loadingVideoSources : [];\n      var videoNode;\n    \n      if (!sources.length) return null;\n      videoNode = createElement(\"video\", {\n        className: \"tfv1-loading-video\",\n        autoplay: \"autoplay\",\n        muted: \"muted\",\n        loop: \"loop\",\n        playsinline: \"playsinline\",\n        preload: \"auto\",\n        poster: media.loadingVideoPosterUrl || null,\n      }, sources.map(function mapSource(source) {\n        return createElement(\"source\", {\n          src: source.url,\n          type: source.mimeType || null,\n        });\n      }));\n      videoNode.autoplay = true;\n      videoNode.muted = true;\n      videoNode.defaultMuted = true;\n      videoNode.loop = true;\n      videoNode.playsInline = true;\n      return videoNode;\n    }\n    \n    function resolveKeyedText(path, fallback, override, replacements) {\n      return t(path, translateText(override) || fallback, replacements || null);\n    }\n    \n    function createLoadingOverlayContent(config) {\n      var source = config || {};\n      var media = source.media || {};\n      var phase = source.phase || \"loading\";\n      var advisorName = translateText(media.advisorName || \"Mr. Edge\");\n      var localizedProcessLabel = translateText(source.processLabel || \"\");\n      var title = phase === \"catalog\"\n        ? resolveKeyedText(\"loading.title.catalog\", null, source.title || media.loadingTitle)\n        : resolveKeyedText(\"loading.title.default\", null, source.title || media.loadingTitle);\n      var subtitle = phase === \"catalog\"\n        ? resolveKeyedText(\"loading.subtitle.catalog\", null, source.subtitle || media.loadingSubtitle)\n        : source.processLabel\n          ? resolveKeyedText(\"loading.subtitle.scoring_process\", null, source.subtitle || media.loadingSubtitle, {\n              advisor: advisorName,\n              process: localizedProcessLabel,\n            })\n          : resolveKeyedText(\"loading.subtitle.default\", null, source.subtitle || media.loadingSubtitle);\n      var status = phase === \"catalog\"\n        ? t(\"loading.status.catalog\", null)\n        : phase === \"scoring\"\n          ? t(\"loading.status.scoring\", null)\n          : t(\"loading.status.default\", null);\n      var videoNode = createVideoNode(media);\n    \n      return createElement(\"div\", {\n        className: \"tfv1-loading-overlay-surface\" + (videoNode ? \" has-video\" : \" is-static\"),\n        role: \"status\",\n        \"aria-live\": \"polite\",\n      }, [\n        createElement(\"div\", { className: \"tfv1-loading-overlay-media\" }, [\n          videoNode,\n          createElement(\"div\", { className: \"tfv1-loading-overlay-tint\" }),\n        ]),\n        createElement(\"div\", { className: \"tfv1-loading-overlay-copy\" }, [\n          createElement(\"div\", { className: \"tfv1-loading-overlay-eyebrow\", text: status }),\n          createElement(\"div\", { className: \"tfv1-loading-overlay-title\", text: title }),\n          createElement(\"p\", { className: \"tfv1-loading-overlay-subtitle\", text: subtitle }),\n          createElement(\"div\", { className: \"tfv1-loading-overlay-advisor\" }, [\n            media.avatarUrl ? createElement(\"img\", {\n              className: \"tfv1-loading-overlay-avatar\",\n              src: media.avatarUrl,\n              alt: media.avatarAlt || advisorName,\n              loading: \"eager\",\n              decoding: \"async\",\n            }) : createElement(\"div\", { className: \"tfv1-loading-overlay-avatar is-placeholder\", text: getAdvisorInitials(advisorName) }),\n            createElement(\"div\", { className: \"tfv1-loading-overlay-advisor-copy\" }, [\n              createElement(\"div\", { className: \"tfv1-loading-overlay-advisor-name\", text: advisorName }),\n              createElement(\"div\", { className: \"tfv1-loading-overlay-advisor-role\", text: resolveKeyedText(\"loading.advisor_role\", null, media.advisorRole) }),\n            ]),\n          ]),\n          createElement(\"div\", { className: \"tfv1-loading-overlay-progress\" }, [\n            createElement(\"span\", { className: \"tfv1-loading-overlay-dot\" }),\n            createElement(\"span\", { className: \"tfv1-loading-overlay-dot\" }),\n            createElement(\"span\", { className: \"tfv1-loading-overlay-dot\" }),\n          ]),\n        ]),\n      ]);\n    }\n    \n    function createPresentationShell(options) {\n      var source = options || {};\n      var root = source.root;\n      var scrollAnchorNode;\n      var stepNodes;\n      var overlayNode;\n      var shellNode;\n      var activeStepKey = \"step1\";\n    \n      if (!root) {\n        throw new Error(\"createPresentationShell requires a root element.\");\n      }\n    \n      clearNode(root);\n      scrollAnchorNode = typeof root.closest === \"function\"\n        ? root.closest(\"[data-ev-tool-finder-v1-wrapper]\")\n        : null;\n      stepNodes = {\n        step1: createElement(\"div\", { className: \"tfv1-step tfv1-step1\" }),\n        step2: createElement(\"div\", { className: \"tfv1-step tfv1-step2\" }),\n        step3: createElement(\"div\", { className: \"tfv1-step tfv1-step3\" }),\n        step4: createElement(\"div\", { className: \"tfv1-step tfv1-step4\" }),\n      };\n      overlayNode = createElement(\"div\", {\n        className: \"tfv1-loading-overlay\",\n        hidden: \"hidden\",\n        \"aria-hidden\": \"true\",\n      });\n      shellNode = createElement(\"div\", { className: \"tfv1-shell\" }, [\n        stepNodes.step1,\n        stepNodes.step2,\n        stepNodes.step3,\n        stepNodes.step4,\n      ]);\n      root.appendChild(createElement(\"div\", { className: \"tfv1-shell-wrap\" }, [\n        shellNode,\n        overlayNode,\n      ]));\n    \n      function setActiveStep(stepKey) {\n        activeStepKey = stepKey && stepNodes[stepKey] ? stepKey : \"step1\";\n        Object.keys(stepNodes).forEach(function eachKey(key) {\n          var isActive = key === activeStepKey;\n          if (isActive) {\n            stepNodes[key].removeAttribute(\"hidden\");\n            stepNodes[key].classList.add(\"is-active\");\n          } else {\n            stepNodes[key].setAttribute(\"hidden\", \"hidden\");\n            stepNodes[key].classList.remove(\"is-active\");\n          }\n        });\n      }\n    \n      setActiveStep(activeStepKey);\n    \n      return {\n        renderStep1: function renderMaterialStep(config) {\n          renderStep1Material(stepNodes.step1, config);\n        },\n        renderStep2: function renderProcessStep(config) {\n          renderStep2Process(stepNodes.step2, config);\n        },\n        renderStep3: function renderQuestionStep(config) {\n          renderStep3(stepNodes.step3, config);\n        },\n        renderStep4: function renderResultStep(config) {\n          renderStep4(stepNodes.step4, config);\n        },\n        renderLoadingOverlay: function renderLoadingOverlay(config) {\n          var visible = !!(config && config.visible);\n          clearNode(overlayNode);\n          if (!visible) {\n            overlayNode.setAttribute(\"hidden\", \"hidden\");\n            overlayNode.setAttribute(\"aria-hidden\", \"true\");\n            return;\n          }\n          overlayNode.removeAttribute(\"hidden\");\n          overlayNode.setAttribute(\"aria-hidden\", \"false\");\n          overlayNode.appendChild(createLoadingOverlayContent(config));\n        },\n        scrollToStep: function scrollToStep(stepKey) {\n          var node = scrollAnchorNode || root;\n          if (!node || typeof node.scrollIntoView !== \"function\") return;\n          node.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n        },\n        setActiveStep: function setShellActiveStep(stepKey) {\n          setActiveStep(stepKey);\n        },\n        clear: function clear() {\n          Object.keys(stepNodes).forEach(function eachKey(key) {\n            clearNode(stepNodes[key]);\n          });\n          clearNode(overlayNode);\n          overlayNode.setAttribute(\"hidden\", \"hidden\");\n          overlayNode.setAttribute(\"aria-hidden\", \"true\");\n          setActiveStep(\"step1\");\n        },\n      };\n    }\n    \n    exports.createLoadingOverlayContent = createLoadingOverlayContent;\n    exports.createPresentationShell = createPresentationShell;\n  },\n  \"presentation/step1-material.js\": function (exports, module, __bundle) {\n    var { clearNode, createElement } = __bundle.require(\"presentation/shared-components.js\");\n    var { t, translateText } = __bundle.require(\"presentation/i18n.js\");\n    var ISO_ORDER = [\"P\", \"M\", \"K\", \"N\", \"S\", \"H\"];\n    var ISO_META = Object.freeze({\n      P: { rgb: [124, 188, 255], name: \"Steel\" },\n      M: { rgb: [255, 229, 140], name: \"Stainless\" },\n      K: { rgb: [255, 160, 160], name: \"Cast Iron\" },\n      N: { rgb: [140, 235, 190], name: \"Non-ferrous\" },\n      S: { rgb: [255, 196, 130], name: \"Superalloys\" },\n      H: { rgb: [210, 215, 225], name: \"Hardened\" },\n    });\n    \n    function toMaterialCode(value) {\n      return String(value || \"\").trim().toUpperCase();\n    }\n    \n    function getFamilyKey(code) {\n      var match = toMaterialCode(code).match(/^([PMKNSH])/);\n      return match ? match[1] : \"\";\n    }\n    \n    function subgroupNumber(code) {\n      var parsed = parseInt(String(code || \"\").replace(/\\D+/g, \"\"), 10);\n      return Number.isNaN(parsed) ? 999 : parsed;\n    }\n    \n    function buildSubgroupToneStyle(optionCode) {\n      var parsedNumber = subgroupNumber(optionCode);\n      var shadeSeed = parsedNumber === 999 ? 0 : parsedNumber;\n      var shade = Math.max(0, Math.min(1, shadeSeed / 9));\n      var buttonAlpha = 0.08 + (0.64 * shade);\n      var pillAlpha = 0.30 + (0.70 * shade);\n      var borderAlpha = 0.22 + (0.73 * shade);\n      var insetDarkness = 0.00 + (0.46 * shade);\n    \n      return [\n        \"--tfv1-iso-a:\" + buttonAlpha.toFixed(2),\n        \"--tfv1-pill-a:\" + pillAlpha.toFixed(2),\n        \"--tfv1-iso-b:\" + borderAlpha.toFixed(2),\n        \"--tfv1-iso-d:\" + insetDarkness.toFixed(2),\n      ].join(\";\");\n    }\n    \n    function resolveKeyedText(path, fallback, override) {\n      return t(path, translateText(override) || fallback);\n    }\n    \n    function sortOptions(left, right) {\n      var leftCode = toMaterialCode(left && left.code);\n      var rightCode = toMaterialCode(right && right.code);\n      var leftNum = subgroupNumber(leftCode);\n      var rightNum = subgroupNumber(rightCode);\n      if (leftNum !== rightNum) return leftNum - rightNum;\n      return leftCode.localeCompare(rightCode);\n    }\n    \n    function getOptionTitle(option) {\n      var code = toMaterialCode(option && option.code);\n      if (option && option.title) return translateText(option.title);\n      if (code.length === 1) {\n        return t(\"step1.iso_family\", \"\", {\n          code: code,\n        });\n      }\n      return t(\"step1.iso_subgroup\", \"\", {\n        code: code,\n      });\n    }\n    \n    function buildFallbackFamilies(materials) {\n      var familyMap = {};\n    \n      (materials || []).forEach(function eachMaterial(material) {\n        var code = toMaterialCode(material && material.code);\n        var familyKey = getFamilyKey(code);\n        if (!familyKey) return;\n        if (!familyMap[familyKey]) {\n          familyMap[familyKey] = {\n            key: familyKey,\n            title: familyKey + \" - \" + ((ISO_META[familyKey] && ISO_META[familyKey].name) || familyKey),\n            rgb: ISO_META[familyKey] ? ISO_META[familyKey].rgb : [120, 120, 120],\n            options: [],\n          };\n        }\n        familyMap[familyKey].options.push({\n          code: code,\n          label: material && material.label ? material.label : code,\n          title: getOptionTitle(material),\n          familyKey: familyKey,\n        });\n      });\n    \n      return ISO_ORDER\n        .filter(function filterFamily(key) {\n          return !!familyMap[key];\n        })\n        .map(function mapFamily(key) {\n          familyMap[key].options.sort(sortOptions);\n          return familyMap[key];\n        });\n    }\n    \n    function renderFamilyCard(family, selectedCode, onSelect) {\n      var familyKey = family && family.key ? family.key : \"\";\n      var rgb = family && Array.isArray(family.rgb) ? family.rgb.join(\",\") : \"120,120,120\";\n      var options = family && Array.isArray(family.options) ? family.options.slice().sort(sortOptions) : [];\n    \n      return createElement(\"div\", {\n        className: \"tfv1-iso-panel-card\",\n        style: \"--tfv1-iso-rgb:\" + rgb,\n      }, [\n        createElement(\"div\", { className: \"tfv1-iso-panel-top\" }, [\n          createElement(\"div\", {\n            className: \"tfv1-iso-panel-title\",\n            text: translateText(family && family.title ? family.title : familyKey),\n          }),\n        ]),\n        createElement(\"div\", { className: \"tfv1-iso-panel-body\" }, options.length > 0 ? [\n          createElement(\"div\", {\n            className: \"tfv1-iso-sub-stack\",\n            role: \"listbox\",\n            \"aria-label\": t(\"step1.family_subgroups_aria\", \"\", {\n              family: translateText(family && family.title ? family.title : familyKey),\n            }),\n          }, options.map(function mapOption(option) {\n            var optionCode = toMaterialCode(option.code);\n            var selected = optionCode === toMaterialCode(selectedCode);\n            return createElement(\"button\", {\n              type: \"button\",\n              className: selected ? \"tfv1-iso-sub-btn is-active\" : \"tfv1-iso-sub-btn\",\n              \"aria-selected\": selected ? \"true\" : \"false\",\n              title: getOptionTitle(option),\n              style: buildSubgroupToneStyle(optionCode),\n              dataset: {\n                materialCode: optionCode,\n                materialFamily: familyKey,\n              },\n              onClick: function handleClick() {\n                if (typeof onSelect === \"function\") onSelect(option);\n              },\n            }, [\n              createElement(\"span\", { className: \"tfv1-iso-pill\", text: optionCode }),\n              createElement(\"span\", { className: \"tfv1-iso-label\", text: getOptionTitle(option) }),\n            ]);\n          })),\n          createElement(\"div\", { className: \"tfv1-iso-panel-foot\", text: t(\"step1.click_subgroup_continue\", \"\") }),\n        ] : [\n          createElement(\"div\", { className: \"tfv1-iso-panel-foot\", text: t(\"step1.no_material_options\", \"\") }),\n        ]),\n      ]);\n    }\n    \n    function renderStep1Material(container, options) {\n      var source = options || {};\n      var families = Array.isArray(source.families) && source.families.length > 0\n        ? source.families\n        : buildFallbackFamilies(source.materials || []);\n    \n      clearNode(container);\n      container.appendChild(createElement(\"section\", { className: \"tfv1-step-panel tfv1-step-panel-material\" }, [\n        createElement(\"div\", { className: \"tfv1-step-head\" }, [\n          createElement(\"div\", null, [\n            createElement(\"p\", { className: \"tfv1-step-kicker\", text: t(\"steps.step1\", \"\") }),\n            createElement(\"p\", { className: \"tfv1-step-title\", text: t(\"step1.title\", \"\") }),\n            createElement(\"p\", {\n              className: \"tfv1-step-hint\",\n              text: resolveKeyedText(\"step1.description\", \"\", source.description),\n            }),\n          ]),\n        ]),\n        families.length > 0\n          ? createElement(\"div\", {\n            className: \"tfv1-iso-grid\",\n            \"aria-label\": t(\"step1.selector_aria\", \"\"),\n          }, families.map(function mapFamily(family) {\n            return renderFamilyCard(family, source.selectedCode, source.onSelect);\n            }))\n            : createElement(\"div\", {\n              className: \"tfv1-empty\",\n              text: resolveKeyedText(\"step1.empty\", \"\", source.emptyMessage),\n            }),\n      ]));\n    }\n    \n    exports.renderStep1Material = renderStep1Material;\n  },\n  \"presentation/step2-process.js\": function (exports, module, __bundle) {\n    var { clearNode, createElement } = __bundle.require(\"presentation/shared-components.js\");\n    var { t, translateText } = __bundle.require(\"presentation/i18n.js\");\n    var PROCESS_FAMILY_ORDER = [\"milling\", \"drilling\", \"turning\", \"threading\", \"other\"];\n    var PROCESS_FAMILY_KEYS = Object.freeze({\n      milling: true,\n      drilling: true,\n      turning: true,\n      threading: true,\n      other: true,\n    });\n    var PROCESS_FAMILY_TOKENS = Object.freeze({\n      milling: \"M\",\n      drilling: \"D\",\n      turning: \"T\",\n      threading: \"Th\",\n      other: \"?\",\n    });\n    \n    function resolveKeyedText(path, fallback, override) {\n      return t(path, translateText(override) || fallback);\n    }\n    \n    function getProcessFamilyLabel(familyKey) {\n      return t(\"step2.family.\" + familyKey, t(\"step2.family.other\", familyKey || \"other\"));\n    }\n    \n    function normalizeToken(value) {\n      return String(value || \"\").trim().toLowerCase();\n    }\n    \n    function groupProcesses(processes, searchTerm) {\n      var query = normalizeToken(searchTerm);\n      return (processes || []).reduce(function reduceGroups(groups, processOption) {\n        var familyKey = PROCESS_FAMILY_KEYS[normalizeToken(processOption && processOption.family)] ? normalizeToken(processOption.family) : \"other\";\n        var haystack = normalizeToken(\n          (processOption && processOption.label || \"\") + \" \" +\n          (processOption && processOption.id || \"\") + \" \" +\n          getProcessFamilyLabel(familyKey)\n        );\n    \n        if (query && haystack.indexOf(query) < 0) return groups;\n        if (!groups[familyKey]) groups[familyKey] = [];\n        groups[familyKey].push({\n          id: processOption && processOption.id ? processOption.id : \"\",\n          label: processOption && processOption.label ? processOption.label : \"\",\n          familyKey: familyKey,\n          iconUrl: processOption && processOption.iconUrl ? processOption.iconUrl : null,\n          available: processOption && processOption.available === true,\n        });\n        return groups;\n      }, {});\n    }\n    \n    function renderProcessButton(processOption, selectedProcessId, onSelect) {\n      var selected = processOption.id === selectedProcessId;\n      var disabled = processOption.available !== true;\n      var buttonClassName = \"tfv1-proc-btn\";\n    \n      if (selected) buttonClassName += \" is-active\";\n      if (disabled) buttonClassName += \" is-disabled\";\n    \n      return createElement(\"button\", {\n        type: \"button\",\n        className: buttonClassName,\n        title: processOption.id,\n        disabled: disabled ? \"disabled\" : null,\n        dataset: {\n          processId: processOption.id,\n          processFamily: processOption.familyKey,\n        },\n        onClick: function handleClick() {\n          if (disabled) return;\n          if (typeof onSelect === \"function\") onSelect(processOption);\n        },\n      }, [\n        createElement(\"span\", { className: \"tfv1-proc-icon\" }, [\n          processOption.iconUrl\n            ? createElement(\"img\", {\n              src: processOption.iconUrl,\n              alt: \"\",\n              loading: \"lazy\",\n            })\n            : createElement(\"span\", {\n              className: \"tfv1-proc-fallback\",\n              text: PROCESS_FAMILY_TOKENS[processOption.familyKey] || PROCESS_FAMILY_TOKENS.other,\n            }),\n        ]),\n        createElement(\"span\", { className: \"tfv1-proc-text\" }, [\n          createElement(\"div\", { className: \"tfv1-proc-title\", text: translateText(processOption.label) }),\n        ]),\n      ]);\n    }\n    \n    function renderStep2Process(container, options) {\n      var source = options || {};\n      var groups = groupProcesses(source.processes || [], source.searchTerm);\n      var familyOrder = PROCESS_FAMILY_ORDER.filter(function filterFamily(familyKey) {\n        return Array.isArray(groups[familyKey]) && groups[familyKey].length > 0;\n      });\n    \n      clearNode(container);\n      container.appendChild(createElement(\"section\", { className: \"tfv1-step-panel tfv1-step-panel-process\" }, [\n        createElement(\"div\", { className: \"tfv1-step-head\" }, [\n          createElement(\"div\", null, [\n            createElement(\"p\", { className: \"tfv1-step-kicker\", text: t(\"steps.step2\", \"\") }),\n            createElement(\"p\", { className: \"tfv1-step-title\", text: t(\"step2.title\", \"\") }),\n            createElement(\"p\", {\n              className: \"tfv1-step-hint\",\n              text: resolveKeyedText(\"step2.description\", \"\", source.description),\n            }),\n          ]),\n        ]),\n        createElement(\"div\", { className: \"tfv1-s2-wrap\" }, [\n          createElement(\"div\", { className: \"tfv1-s2-search-row\" }, [\n            createElement(\"input\", {\n              className: \"tfv1-s2-search\",\n              type: \"search\",\n              placeholder: t(\"step2.search_placeholder\", \"\"),\n              value: source.searchTerm || \"\",\n              disabled: source.materialReady ? null : \"disabled\",\n              dataset: { step2Search: \"true\" },\n              onInput: function handleInput(event) {\n                if (typeof source.onSearchChange === \"function\") {\n                  source.onSearchChange(event.target.value);\n                }\n              },\n            }),\n            createElement(\"div\", {\n              className: \"tfv1-s2-search-hint\",\n              text: source.materialReady\n                ? t(\"step2.search_hint_ready\", \"\")\n                : t(\"step2.search_hint_locked\", \"\"),\n            }),\n          ]),\n          familyOrder.length > 0\n            ? createElement(\"div\", {\n              className: \"tfv1-op-grid\",\n              \"aria-label\": t(\"step2.grid_aria\", \"\"),\n            }, familyOrder.map(function mapFamily(familyKey) {\n              return createElement(\"div\", { className: \"tfv1-op-panel\" }, [\n                createElement(\"div\", { className: \"tfv1-op-top\" }, [\n                  createElement(\"div\", {\n                    className: \"tfv1-op-title\",\n                    text: getProcessFamilyLabel(familyKey),\n                  }),\n                ]),\n                createElement(\"div\", { className: \"tfv1-op-body\" }, [\n                  createElement(\"div\", { className: \"tfv1-proc-list\" }, groups[familyKey].map(function mapProcess(processOption) {\n                    return renderProcessButton(processOption, source.selectedProcessId, source.onSelect);\n                  })),\n                ]),\n              ]);\n            }))\n            : createElement(\"div\", {\n              className: \"tfv1-empty\",\n              text: source.materialReady\n                ? t(\"step2.empty_search\", \"\")\n                : t(\"step2.empty_locked\", \"\"),\n            }),\n        ]),\n      ]));\n    }\n    \n    exports.renderStep2Process = renderStep2Process;\n  },\n  \"presentation/step3-renderer.js\": function (exports, module, __bundle) {\n    var { clearNode, createButton, createElement } = __bundle.require(\"presentation/shared-components.js\");\n    var { localizeQuestionViewModel, t, translateText } = __bundle.require(\"presentation/i18n.js\");\n    var { createStep3QuestionSketch } = __bundle.require(\"presentation/step3-sketches.js\");\n    var STEP3_UI_STATE = new WeakMap();\n    \n    function hasValue(value) {\n      return value != null && value !== \"\" && (!Array.isArray(value) || value.length > 0);\n    }\n    \n    function hasBlockingIssues(issues) {\n      return (issues || []).some(function someIssue(issue) {\n        return issue && issue.severity === \"error\";\n      });\n    }\n    \n    function escapeSelectorValue(value) {\n      return String(value == null ? \"\" : value)\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\"/g, '\\\\\"');\n    }\n    \n    function dedupeIssues(issues) {\n      var seen = {};\n      return (issues || []).filter(function keepIssue(issue) {\n        var key;\n        if (!issue) return false;\n        key = String(issue.field || \"\") + \"::\" + String(issue.code || \"\") + \"::\" + String(issue.message || \"\");\n        if (seen[key]) return false;\n        seen[key] = true;\n        return true;\n      });\n    }\n    \n    function getQuestionIssues(viewModel, source) {\n      var localIssues = viewModel && Array.isArray(viewModel.issues) ? viewModel.issues : [];\n      var validationIssues = source && Array.isArray(source.validationIssues) ? source.validationIssues : [];\n      return dedupeIssues(localIssues.concat(validationIssues.filter(function matchIssue(issue) {\n        return !!issue && issue.field === viewModel.id;\n      })));\n    }\n    \n    function getCombinedIssues(source) {\n      var fromQuestions = (source && source.questionViewModels || []).reduce(function collectIssues(list, viewModel) {\n        return list.concat(getQuestionIssues(viewModel, source));\n      }, []);\n      var validationIssues = source && Array.isArray(source.validationIssues) ? source.validationIssues : [];\n      return dedupeIssues(fromQuestions.concat(validationIssues));\n    }\n    \n    function captureFocusState(container) {\n      var active = typeof document !== \"undefined\" ? document.activeElement : null;\n      var questionNode;\n      if (!container || !active || !container.contains(active) || typeof active.closest !== \"function\") return null;\n      questionNode = active.closest(\"[data-question-id]\");\n      if (!questionNode) return null;\n      return {\n        questionId: questionNode.dataset.questionId,\n        tagName: String(active.tagName || \"\").toLowerCase(),\n        inputType: active.getAttribute ? active.getAttribute(\"type\") : null,\n        optionValue: active.dataset ? active.dataset.optionValue : null,\n        selectionStart: typeof active.selectionStart === \"number\" ? active.selectionStart : null,\n        selectionEnd: typeof active.selectionEnd === \"number\" ? active.selectionEnd : null,\n      };\n    }\n    \n    function restoreFocusState(container, focusState) {\n      var questionNode;\n      var target = null;\n      if (!container || !focusState || !focusState.questionId) return;\n      questionNode = container.querySelector('[data-question-id=\"' + escapeSelectorValue(focusState.questionId) + '\"]');\n      if (!questionNode) return;\n      if (focusState.optionValue != null) {\n        target = questionNode.querySelector('[data-option-value=\"' + escapeSelectorValue(focusState.optionValue) + '\"]');\n      } else if (focusState.tagName === \"input\") {\n        if (focusState.inputType) {\n          target = questionNode.querySelector('input[type=\"' + escapeSelectorValue(focusState.inputType) + '\"]');\n        }\n        if (!target) target = questionNode.querySelector(\"input\");\n      } else if (focusState.tagName === \"select\") {\n        target = questionNode.querySelector(\"select\");\n      } else if (focusState.tagName === \"textarea\") {\n        target = questionNode.querySelector(\"textarea\");\n      } else if (focusState.tagName === \"button\") {\n        target = questionNode.querySelector(\"button\");\n      }\n      if (!target || typeof target.focus !== \"function\") return;\n      target.focus();\n      if (\n        typeof target.setSelectionRange === \"function\" &&\n        focusState.selectionStart != null &&\n        focusState.selectionEnd != null\n      ) {\n        try {\n          target.setSelectionRange(focusState.selectionStart, focusState.selectionEnd);\n        } catch (error) {\n          return;\n        }\n      }\n    }\n    \n    function isAnswered(viewModel, answers) {\n      if (!viewModel) return false;\n      if (viewModel.type === \"number\") {\n        return hasValue(viewModel.value);\n      }\n      if (answers && Object.prototype.hasOwnProperty.call(answers, viewModel.id)) {\n        return hasValue(answers[viewModel.id]);\n      }\n      return hasValue(viewModel.value);\n    }\n    \n    function getQuestionValue(viewModel, answers) {\n      if (answers && Object.prototype.hasOwnProperty.call(answers, viewModel.id)) {\n        return answers[viewModel.id];\n      }\n      return viewModel.value;\n    }\n    \n    function normalizeControlLabel(value) {\n      return String(value == null ? \"\" : value).replace(/\\s+/g, \" \").trim().toLowerCase();\n    }\n    \n    function resolveSubmitLabel(label) {\n      if (!label || normalizeControlLabel(label) === \"show result\") {\n        return t(\"common.show_result\", null);\n      }\n      return translateText(label);\n    }\n    \n    function getQuestionGroupKey(viewModel) {\n      if (!viewModel) return \"advanced\";\n      if (viewModel.group === \"core\" && viewModel.expertOnly) return \"advanced\";\n      return viewModel.group || \"advanced\";\n    }\n    \n    function getVisibleQuestions(source) {\n      return (source.questionViewModels || []).filter(function isVisible(viewModel) {\n        return !!viewModel && viewModel.visible;\n      });\n    }\n    \n    function getActionableQuestions(questions) {\n      return (questions || []).filter(function isActionable(viewModel) {\n        return viewModel.type !== \"display\";\n      });\n    }\n    \n    function buildGuidedSequence(actionableQuestions) {\n      return actionableQuestions.filter(function isEnabled(viewModel) {\n        return !viewModel.disabled;\n      });\n    }\n\n    function getRequiredQuestions(questions) {\n      return (questions || []).filter(function keepRequired(viewModel) {\n        return !!viewModel && viewModel.required && !viewModel.disabled;\n      });\n    }\n\n    function getAnsweredRequiredQuestions(questions, answers, source) {\n      return getRequiredQuestions(questions).filter(function keepAnswered(viewModel) {\n        return isAnswered(viewModel, answers) && !hasBlockingIssues(getQuestionIssues(viewModel, source));\n      });\n    }\n\n    function getMissingRequiredQuestions(questions, answers, source) {\n      return getRequiredQuestions(questions).filter(function keepMissing(viewModel) {\n        return !isAnswered(viewModel, answers) || hasBlockingIssues(getQuestionIssues(viewModel, source));\n      });\n    }\n    \n    function getUiState(container, guidedSequence) {\n      var uiState = STEP3_UI_STATE.get(container);\n      var activeQuestionId = uiState && uiState.activeQuestionId;\n      var guidedIds = (guidedSequence || []).map(function mapQuestion(viewModel) {\n        return viewModel.id;\n      });\n    \n      if (!uiState) {\n        uiState = {\n          mode: \"guided\",\n          activeQuestionId: guidedIds[0] || null,\n        };\n      }\n      uiState.mode = \"guided\";\n      if (!activeQuestionId || guidedIds.indexOf(activeQuestionId) < 0) {\n        uiState.activeQuestionId = guidedIds[0] || null;\n      }\n      STEP3_UI_STATE.set(container, uiState);\n      return uiState;\n    }\n    \n    function setUiState(container, nextState) {\n      var previous = STEP3_UI_STATE.get(container) || {};\n      STEP3_UI_STATE.set(container, Object.assign({}, previous, nextState || {}));\n    }\n    \n    function getQuestionById(questions, questionId) {\n      return (questions || []).find(function matchQuestion(viewModel) {\n        return viewModel.id === questionId;\n      }) || null;\n    }\n    \n    function createIssueList(issues) {\n      if (!issues || issues.length === 0) return null;\n      return createElement(\"ul\", { className: \"tfv1-s3-issues\" }, issues.map(function mapIssue(issue) {\n        return createElement(\"li\", {\n          className: \"tfv1-s3-issue \" + (issue.severity === \"error\" ? \"is-error\" : \"is-warning\"),\n          text: issue.message,\n        });\n      }));\n    }\n    \n    function renderQuestionControl(viewModel, currentValue, onChange) {\n      var commonAttributes = {\n        disabled: viewModel.disabled ? \"disabled\" : null,\n      };\n    \n      if (viewModel.type === \"display\") {\n        return createElement(\"div\", { className: \"tfv1-display\", text: viewModel.helpText || viewModel.label });\n      }\n      if (viewModel.type === \"number\") {\n        return createElement(\"input\", Object.assign({\n          className: \"tfv1-input\",\n          type: \"text\",\n          inputmode: \"decimal\",\n          autocomplete: \"off\",\n          value: currentValue == null ? \"\" : currentValue,\n          placeholder: viewModel.placeholder || \"\",\n          onInput: function handleInput(event) {\n            onChange(viewModel.id, event.target.value === \"\" ? null : event.target.value);\n          },\n        }, commonAttributes));\n      }\n      if (viewModel.type === \"text\") {\n        return createElement(\"input\", Object.assign({\n          className: \"tfv1-input\",\n          type: \"text\",\n          value: currentValue == null ? \"\" : currentValue,\n          placeholder: viewModel.placeholder || \"\",\n          onInput: function handleInput(event) {\n            onChange(viewModel.id, event.target.value);\n          },\n        }, commonAttributes));\n      }\n      if (viewModel.type === \"boolean\") {\n        return createElement(\"input\", Object.assign({\n          type: \"checkbox\",\n          checked: Boolean(currentValue),\n          onChange: function handleChange(event) {\n            onChange(viewModel.id, Boolean(event.target.checked));\n          },\n        }, commonAttributes));\n      }\n      if (viewModel.type === \"select\") {\n        return createElement(\"select\", Object.assign({\n          className: \"tfv1-select\",\n          onChange: function handleChange(event) {\n            onChange(viewModel.id, event.target.value || null);\n          },\n        }, commonAttributes), [\n          createElement(\"option\", { value: \"\", text: t(\"step3.select_placeholder\", null) }),\n        ].concat((viewModel.options || []).map(function mapOption(option) {\n          return createElement(\"option\", {\n            value: option.value,\n            text: option.label,\n            selected: option.value === currentValue ? \"selected\" : null,\n          });\n        })));\n      }\n      return createElement(\"div\", { className: \"tfv1-chip-group\" }, (viewModel.options || []).map(function mapOption(option) {\n        var checked = Array.isArray(currentValue) ? currentValue.indexOf(option.value) >= 0 : currentValue === option.value;\n        return createButton(option.label, function handleClick() {\n          if (viewModel.disabled) return;\n          onChange(viewModel.id, option.value);\n        }, {\n          className: checked ? \"tfv1-button tfv1-button-selected\" : \"tfv1-button\",\n          disabled: viewModel.disabled ? \"disabled\" : null,\n          dataset: { optionValue: option.value },\n        });\n      }));\n    }\n    \n    function createQuestionCard(viewModel, source, options) {\n      var currentValue = getQuestionValue(viewModel, source.answers);\n      var issues = getQuestionIssues(viewModel, source);\n      var issueList = createIssueList(issues);\n      var cardClassName = \"tfv1-s3-qcard\";\n      var isActive = !!(options && options.isActive);\n      var compact = !!(options && options.compact);\n      var showSketch = !(options && options.showSketch === false);\n      var step3Sketches = source.step3Sketches || source.sketchOverrides || source.customSketches || {};\n      var sketchNode = showSketch ? createStep3QuestionSketch(viewModel, step3Sketches) : null;\n    \n      if (viewModel.viewHint && viewModel.viewHint.emphasis === \"high\") cardClassName += \" is-emphasis-high\";\n      if (isActive) cardClassName += \" is-active\";\n      if (compact) cardClassName += \" is-compact\";\n      if (sketchNode) cardClassName += \" has-sketch\";\n      else cardClassName += \" has-no-sketch\";\n      if (viewModel.disabled) cardClassName += \" is-disabled\";\n    \n      return createElement(\"section\", {\n        className: cardClassName,\n        dataset: {\n          questionId: viewModel.id,\n          questionGroup: getQuestionGroupKey(viewModel),\n          activeQuestion: isActive ? \"true\" : \"false\",\n        },\n      }, [\n        createElement(\"div\", { className: \"tfv1-s3-qhead\" }, [\n          createElement(\"div\", null, [\n            createElement(\"h4\", { className: \"tfv1-s3-qtitle\", text: viewModel.label }),\n          ]),\n        ]),\n        createElement(\"div\", { className: \"tfv1-s3-qbody\" }, [\n          createElement(\"div\", { className: \"tfv1-s3-qcontent\" }, [\n            viewModel.helpText\n              ? createElement(\"p\", { className: \"tfv1-s3-qhint\", text: viewModel.helpText })\n              : null,\n            createElement(\"div\", { className: \"tfv1-s3-qcontrol\" }, [\n              renderQuestionControl(viewModel, currentValue, source.onChange || function noop() {}),\n              viewModel.unit\n                ? createElement(\"span\", { className: \"tfv1-s3-unit\", text: viewModel.unit })\n                : null,\n            ]),\n            issueList,\n            viewModel.disabled\n              ? createElement(\"p\", { className: \"tfv1-s3-disabled-note\", text: t(\"step3.question.disabled_note\", null) })\n              : null,\n          ]),\n          sketchNode,\n        ]),\n      ]);\n    }\n\n    function getNextGuidedQuestion(guidedSequence, currentQuestionId) {\n      var index = guidedSequence.findIndex(function findIndex(viewModel) {\n        return viewModel.id === currentQuestionId;\n      });\n      if (index < 0) return guidedSequence[0] || null;\n      return guidedSequence[index + 1] || null;\n    }\n    \n    function getPreviousGuidedQuestion(guidedSequence, currentQuestionId) {\n      var index = guidedSequence.findIndex(function findIndex(viewModel) {\n        return viewModel.id === currentQuestionId;\n      });\n      if (index <= 0) return null;\n      return guidedSequence[index - 1] || null;\n    }\n\n    function createStatusMetric(label, value, tone) {\n      return createElement(\"div\", { className: \"tfv1-s3-status-metric is-\" + (tone || \"default\") }, [\n        createElement(\"span\", { className: \"tfv1-s3-status-metric-label\", text: label }),\n        createElement(\"strong\", { className: \"tfv1-s3-status-metric-value\", text: value }),\n      ]);\n    }\n\n    function createRecommendationStatusCard(source, guidedSequence, activeQuestion, rerender) {\n      var requiredQuestions = getRequiredQuestions(guidedSequence);\n      var answeredRequiredQuestions = getAnsweredRequiredQuestions(guidedSequence, source.answers, source);\n      var missingRequiredQuestions = getMissingRequiredQuestions(guidedSequence, source.answers, source);\n      var allIssues = getCombinedIssues(source);\n      var blocking = hasBlockingIssues(allIssues);\n      var nextQuestion = activeQuestion ? getNextGuidedQuestion(guidedSequence, activeQuestion.id) : null;\n      var currentQuestionBlocking = activeQuestion ? hasBlockingIssues(getQuestionIssues(activeQuestion, source)) : false;\n      var currentQuestionAnswered = activeQuestion ? isAnswered(activeQuestion, source.answers) : true;\n      var currentQuestionComplete = !activeQuestion || (!currentQuestionBlocking && (currentQuestionAnswered || !activeQuestion.required));\n      var progressPct = requiredQuestions.length === 0\n        ? 100\n        : Math.round((answeredRequiredQuestions.length / requiredQuestions.length) * 100);\n      var canShowResult = !blocking && missingRequiredQuestions.length === 0;\n      var nextAction = !activeQuestion\n        ? (canShowResult ? t(\"step3.rail.next_action.ready_to_open\", null) : t(\"step3.rail.next_action.blocking\", null))\n        : currentQuestionBlocking\n          ? t(\"step3.rail.next_action.resolve_issue\", null)\n          : currentQuestionAnswered\n            ? (nextQuestion ? t(\"step3.rail.next_action.question_covered\", null) : t(\"step3.rail.next_action.refine_or_open\", null))\n            : (activeQuestion.required ? t(\"step3.rail.next_action.answer_required\", null) : t(\"step3.rail.next_action.optional_open\", null));\n\n      return createElement(\"aside\", {\n        className: \"tfv1-s3-status-card\",\n        dataset: { step3Rail: \"true\" },\n      }, [\n        createElement(\"div\", { className: \"tfv1-s3-status-head\" }, [\n          createElement(\"div\", { className: \"tfv1-s3-status-eyebrow\", text: t(\"step3.rail.title\", null) }),\n          createElement(\"div\", { className: \"tfv1-s3-status-value\", text: String(progressPct) + \"%\" }),\n        ]),\n        createElement(\"p\", { className: \"tfv1-s3-status-copy\", text: t(\"step3.rail.status_copy\", null) }),\n        createElement(\"div\", { className: \"tfv1-s3-status-progress\" }, [\n          createElement(\"span\", {\n            className: \"tfv1-s3-status-progress-bar\",\n            style: \"width:\" + String(progressPct) + \"%;\",\n          }),\n        ]),\n        createElement(\"div\", { className: \"tfv1-s3-status-metrics\" }, [\n          createStatusMetric(t(\"common.answered\", null), String(answeredRequiredQuestions.length), \"filled\"),\n          createStatusMetric(t(\"common.open\", null), String(missingRequiredQuestions.length), missingRequiredQuestions.length === 0 ? \"ready\" : \"open\"),\n        ]),\n        createElement(\"p\", { className: \"tfv1-s3-status-next\", text: nextAction }),\n        missingRequiredQuestions.length > 0\n          ? createElement(\"ul\", { className: \"tfv1-s3-status-list\" }, missingRequiredQuestions.slice(0, 5).map(function mapMissing(viewModel) {\n            return createElement(\"li\", { text: viewModel.label });\n          }))\n          : createElement(\"div\", { className: \"tfv1-s3-status-ready\", text: t(\"step3.rail.required_core_details_covered\", null) }),\n        createElement(\"div\", { className: \"tfv1-actions tfv1-s3-status-actions\" }, [\n          nextQuestion\n            ? createButton(t(\"common.continue\", null), function continueFlow() {\n              if (!currentQuestionComplete) return;\n              setUiState(source.container, { activeQuestionId: nextQuestion.id });\n              rerender();\n            }, {\n              className: \"tfv1-button tfv1-s3-primary\",\n              disabled: currentQuestionComplete ? null : \"disabled\",\n              dataset: { step3StatusContinue: \"true\" },\n            })\n            : null,\n          createButton(resolveSubmitLabel(source.submitLabel), function submit() {\n            if (!canShowResult || typeof source.onSubmit !== \"function\") return;\n            source.onSubmit();\n          }, {\n            className: \"tfv1-button\" + (canShowResult ? \" tfv1-button-selected\" : \"\"),\n            disabled: canShowResult ? null : \"disabled\",\n            dataset: { step3StatusShowResults: \"true\" },\n          }),\n        ]),\n      ]);\n    }\n    \n    function createGuidedMain(source, guidedSequence, uiState, rerender) {\n      var activeQuestion = getQuestionById(guidedSequence, uiState.activeQuestionId);\n      var previousQuestion = activeQuestion ? getPreviousGuidedQuestion(guidedSequence, activeQuestion.id) : null;\n      var nextQuestion = activeQuestion ? getNextGuidedQuestion(guidedSequence, activeQuestion.id) : null;\n      var currentQuestionBlocking = activeQuestion ? hasBlockingIssues(activeQuestion.issues || []) : false;\n      var currentQuestionAnswered = activeQuestion ? isAnswered(activeQuestion, source.answers) : true;\n      var currentQuestionComplete = !activeQuestion || (!currentQuestionBlocking && (currentQuestionAnswered || !activeQuestion.required));\n      var blocking = hasBlockingIssues(getCombinedIssues(source));\n      var missingRequiredQuestions = getMissingRequiredQuestions(guidedSequence, source.answers, source);\n      var canShowResult = !blocking && missingRequiredQuestions.length === 0;\n    \n      return createElement(\"div\", { className: \"tfv1-s3-main tfv1-s3-lite-main\" }, [\n        createElement(\"section\", { className: \"tfv1-s3-panel tfv1-s3-question-panel\" }, [\n          activeQuestion\n            ? createQuestionCard(activeQuestion, source, {\n              isActive: true,\n            })\n            : createElement(\"div\", { className: \"tfv1-empty\" }, [\n              createElement(\"strong\", { text: t(\"step3.guided.complete_title\", null) }),\n              createElement(\"div\", { text: t(\"step3.guided.complete_body\", null) }),\n            ]),\n          createElement(\"div\", { className: \"tfv1-actions tfv1-s3-main-actions\" }, [\n            previousQuestion\n              ? createButton(t(\"common.back\", null), function goBack() {\n                setUiState(source.container, { activeQuestionId: previousQuestion.id });\n                rerender();\n              }, { dataset: { step3Previous: \"true\" } })\n              : null,\n            activeQuestion && nextQuestion\n              ? createButton(t(\"common.continue\", null), function goForward() {\n                if (!currentQuestionComplete) return;\n                setUiState(source.container, { activeQuestionId: nextQuestion.id });\n                rerender();\n              }, {\n                className: \"tfv1-button tfv1-s3-primary\",\n                disabled: currentQuestionComplete ? null : \"disabled\",\n                dataset: { step3Continue: \"true\" },\n              })\n              : null,\n            activeQuestion && !activeQuestion.required\n              ? createButton(t(\"common.leave_open\", null), function leaveOpen() {\n                if (nextQuestion) {\n                  setUiState(source.container, { activeQuestionId: nextQuestion.id });\n                  rerender();\n                  return;\n                }\n                if (typeof source.onSubmit === \"function\") source.onSubmit();\n              }, {\n                dataset: { step3SkipOptional: \"true\" },\n              })\n              : null,\n            !nextQuestion\n              ? createButton(resolveSubmitLabel(source.submitLabel), function submit() {\n                  if (!canShowResult || typeof source.onSubmit !== \"function\") return;\n                  source.onSubmit();\n                }, {\n                className: \"tfv1-button tfv1-button-selected\",\n                disabled: canShowResult ? null : \"disabled\",\n                dataset: { step3ShowResults: \"true\" },\n              })\n              : null,\n          ]),\n        ]),\n        createRecommendationStatusCard(source, guidedSequence, activeQuestion, rerender),\n      ]);\n    }\n    \n    function renderStep3(container, options) {\n      var source = Object.assign({}, options || {});\n      source.questionViewModels = (source.questionViewModels || []).map(localizeQuestionViewModel);\n      var visibleQuestions = getVisibleQuestions(source);\n      var actionableQuestions = getActionableQuestions(visibleQuestions);\n      var guidedSequence = buildGuidedSequence(actionableQuestions);\n      var uiState = getUiState(container, guidedSequence);\n      var focusState = captureFocusState(container);\n    \n      function rerender() {\n        renderStep3(container, source);\n      }\n    \n      clearNode(container);\n      source.container = container;\n    \n      container.appendChild(createGuidedMain(source, guidedSequence, uiState, rerender));\n      restoreFocusState(container, focusState);\n    }\n    \n    exports.renderStep3 = renderStep3;\n  },\n  \"presentation/step3-sketches.js\": function (exports, module, __bundle) {\n    var QUESTION_SKETCH_TYPES = Object.freeze({\n      actual_predrill_diameter_mm: \"core-hole\",\n      ap_mm: \"turning-cut-depth\",\n      blind_bottom_type: \"blind-hole\",\n      blind_through: \"blind-through\",\n      bore_diameter_mm: \"bore-diameter\",\n      bore_length_mm: \"bore-length\",\n      bore_type: \"bore-type\",\n      bottom_clearance_class: \"bottom-clearance\",\n      bottom_reserve_class: \"bottom-clearance\",\n      cam_capability: \"cam-path\",\n      copy_min_detail_mm: \"copy-detail\",\n      copy_surface_character: \"copy-profile\",\n      core_hole_status: \"core-hole\",\n      corner_radius_need: \"corner-radius\",\n      countersink_angle: \"countersink\",\n      entry_condition: \"entry\",\n      entry_exit_sensitivity: \"entry-exit\",\n      exit_condition: \"exit\",\n      face_rigidity_class: \"rigidity\",\n      face_size_l_mm: \"face-length\",\n      face_size_w_mm: \"face-width\",\n      feature_depth_mm: \"hole-depth\",\n      feature_diameter_mm: \"diameter\",\n      feature_width_mm: \"width\",\n      groove_depth_mm: \"groove-depth\",\n      groove_operation_type: \"groove-type\",\n      helical_capability_class: \"helical\",\n      high_feed_ap_mm: \"high-feed-depth\",\n      high_feed_geometry_class: \"high-feed-geometry\",\n      internal_external: \"internal-external\",\n      interpolation_capability: \"helical\",\n      material_formability_class: \"formability\",\n      max_corner_radius_mm: \"corner-radius\",\n      min_profile_radius_mm: \"corner-radius\",\n      plunging_feature_type: \"plunging\",\n      plunging_starting_hole_status: \"starting-hole\",\n      pocket_d_mm: \"pocket-depth\",\n      pocket_min_opening_mm: \"pocket-opening\",\n      pocket_topology_class: \"pocket-topology\",\n      pre_hole_diameter: \"pre-hole\",\n      pre_hole_status: \"pre-hole-status\",\n      profile_mode: \"profile\",\n      shoulder_90_required: \"shoulder\",\n      shoulder_access: \"shoulder-access\",\n      slot_start_state: \"slot-start\",\n      slot_type: \"slot-type\",\n      stock_removal_mm: \"stock-removal\",\n      sync_tapping_capability: \"sync\",\n      target_top_dia_or_depth: \"countersink-target\",\n      thread_depth_mm: \"thread-depth\",\n      thread_designation: \"thread-id\",\n      thread_length_mm: \"thread-length\",\n      thread_nominal_size: \"thread-id\",\n      thread_standard_choice: \"thread-id\",\n      through_coolant: \"coolant\",\n      trochoidal_dynamic_capability: \"trochoidal\",\n      trochoidal_feature_type: \"trochoidal-feature\",\n      turn_mode: \"turning\",\n      wall_height_mm: \"wall-height\",\n      workpiece_condition: \"workpiece\",\n      workpiece_diameter_mm: \"workpiece-diameter\",\n    });\n    \n    function sketchShell(type, body) {\n      var safeType = String(type || \"setup\").replace(/[^a-z0-9-]/gi, \"\");\n      return [\n        '<svg class=\"tfv1-s3-sketch-svg tfv1-s3-sketch-svg--' + safeType + '\" viewBox=\"0 0 160 110\" role=\"presentation\" focusable=\"false\" aria-hidden=\"true\">',\n        '<defs>',\n        '<marker id=\"tfv1-s3-arrow\" viewBox=\"0 0 8 8\" refX=\"4\" refY=\"4\" markerWidth=\"5\" markerHeight=\"5\" orient=\"auto-start-reverse\">',\n        '<path class=\"tfv1-s3-sketch-arrowhead\" d=\"M0 0 L8 4 L0 8 Z\"></path>',\n        '</marker>',\n        '<pattern id=\"tfv1-s3-hatch\" patternUnits=\"userSpaceOnUse\" width=\"7\" height=\"7\" patternTransform=\"rotate(45)\">',\n        '<path class=\"tfv1-s3-sketch-hatch\" d=\"M0 0 V7\"></path>',\n        '</pattern>',\n        '</defs>',\n        '<rect class=\"tfv1-s3-sketch-bg\" x=\"1\" y=\"1\" width=\"158\" height=\"108\" rx=\"18\"></rect>',\n        '<path class=\"tfv1-s3-sketch-grid\" d=\"M22 28 H138 M22 55 H138 M22 82 H138 M40 18 V92 M80 18 V92 M120 18 V92\"></path>',\n        '<path class=\"tfv1-s3-sketch-axis\" d=\"M80 14 V96 M22 55 H138\"></path>',\n        body,\n        \"</svg>\",\n      ].join(\"\");\n    }\n    \n    function dimH(x1, y, x2, label, labelY) {\n      return [\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"' + x1 + '\" y1=\"' + y + '\" x2=\"' + x2 + '\" y2=\"' + y + '\" marker-start=\"url(#tfv1-s3-arrow)\" marker-end=\"url(#tfv1-s3-arrow)\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"' + ((x1 + x2) / 2) + '\" y=\"' + (labelY || y - 9) + '\">' + label + '</text>',\n      ].join(\"\");\n    }\n    \n    function dimV(x, y1, y2, label, labelX) {\n      return [\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"' + x + '\" y1=\"' + y1 + '\" x2=\"' + x + '\" y2=\"' + y2 + '\" marker-start=\"url(#tfv1-s3-arrow)\" marker-end=\"url(#tfv1-s3-arrow)\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"' + (labelX || x + 10) + '\" y=\"' + ((y1 + y2) / 2) + '\">' + label + '</text>',\n      ].join(\"\");\n    }\n    \n    function extension(x1, y1, x2, y2) {\n      return '<line class=\"tfv1-s3-sketch-ext\" x1=\"' + x1 + '\" y1=\"' + y1 + '\" x2=\"' + x2 + '\" y2=\"' + y2 + '\"></line>';\n    }\n    \n    function centerLine(d) {\n      return '<path class=\"tfv1-s3-sketch-center\" d=\"' + d + '\"></path>';\n    }\n    \n    function hatch(d) {\n      return '<path class=\"tfv1-s3-sketch-hatch\" d=\"' + d + '\"></path>';\n    }\n    \n    function note(x, y, label) {\n      return '<text class=\"tfv1-s3-sketch-note\" x=\"' + x + '\" y=\"' + y + '\">' + label + '</text>';\n    }\n    \n    function leader(d, labelX, labelY, label) {\n      return '<path class=\"tfv1-s3-sketch-leader\" d=\"' + d + '\" marker-end=\"url(#tfv1-s3-arrow)\"></path>' + note(labelX, labelY, label);\n    }\n    \n    function sectionBlock(x, y, width, height) {\n      return [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"' + x + '\" y=\"' + y + '\" width=\"' + width + '\" height=\"' + height + '\" rx=\"2\"></rect>',\n        '<rect class=\"tfv1-s3-sketch-section-hatch\" x=\"' + (x + 2) + '\" y=\"' + (y + 2) + '\" width=\"' + (width - 4) + '\" height=\"' + (height - 4) + '\" rx=\"1\" fill=\"url(#tfv1-s3-hatch)\"></rect>',\n      ].join(\"\");\n    }\n    \n    function technicalHoleDiameterSketch() {\n      return sketchShell(\"diameter\", [\n        '<circle class=\"tfv1-s3-sketch-part\" cx=\"80\" cy=\"55\" r=\"32\"></circle>',\n        '<circle class=\"tfv1-s3-sketch-cut\" cx=\"80\" cy=\"55\" r=\"18\"></circle>',\n        centerLine('M80 18 V92 M43 55 H117'),\n        dimH(62, 55, 98, '&#216;D', 37),\n        extension(62, 46, 62, 64),\n        extension(98, 46, 98, 64),\n        note(80, 100, 'HOLE SIZE'),\n      ].join(\"\"));\n    }\n    \n    function technicalWidthSketch() {\n      return sketchShell(\"width\", [\n        sectionBlock(34, 35, 92, 40),\n        '<rect class=\"tfv1-s3-sketch-cut\" x=\"52\" y=\"45\" width=\"56\" height=\"20\" rx=\"3\"></rect>',\n        centerLine('M52 55 H108'),\n        extension(52, 65, 52, 88),\n        extension(108, 65, 108, 88),\n        dimH(52, 88, 108, 'W', 101),\n        note(80, 25, 'FEATURE WIDTH'),\n      ].join(\"\"));\n    }\n    \n    function technicalHoleDepthSketch() {\n      return sketchShell(\"hole-depth\", [\n        sectionBlock(44, 20, 72, 70),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M66 18 V82 H94 V18\"></path>',\n        centerLine('M80 14 V94'),\n        extension(94, 20, 126, 20),\n        extension(94, 82, 126, 82),\n        dimV(126, 20, 82, 'L'),\n        note(80, 100, 'DEPTH'),\n      ].join(\"\"));\n    }\n    \n    function technicalBlindHoleSketch() {\n      return sketchShell(\"blind-hole\", [\n        sectionBlock(44, 18, 72, 76),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M66 16 V67 L80 82 L94 67 V16\"></path>',\n        centerLine('M80 12 V96'),\n        leader('M105 76 L91 70', 118, 72, 'BOTTOM'),\n        dimV(126, 16, 82, 'L'),\n      ].join(\"\"));\n    }\n    \n    function technicalBlindThroughSketch() {\n      return sketchShell(\"blind-through\", [\n        sectionBlock(24, 24, 48, 60),\n        sectionBlock(88, 24, 48, 60),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M40 22 V66 L48 76 L56 66 V22 M104 20 V88 H120 V20\"></path>',\n        centerLine('M48 18 V90 M112 18 V90'),\n        note(48, 100, 'BLIND'),\n        note(112, 100, 'THRU'),\n      ].join(\"\"));\n    }\n    \n    function technicalBottomClearanceSketch() {\n      return sketchShell(\"bottom-clearance\", [\n        sectionBlock(44, 16, 72, 80),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M66 14 V62 L80 74 L94 62 V14\"></path>',\n        centerLine('M80 12 V98'),\n        extension(96, 74, 120, 74),\n        extension(96, 96, 120, 96),\n        dimV(120, 74, 96, 'RES.'),\n        note(80, 105, 'BOTTOM RESERVE'),\n      ].join(\"\"));\n    }\n    \n    function technicalCoolantSketch() {\n      return sketchShell(\"coolant\", [\n        sectionBlock(44, 24, 72, 62),\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M72 12 H88 L94 32 V70 L80 86 L66 70 V32 Z\"></path>',\n        centerLine('M80 10 V92'),\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M80 16 V71\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M64 48 C50 48 43 57 40 70 M96 48 C110 48 117 57 120 70\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        note(80, 101, 'TSC / MQL / EXT.'),\n      ].join(\"\"));\n    }\n    \n    function technicalPreHoleSketch() {\n      return sketchShell(\"pre-hole\", [\n        sectionBlock(42, 22, 76, 66),\n        '<path class=\"tfv1-s3-sketch-hidden\" d=\"M62 18 V90 M98 18 V90\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M70 18 V90 H90 V18\"></path>',\n        centerLine('M80 14 V94'),\n        dimH(70, 56, 90, '&#216; PRE', 43),\n        note(80, 102, 'PRE-DRILL'),\n      ].join(\"\"));\n    }\n    \n    function technicalThreadSketch(label) {\n      return sketchShell(\"thread\", [\n        sectionBlock(42, 18, 76, 78),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M64 16 V94 H96 V16\"></path>',\n        '<path class=\"tfv1-s3-sketch-thread\" d=\"M64 27 L96 34 L64 41 L96 48 L64 55 L96 62 L64 69 L96 76 L64 83\"></path>',\n        centerLine('M80 12 V100'),\n        dimV(124, 24, 86, 'L'),\n        note(80, 104, label),\n      ].join(\"\"));\n    }\n    \n    function technicalCountersinkSketch(label) {\n      return sketchShell(\"countersink\", [\n        sectionBlock(40, 30, 80, 58),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M54 28 L80 64 L106 28 M68 64 V90 H92 V64\"></path>',\n        centerLine('M80 16 V96'),\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M63 38 A28 28 0 0 0 97 38\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        dimH(54, 22, 106, '&#216; TOP', 13),\n        note(80, 102, label),\n      ].join(\"\"));\n    }\n    \n    function technicalEntryExitSketch(mode) {\n      var exitFlow = mode === \"exit\" || mode === \"entry-exit\";\n      var entryFlow = mode === \"entry\" || mode === \"entry-exit\";\n      return sketchShell(mode, [\n        sectionBlock(36, 32, 88, 48),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M68 26 V86 H92 V26\"></path>',\n        centerLine('M80 18 V94'),\n        entryFlow ? '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M80 12 V30\" marker-end=\"url(#tfv1-s3-arrow)\"></path>' : '',\n        exitFlow ? '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M80 80 V98\" marker-end=\"url(#tfv1-s3-arrow)\"></path>' : '',\n        note(80, 101, mode === \"entry\" ? 'ENTRY SURFACE' : mode === \"exit\" ? 'EXIT / BURR' : 'ENTRY + EXIT'),\n      ].join(\"\"));\n    }\n    \n    function technicalSyncSketch() {\n      return sketchShell(\"sync\", [\n        sectionBlock(46, 34, 68, 48),\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M70 14 H90 V80 H70 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-thread\" d=\"M70 35 L90 41 L70 47 L90 53 L70 59 L90 65\"></path>',\n        centerLine('M80 10 V92'),\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M58 24 C72 8 101 10 113 31\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M118 28 V62\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        note(84, 102, 'n + F = pitch'),\n      ].join(\"\"));\n    }\n    \n    function technicalTurningSketch(type) {\n      return sketchShell(type, [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M38 34 H112 Q130 34 130 55 Q130 76 112 76 H38 Z\"></path>',\n        '<ellipse class=\"tfv1-s3-sketch-part\" cx=\"38\" cy=\"55\" rx=\"14\" ry=\"21\"></ellipse>',\n        centerLine('M24 55 H132'),\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M108 78 L134 52 L143 61 L117 87 Z\"></path>',\n        type === \"turning-cut-depth\" ? dimH(102, 70, 120, 'ap', 88) : dimV(38, 34, 76, '&#216;D', 26),\n        note(84, 102, type === \"turning-cut-depth\" ? 'DEPTH OF CUT' : 'TURNING MODE'),\n      ].join(\"\"));\n    }\n    \n    function technicalGrooveSketch(label) {\n      return sketchShell(\"groove\", [\n        sectionBlock(34, 28, 92, 58),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M68 28 V66 H92 V28\"></path>',\n        dimH(68, 75, 92, 'W', 89),\n        dimV(102, 28, 66, 'D'),\n        note(80, 103, label),\n      ].join(\"\"));\n    }\n    \n    function technicalBoreSketch(label) {\n      return sketchShell(\"bore\", [\n        sectionBlock(32, 28, 96, 56),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M32 44 H106 Q118 44 118 55 Q118 66 106 66 H32\"></path>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M34 55 H96 L108 49 V61 L96 55 Z\"></path>',\n        centerLine('M24 55 H124'),\n        dimV(118, 44, 66, '&#216;'),\n        dimH(34, 90, 112, 'L', 102),\n        note(80, 18, label),\n      ].join(\"\"));\n    }\n    \n    function technicalSlotSketch(label) {\n      return sketchShell(\"slot\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"30\" y=\"28\" width=\"100\" height=\"56\" rx=\"4\"></rect>',\n        hatch('M36 80 L56 32 M52 84 L76 28 M76 84 L104 28 M100 84 L124 36'),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M52 42 H108 Q121 42 121 56 Q121 70 108 70 H52 Q39 70 39 56 Q39 42 52 42\"></path>',\n        centerLine('M39 56 H121'),\n        dimH(52, 92, 108, 'W', 104),\n        dimV(133, 42, 70, 'D'),\n        note(80, 19, label),\n      ].join(\"\"));\n    }\n    \n    function technicalShoulderSketch(label) {\n      return sketchShell(\"shoulder\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M34 86 H122 V30 H94 V60 H34 Z\"></path>',\n        hatch('M42 84 L78 48 M58 86 L94 50 M84 86 L120 50'),\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"74\" cy=\"50\" r=\"17\"></circle>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M94 30 H122 V60\"></path>',\n        dimV(132, 30, 86, 'H'),\n        note(108, 25, label),\n      ].join(\"\"));\n    }\n    \n    function technicalFaceSketch(label) {\n      var title = label === \"W\" ? \"FACE WIDTH\" : label === \"L\" ? \"FACE LENGTH\" : \"FACE AREA\";\n      return sketchShell(\"face-size\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"34\" y=\"28\" width=\"92\" height=\"56\" rx=\"3\"></rect>',\n        hatch('M38 80 L62 32 M58 84 L90 28 M86 84 L122 48'),\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"78\" cy=\"56\" r=\"16\"></circle>',\n        label !== \"W\" ? dimH(34, 94, 126, 'L', 104) : '<path class=\"tfv1-s3-sketch-line\" d=\"M42 88 H118\"></path>',\n        label !== \"L\" ? dimV(24, 28, 84, 'W', 14) : '<path class=\"tfv1-s3-sketch-line\" d=\"M26 34 V78\"></path>',\n        note(80, 18, title),\n      ].join(\"\"));\n    }\n    \n    function technicalStockSketch() {\n      return sketchShell(\"stock-removal\", [\n        '<rect class=\"tfv1-s3-sketch-soft\" x=\"38\" y=\"28\" width=\"84\" height=\"18\" rx=\"2\"></rect>',\n        sectionBlock(38, 46, 84, 40),\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M52 18 H108 V31 Q80 43 52 31 Z\"></path>',\n        dimV(132, 28, 46, 'ap'),\n        note(80, 102, 'STOCK TO REMOVE'),\n      ].join(\"\"));\n    }\n    \n    function technicalPocketSketch(label) {\n      var isDepth = label.indexOf(\"DEPTH\") >= 0;\n      var isOpening = label.indexOf(\"OPEN\") >= 0;\n      var dimensionMarkup = isDepth\n        ? dimV(118, 42, 72, 'D')\n        : isOpening\n          ? dimH(54, 96, 106, 'OPEN', 106)\n          : '<path class=\"tfv1-s3-sketch-line\" d=\"M54 78 H106 M112 42 V72\"></path>';\n      return sketchShell(\"pocket\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"30\" y=\"26\" width=\"100\" height=\"62\" rx=\"4\"></rect>',\n        hatch('M36 84 L72 28 M60 88 L100 26 M92 88 L128 52'),\n        '<rect class=\"tfv1-s3-sketch-cut\" x=\"54\" y=\"42\" width=\"52\" height=\"30\" rx=\"4\"></rect>',\n        dimensionMarkup,\n        note(80, 18, label),\n      ].join(\"\"));\n    }\n    \n    function technicalCornerRadiusSketch() {\n      return sketchShell(\"corner-radius\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M42 86 H120 V30 H92 V58 H42 Z\"></path>',\n        hatch('M50 84 L86 48 M72 86 L108 50 M96 86 L120 62'),\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M92 58 Q92 86 120 86\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"92\" y1=\"58\" x2=\"111\" y2=\"77\"></line>',\n        note(112, 68, 'R'),\n        note(80, 104, 'CORNER RADIUS'),\n      ].join(\"\"));\n    }\n    \n    function technicalCamPathSketch(label) {\n      return sketchShell(\"cam-path\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"34\" y=\"28\" width=\"92\" height=\"58\" rx=\"4\"></rect>',\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M52 70 C62 34 98 34 108 70\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"80\" cy=\"52\" r=\"8\"></circle>',\n        centerLine('M80 30 V74'),\n        note(80, 102, label),\n      ].join(\"\"));\n    }\n    \n    function technicalHelicalSketch() {\n      return sketchShell(\"helical\", [\n        sectionBlock(46, 24, 68, 62),\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M67 22 V88 H93 V22\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M60 56 C60 36 100 36 100 56 C100 76 60 76 60 56\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"80\" cy=\"56\" r=\"8\"></circle>',\n        centerLine('M80 16 V96'),\n        note(80, 102, 'HELICAL PATH'),\n      ].join(\"\"));\n    }\n    \n    function technicalTrochoidalSketch(label) {\n      return sketchShell(\"trochoidal\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"28\" y=\"34\" width=\"104\" height=\"44\" rx=\"4\"></rect>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M36 44 H124 V68 H36 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M42 56 C52 36 64 76 76 56 C88 36 100 76 118 56\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"76\" cy=\"56\" r=\"7\"></circle>',\n        note(80, 101, label),\n      ].join(\"\"));\n    }\n    \n    function technicalCopyProfileSketch(label) {\n      return sketchShell(\"copy-profile\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M34 84 C50 46 68 78 84 46 C98 18 113 42 128 28 V90 H34 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M42 68 C62 38 96 42 122 30\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"75\" cy=\"45\" r=\"10\"></circle>',\n        note(80, 103, label),\n      ].join(\"\"));\n    }\n    \n    function technicalPlungingSketch(label) {\n      return sketchShell(\"plunging\", [\n        sectionBlock(36, 68, 88, 22),\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M68 16 H92 V70 H68 Z\"></path>',\n        centerLine('M80 14 V94'),\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M80 18 V61\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        label === \"START HOLE\" ? '<circle class=\"tfv1-s3-sketch-cut\" cx=\"80\" cy=\"68\" r=\"13\"></circle>' : '',\n        note(80, 104, label),\n      ].join(\"\"));\n    }\n    \n    function technicalRigiditySketch() {\n      return sketchShell(\"rigidity\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"30\" y=\"32\" width=\"22\" height=\"48\" rx=\"2\"></rect>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M52 48 H124 V64 H52 Z\"></path>',\n        dimH(52, 82, 124, 'OVERHANG L', 96),\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M120 46 C134 55 134 72 120 82\"></path>',\n        note(88, 21, 'RIGIDITY / L:D'),\n      ].join(\"\"));\n    }\n    \n    function technicalFormabilitySketch() {\n      return sketchShell(\"formability\", [\n        sectionBlock(42, 54, 76, 34),\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M68 18 H92 V70 L80 82 L68 70 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M58 56 C66 46 94 46 102 56\"></path>',\n        centerLine('M80 14 V94'),\n        note(80, 104, 'MATERIAL FLOW'),\n      ].join(\"\"));\n    }\n    \n    function technicalInternalExternalSketch() {\n      return sketchShell(\"internal-external\", [\n        '<circle class=\"tfv1-s3-sketch-part\" cx=\"52\" cy=\"56\" r=\"28\"></circle>',\n        '<circle class=\"tfv1-s3-sketch-cut\" cx=\"52\" cy=\"56\" r=\"13\"></circle>',\n        '<circle class=\"tfv1-s3-sketch-part\" cx=\"110\" cy=\"56\" r=\"24\"></circle>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M108 32 L132 48 L124 60 L108 44 Z\"></path>',\n        note(52, 96, 'INTERNAL'),\n        note(110, 96, 'EXTERNAL'),\n      ].join(\"\"));\n    }\n    \n    function technicalWorkpieceSketch() {\n      return sketchShell(\"workpiece\", [\n        sectionBlock(36, 28, 88, 58),\n        '<path class=\"tfv1-s3-sketch-line\" d=\"M48 42 H112 M48 56 H112 M48 70 H112\"></path>',\n        '<path class=\"tfv1-s3-sketch-soft\" d=\"M36 28 H124 V42 H36 Z\"></path>',\n        note(80, 102, 'SURFACE / CONDITION'),\n      ].join(\"\"));\n    }\n    \n    function technicalWorkpieceDiameterSketch() {\n      return sketchShell(\"workpiece-diameter\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M38 30 H118 Q134 30 134 55 Q134 80 118 80 H38 Z\"></path>',\n        '<ellipse class=\"tfv1-s3-sketch-part\" cx=\"38\" cy=\"55\" rx=\"14\" ry=\"25\"></ellipse>',\n        centerLine('M24 55 H136'),\n        dimV(38, 30, 80, '&#216;D', 24),\n        note(86, 102, 'WORKPIECE'),\n      ].join(\"\"));\n    }\n    \n    function technicalHighFeedSketch(label) {\n      return sketchShell(\"high-feed\", [\n        sectionBlock(34, 68, 92, 20),\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"72\" cy=\"46\" r=\"20\"></circle>',\n        dimV(132, 68, 88, 'ap'),\n        '<path class=\"tfv1-s3-sketch-flow is-solid\" d=\"M44 47 C68 32 96 34 120 46\" marker-end=\"url(#tfv1-s3-arrow)\"></path>',\n        note(80, 104, label),\n      ].join(\"\"));\n    }\n    \n    function technicalSetupSketch() {\n      return sketchShell(\"setup\", [\n        sectionBlock(38, 32, 84, 52),\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"80\" cy=\"58\" r=\"15\"></circle>',\n        centerLine('M52 58 H108 M80 30 V86'),\n        note(80, 103, 'SETUP'),\n      ].join(\"\"));\n    }\n    \n    function diameterSketch() {\n      return sketchShell(\"diameter\", [\n        '<circle class=\"tfv1-s3-sketch-part\" cx=\"80\" cy=\"56\" r=\"30\"></circle>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"46\" y1=\"56\" x2=\"114\" y2=\"56\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M52 50 L46 56 L52 62 M108 50 L114 56 L108 62\"></path>',\n        '<line class=\"tfv1-s3-sketch-line\" x1=\"80\" y1=\"26\" x2=\"80\" y2=\"86\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"45\">&#216;D</text>',\n      ].join(\"\"));\n    }\n    \n    function widthSketch() {\n      return sketchShell(\"width\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"42\" y=\"38\" width=\"76\" height=\"36\" rx=\"8\"></rect>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"42\" y1=\"86\" x2=\"118\" y2=\"86\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M48 80 L42 86 L48 92 M112 80 L118 86 L112 92\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">W</text>',\n        '<line class=\"tfv1-s3-sketch-line\" x1=\"58\" y1=\"38\" x2=\"58\" y2=\"74\"></line>',\n        '<line class=\"tfv1-s3-sketch-line\" x1=\"102\" y1=\"38\" x2=\"102\" y2=\"74\"></line>',\n      ].join(\"\"));\n    }\n    \n    function holeDepthSketch() {\n      return sketchShell(\"hole-depth\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M52 24 H108 V82 H52 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M66 20 V78 Q80 88 94 78 V20\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"124\" y1=\"22\" x2=\"124\" y2=\"82\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M118 28 L124 22 L130 28 M118 76 L124 82 L130 76\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"128\" y=\"55\">L</text>',\n      ].join(\"\"));\n    }\n    \n    function blindHoleSketch() {\n      return sketchShell(\"blind-hole\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M48 22 H112 V88 H48 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M65 20 V70 L80 84 L95 70 V20\"></path>',\n        '<line class=\"tfv1-s3-sketch-line\" x1=\"58\" y1=\"86\" x2=\"102\" y2=\"86\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M65 70 L80 84 L95 70\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"102\">END FORM</text>',\n      ].join(\"\"));\n    }\n    \n    function blindThroughSketch() {\n      return sketchShell(\"blind-through\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M30 24 H70 V86 H30 Z M90 24 H130 V86 H90 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M42 20 V68 L50 78 L58 68 V20 M102 18 V92 M118 18 V92\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"50\" y=\"101\">BLIND</text>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"110\" y=\"101\">THRU</text>',\n      ].join(\"\"));\n    }\n    \n    function bottomClearanceSketch() {\n      return sketchShell(\"bottom-clearance\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M48 18 H112 V92 H48 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M65 16 V60 L80 72 L95 60 V16\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"104\" y1=\"72\" x2=\"104\" y2=\"92\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M99 77 L104 72 L109 77 M99 87 L104 92 L109 87\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"118\" y=\"84\">RESERVE</text>',\n      ].join(\"\"));\n    }\n    \n    function coolantSketch() {\n      return sketchShell(\"coolant\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M50 20 H110 V88 H50 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M78 12 H88 L94 30 V70 L83 86 L72 70 V30 Z\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"83\" y1=\"16\" x2=\"83\" y2=\"72\"></line>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M68 44 C54 46 48 54 45 66 M98 44 C112 46 118 54 121 66\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M45 66 L42 56 M45 66 L53 60 M121 66 L107 61 M121 66 L118 56\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"82\" y=\"103\">TSC</text>',\n      ].join(\"\"));\n    }\n    \n    function preHoleSketch() {\n      return sketchShell(\"pre-hole\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M42 24 H118 V86 H42 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M70 20 V86 M90 20 V86\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"68\" y1=\"54\" x2=\"92\" y2=\"54\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M73 49 L68 54 L73 59 M87 49 L92 54 L87 59\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"44\">PRE-&#216;</text>',\n      ].join(\"\"));\n    }\n    \n    function coreHoleSketch() {\n      return sketchShell(\"core-hole\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M44 22 H116 V88 H44 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M66 18 V88 M94 18 V88\"></path>',\n        '<path class=\"tfv1-s3-sketch-line\" d=\"M66 30 L94 40 M66 44 L94 54 M66 58 L94 68\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"66\" y1=\"76\" x2=\"94\" y2=\"76\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">CORE-&#216;</text>',\n      ].join(\"\"));\n    }\n    \n    function countersinkSketch() {\n      return sketchShell(\"countersink\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M42 30 H118 V88 H42 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M58 28 L80 60 L102 28 M70 60 V88 M90 60 V88\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M65 36 Q80 48 95 36\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"28\">90&#176;</text>',\n      ].join(\"\"));\n    }\n    \n    function countersinkTargetSketch() {\n      return sketchShell(\"countersink-target\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M40 30 H120 V88 H40 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M54 28 L80 62 L106 28 M68 62 V88 M92 62 V88\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"54\" y1=\"22\" x2=\"106\" y2=\"22\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M60 17 L54 22 L60 27 M100 17 L106 22 L100 27\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">TOP &#216;</text>',\n      ].join(\"\"));\n    }\n    \n    function entrySketch() {\n      return sketchShell(\"entry\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M38 64 H122 V88 H38 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M72 18 H88 L94 48 L80 66 L66 48 Z\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"80\" y1=\"16\" x2=\"80\" y2=\"58\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M74 52 L80 58 L86 52\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">ENTRY</text>',\n      ].join(\"\"));\n    }\n    \n    function exitSketch() {\n      return sketchShell(\"exit\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M40 22 H120 V74 H40 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M68 18 V78 M92 18 V78\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M80 66 C88 76 98 82 112 86\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M112 86 L101 87 M112 86 L107 76\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">EXIT</text>',\n      ].join(\"\"));\n    }\n    \n    function entryExitSketch() {\n      return sketchShell(\"entry-exit\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M42 28 H118 V78 H42 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M68 24 V82 M92 24 V82\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M80 14 V38 M80 66 V96\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M74 32 L80 38 L86 32 M74 90 L80 96 L86 90\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"105\">ENTRY / EXIT</text>',\n      ].join(\"\"));\n    }\n    \n    function threadSketch(label) {\n      return sketchShell(\"thread\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M44 22 H116 V88 H44 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M64 18 V88 M96 18 V88\"></path>',\n        '<path class=\"tfv1-s3-sketch-line\" d=\"M64 28 L96 38 L64 48 L96 58 L64 68 L96 78\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"120\" y1=\"24\" x2=\"120\" y2=\"86\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function syncSketch() {\n      return sketchShell(\"sync\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M46 30 H114 V84 H46 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M68 28 V84 M92 28 V84 M68 42 L92 50 M68 56 L92 64\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M58 18 C78 6 103 11 114 30\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M114 30 L102 26 M114 30 L111 18\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">SYNC</text>',\n      ].join(\"\"));\n    }\n    \n    function turningSketch() {\n      return sketchShell(\"turning\", [\n        '<ellipse class=\"tfv1-s3-sketch-part\" cx=\"54\" cy=\"55\" rx=\"18\" ry=\"30\"></ellipse>',\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M54 25 H106 Q124 25 124 55 Q124 85 106 85 H54\"></path>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M108 70 L132 46 L140 54 L116 78 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M44 55 C60 38 92 36 118 46\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"82\" y=\"103\">OD</text>',\n      ].join(\"\"));\n    }\n    \n    function workpieceDiameterSketch() {\n      return sketchShell(\"workpiece-diameter\", [\n        '<ellipse class=\"tfv1-s3-sketch-part\" cx=\"54\" cy=\"55\" rx=\"18\" ry=\"30\"></ellipse>',\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M54 25 H114 Q132 25 132 55 Q132 85 114 85 H54\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"54\" y1=\"25\" x2=\"54\" y2=\"85\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M48 31 L54 25 L60 31 M48 79 L54 85 L60 79\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"82\" y=\"103\">&#216;D</text>',\n      ].join(\"\"));\n    }\n    \n    function turningCutDepthSketch() {\n      return sketchShell(\"turning-cut-depth\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M38 34 H114 Q130 34 130 55 Q130 76 114 76 H38 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M104 78 L130 52 L138 60 L112 86 Z\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"104\" y1=\"62\" x2=\"120\" y2=\"46\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M108 62 L104 62 L104 58 M116 46 L120 46 L120 50\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"78\" y=\"101\">ap</text>',\n      ].join(\"\"));\n    }\n    \n    function grooveSketch(label) {\n      return sketchShell(\"groove\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M34 32 H126 V82 H34 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M68 32 V66 H92 V32\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"68\" y1=\"72\" x2=\"92\" y2=\"72\"></line>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"100\" y1=\"32\" x2=\"100\" y2=\"66\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function boreSketch(label) {\n      return sketchShell(\"bore\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M34 26 H126 V84 H34 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M34 44 H100 Q118 44 118 55 Q118 66 100 66 H34\"></path>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M38 55 H96 L106 50 V60 L96 55\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"104\" y1=\"44\" x2=\"104\" y2=\"66\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function slotSketch(label) {\n      return sketchShell(\"slot\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"34\" y=\"28\" width=\"92\" height=\"58\" rx=\"8\"></rect>',\n        '<path class=\"tfv1-s3-sketch-cut\" d=\"M54 43 H106 Q116 43 116 55 Q116 67 106 67 H54 Q44 67 44 55 Q44 43 54 43\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"54\" y1=\"78\" x2=\"106\" y2=\"78\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function shoulderSketch(label) {\n      return sketchShell(\"shoulder\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M36 80 H118 V32 H92 V58 H36 Z\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"78\" cy=\"48\" r=\"18\"></circle>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M92 32 H118 V58\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function faceSizeSketch() {\n      return sketchShell(\"face-size\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"34\" y=\"30\" width=\"92\" height=\"54\" rx=\"6\"></rect>',\n        '<path class=\"tfv1-s3-sketch-line\" d=\"M34 30 L126 84 M126 30 L34 84\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"34\" y1=\"94\" x2=\"126\" y2=\"94\"></line>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"24\" y1=\"30\" x2=\"24\" y2=\"84\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"104\">L x W</text>',\n      ].join(\"\"));\n    }\n    \n    function stockRemovalSketch() {\n      return sketchShell(\"stock-removal\", [\n        '<rect class=\"tfv1-s3-sketch-soft\" x=\"38\" y=\"28\" width=\"84\" height=\"18\" rx=\"4\"></rect>',\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"38\" y=\"46\" width=\"84\" height=\"40\" rx=\"4\"></rect>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M52 18 H108 V30 Q80 42 52 30 Z\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"130\" y1=\"28\" x2=\"130\" y2=\"46\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">STOCK</text>',\n      ].join(\"\"));\n    }\n    \n    function pocketSketch(label) {\n      return sketchShell(\"pocket\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"34\" y=\"28\" width=\"92\" height=\"58\" rx=\"8\"></rect>',\n        '<rect class=\"tfv1-s3-sketch-cut\" x=\"54\" y=\"42\" width=\"52\" height=\"30\" rx=\"5\"></rect>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"54\" y1=\"92\" x2=\"106\" y2=\"92\"></line>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"116\" y1=\"42\" x2=\"116\" y2=\"72\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"104\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function highFeedSketch(label) {\n      return sketchShell(\"high-feed\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"34\" y=\"66\" width=\"92\" height=\"20\" rx=\"4\"></rect>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"72\" cy=\"44\" r=\"20\"></circle>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M38 56 H118\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M44 44 C68 32 94 34 118 44\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function cornerRadiusSketch() {\n      return sketchShell(\"corner-radius\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M42 84 H120 V30 H92 V58 H42 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M92 58 Q92 84 118 84\"></path>',\n        '<line class=\"tfv1-s3-sketch-line\" x1=\"92\" y1=\"58\" x2=\"108\" y2=\"74\"></line>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"116\" y=\"67\">R</text>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">RADIUS</text>',\n      ].join(\"\"));\n    }\n    \n    function camPathSketch() {\n      return sketchShell(\"cam-path\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"36\" y=\"30\" width=\"88\" height=\"56\" rx=\"8\"></rect>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M52 70 C62 38 96 38 106 70\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"80\" cy=\"52\" r=\"8\"></circle>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M106 70 L94 66 M106 70 L99 58\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">CAM</text>',\n      ].join(\"\"));\n    }\n    \n    function helicalSketch() {\n      return sketchShell(\"helical\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M46 24 H114 V86 H46 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M58 56 C58 36 102 36 102 56 C102 76 58 76 58 56\"></path>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M102 56 L93 49 M102 56 L92 63\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"80\" cy=\"56\" r=\"8\"></circle>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">HELIX</text>',\n      ].join(\"\"));\n    }\n    \n    function trochoidalSketch(label) {\n      return sketchShell(\"trochoidal\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"34\" y=\"34\" width=\"92\" height=\"44\" rx=\"8\"></rect>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M45 56 C56 34 68 78 80 56 C92 34 104 78 116 56\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"80\" cy=\"56\" r=\"7\"></circle>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function copyProfileSketch(label) {\n      return sketchShell(\"copy-profile\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M36 82 C52 42 72 78 88 46 C100 24 114 38 126 28 V88 H36 Z\"></path>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"74\" cy=\"45\" r=\"10\"></circle>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M42 66 C62 36 96 42 120 30\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">' + label + \"</text>\",\n      ].join(\"\"));\n    }\n    \n    function copyDetailSketch() {\n      return sketchShell(\"copy-detail\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M38 80 C54 50 68 70 82 44 C96 18 114 42 124 30 V88 H38 Z\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M86 44 Q94 36 102 42\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"106\" y=\"45\">R</text>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">DETAIL</text>',\n      ].join(\"\"));\n    }\n    \n    function plungingSketch() {\n      return sketchShell(\"plunging\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"38\" y=\"70\" width=\"84\" height=\"18\" rx=\"4\"></rect>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M70 16 H90 V72 H70 Z\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"80\" y1=\"18\" x2=\"80\" y2=\"62\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M74 56 L80 62 L86 56\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">PLUNGE</text>',\n      ].join(\"\"));\n    }\n    \n    function startingHoleSketch() {\n      return sketchShell(\"starting-hole\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"36\" y=\"62\" width=\"88\" height=\"24\" rx=\"5\"></rect>',\n        '<circle class=\"tfv1-s3-sketch-cut\" cx=\"80\" cy=\"62\" r=\"14\"></circle>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M72 18 H88 V62 H72 Z\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">START</text>',\n      ].join(\"\"));\n    }\n    \n    function rigiditySketch() {\n      return sketchShell(\"rigidity\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"28\" y=\"26\" width=\"28\" height=\"58\" rx=\"5\"></rect>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M56 50 H122 V64 H56 Z\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"56\" y1=\"78\" x2=\"122\" y2=\"78\"></line>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M118 48 C132 58 132 72 118 82\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"89\" y=\"101\">L/D</text>',\n      ].join(\"\"));\n    }\n    \n    function formabilitySketch() {\n      return sketchShell(\"formability\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"38\" y=\"60\" width=\"84\" height=\"24\" rx=\"6\"></rect>',\n        '<path class=\"tfv1-s3-sketch-flow\" d=\"M50 58 C62 42 98 42 110 58\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M80 22 V54\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M74 48 L80 54 L86 48\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">FORM</text>',\n      ].join(\"\"));\n    }\n    \n    function internalExternalSketch() {\n      return sketchShell(\"internal-external\", [\n        '<circle class=\"tfv1-s3-sketch-part\" cx=\"54\" cy=\"56\" r=\"28\"></circle>',\n        '<circle class=\"tfv1-s3-sketch-cut\" cx=\"54\" cy=\"56\" r=\"13\"></circle>',\n        '<circle class=\"tfv1-s3-sketch-part\" cx=\"108\" cy=\"56\" r=\"24\"></circle>',\n        '<path class=\"tfv1-s3-sketch-tool\" d=\"M108 32 L130 48 L122 58 L108 44 Z\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">IN / OUT</text>',\n      ].join(\"\"));\n    }\n    \n    function workpieceSketch() {\n      return sketchShell(\"workpiece\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"36\" y=\"30\" width=\"88\" height=\"56\" rx=\"7\"></rect>',\n        '<path class=\"tfv1-s3-sketch-line\" d=\"M48 42 H112 M48 56 H112 M48 70 H112\"></path>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M36 26 L124 90 M124 26 L36 90\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">STATE</text>',\n      ].join(\"\"));\n    }\n    \n    function wallHeightSketch() {\n      return sketchShell(\"wall-height\", [\n        '<path class=\"tfv1-s3-sketch-part\" d=\"M44 86 H118 V30 H92 V62 H44 Z\"></path>',\n        '<line class=\"tfv1-s3-sketch-dim\" x1=\"128\" y1=\"30\" x2=\"128\" y2=\"86\"></line>',\n        '<path class=\"tfv1-s3-sketch-dim\" d=\"M122 36 L128 30 L134 36 M122 80 L128 86 L134 80\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"103\">H</text>',\n      ].join(\"\"));\n    }\n    \n    function genericSetupSketch() {\n      return sketchShell(\"setup\", [\n        '<rect class=\"tfv1-s3-sketch-part\" x=\"36\" y=\"34\" width=\"88\" height=\"48\" rx=\"8\"></rect>',\n        '<circle class=\"tfv1-s3-sketch-tool\" cx=\"80\" cy=\"58\" r=\"15\"></circle>',\n        '<path class=\"tfv1-s3-sketch-line\" d=\"M52 58 H108 M80 30 V86\"></path>',\n        '<text class=\"tfv1-s3-sketch-text\" x=\"80\" y=\"101\">SETUP</text>',\n      ].join(\"\"));\n    }\n    \n    var SKETCH_MARKUP_BY_TYPE = Object.freeze({\n      \"blind-hole\": technicalBlindHoleSketch,\n      \"blind-through\": technicalBlindThroughSketch,\n      \"bore-diameter\": function render() { return technicalBoreSketch(\"BORE DIAMETER\"); },\n      \"bore-length\": function render() { return technicalBoreSketch(\"BORING LENGTH\"); },\n      \"bore-type\": function render() { return technicalBoreSketch(\"BORE TYPE\"); },\n      \"bottom-clearance\": technicalBottomClearanceSketch,\n      \"cam-path\": function render() { return technicalCamPathSketch(\"CAM PATH\"); },\n      \"coolant\": technicalCoolantSketch,\n      \"copy-detail\": function render() { return technicalCopyProfileSketch(\"SMALLEST DETAIL\"); },\n      \"copy-profile\": function render() { return technicalCopyProfileSketch(\"3D PROFILE\"); },\n      \"core-hole\": technicalPreHoleSketch,\n      \"corner-radius\": technicalCornerRadiusSketch,\n      \"countersink\": function render() { return technicalCountersinkSketch(\"ANGLE + TOP DIAMETER\"); },\n      \"countersink-target\": function render() { return technicalCountersinkSketch(\"TARGET SIZE\"); },\n      \"diameter\": technicalHoleDiameterSketch,\n      \"entry\": function render() { return technicalEntryExitSketch(\"entry\"); },\n      \"entry-exit\": function render() { return technicalEntryExitSketch(\"entry-exit\"); },\n      \"exit\": function render() { return technicalEntryExitSketch(\"exit\"); },\n      \"face-length\": function render() { return technicalFaceSketch(\"L\"); },\n      \"face-size\": function render() { return technicalFaceSketch(\"AREA\"); },\n      \"face-width\": function render() { return technicalFaceSketch(\"W\"); },\n      \"formability\": technicalFormabilitySketch,\n      \"groove-depth\": function render() { return technicalGrooveSketch(\"GROOVE DEPTH\"); },\n      \"groove-type\": function render() { return technicalGrooveSketch(\"GROOVE TYPE\"); },\n      \"helical\": technicalHelicalSketch,\n      \"high-feed-depth\": function render() { return technicalHighFeedSketch(\"HIGH-FEED ap\"); },\n      \"high-feed-geometry\": function render() { return technicalHighFeedSketch(\"HIGH-FEED TOOL\"); },\n      \"hole-depth\": technicalHoleDepthSketch,\n      \"internal-external\": technicalInternalExternalSketch,\n      \"plunging\": function render() { return technicalPlungingSketch(\"PLUNGE TYPE\"); },\n      \"pocket-depth\": function render() { return technicalPocketSketch(\"POCKET DEPTH\"); },\n      \"pocket-opening\": function render() { return technicalPocketSketch(\"MIN OPENING\"); },\n      \"pocket-topology\": function render() { return technicalPocketSketch(\"POCKET TYPE\"); },\n      \"pre-hole\": technicalPreHoleSketch,\n      \"pre-hole-status\": technicalPreHoleSketch,\n      \"profile\": function render() { return technicalCopyProfileSketch(\"TURN PROFILE\"); },\n      \"rigidity\": technicalRigiditySketch,\n      \"setup\": technicalSetupSketch,\n      \"shoulder\": function render() { return technicalShoulderSketch(\"TRUE 90\"); },\n      \"shoulder-access\": function render() { return technicalShoulderSketch(\"ACCESS\"); },\n      \"slot-start\": function render() { return technicalSlotSketch(\"START CONDITION\"); },\n      \"slot-type\": function render() { return technicalSlotSketch(\"SLOT TYPE\"); },\n      \"starting-hole\": function render() { return technicalPlungingSketch(\"START HOLE\"); },\n      \"stock-removal\": technicalStockSketch,\n      \"sync\": technicalSyncSketch,\n      \"thread-depth\": function render() { return technicalThreadSketch(\"THREAD DEPTH\"); },\n      \"thread-id\": function render() { return technicalThreadSketch(\"THREAD ID\"); },\n      \"thread-length\": function render() { return technicalThreadSketch(\"FULL THREAD L\"); },\n      \"trochoidal\": function render() { return technicalTrochoidalSketch(\"DYNAMIC PATH\"); },\n      \"trochoidal-feature\": function render() { return technicalTrochoidalSketch(\"FEATURE TYPE\"); },\n      \"turning\": function render() { return technicalTurningSketch(\"turning\"); },\n      \"turning-cut-depth\": function render() { return technicalTurningSketch(\"turning-cut-depth\"); },\n      \"wall-height\": function render() { return technicalShoulderSketch(\"WALL HEIGHT\"); },\n      \"width\": technicalWidthSketch,\n      \"workpiece\": technicalWorkpieceSketch,\n      \"workpiece-diameter\": technicalWorkpieceDiameterSketch,\n    });\n    \n    function inferSketchType(questionId, questionType) {\n      if (questionId.indexOf(\"diameter\") >= 0 || questionId.indexOf(\"_dia\") >= 0) return \"diameter\";\n      if (questionId.indexOf(\"depth\") >= 0 || questionId.indexOf(\"length\") >= 0) return \"hole-depth\";\n      if (questionId.indexOf(\"width\") >= 0 || questionId.indexOf(\"opening\") >= 0) return \"width\";\n      if (questionId.indexOf(\"radius\") >= 0) return \"corner-radius\";\n      if (questionId.indexOf(\"thread\") >= 0) return \"thread-id\";\n      if (questionId.indexOf(\"coolant\") >= 0) return \"coolant\";\n      if (questionId.indexOf(\"cam\") >= 0 || questionId.indexOf(\"capability\") >= 0) return \"cam-path\";\n      if (questionType === \"number\") return \"diameter\";\n      return \"setup\";\n    }\n    \n    function getStep3QuestionSketchType(viewModel) {\n      var questionId = String(viewModel && viewModel.id || \"\");\n      if (QUESTION_SKETCH_TYPES[questionId]) return QUESTION_SKETCH_TYPES[questionId];\n      return inferSketchType(questionId, viewModel && viewModel.type);\n    }\n    \n    function normalizeCustomSketchEntry(entry) {\n      var source = entry && typeof entry === \"object\" ? entry : {};\n      var url = typeof entry === \"string\" ? entry : source.url || source.imageUrl || source.src || null;\n      if (!url) return null;\n      return {\n        url: String(url),\n        alt: source.alt || source.label || null,\n        blockId: source.blockId || null,\n      };\n    }\n    \n    function getCustomSketchForQuestion(viewModel, customSketches) {\n      var questionId = String(viewModel && viewModel.id || \"\");\n      var source = customSketches && typeof customSketches === \"object\" ? customSketches : {};\n      var entry = source[questionId] || null;\n      return normalizeCustomSketchEntry(entry);\n    }\n    \n    function createCustomStep3QuestionSketch(viewModel, customSketch) {\n      var questionId = String(viewModel && viewModel.id || \"\");\n      var label = viewModel && viewModel.label ? viewModel.label : questionId;\n      var node = document.createElement(\"div\");\n      var image = document.createElement(\"img\");\n      var alt = customSketch.alt || (\"Technical sketch for \" + String(label));\n    \n      node.className = \"tfv1-s3-sketch is-custom-image\";\n      node.setAttribute(\"data-step3-sketch-for\", questionId);\n      node.setAttribute(\"data-step3-sketch-type\", \"custom-image\");\n      node.setAttribute(\"data-step3-sketch-source\", \"theme-editor\");\n      if (customSketch.blockId) {\n        node.setAttribute(\"data-step3-sketch-block-id\", String(customSketch.blockId));\n      }\n      node.setAttribute(\"role\", \"img\");\n      node.setAttribute(\"aria-label\", alt);\n    \n      image.className = \"tfv1-s3-sketch-img\";\n      image.src = customSketch.url;\n      image.alt = alt;\n      image.loading = \"lazy\";\n      image.decoding = \"async\";\n      node.appendChild(image);\n      return node;\n    }\n    \n    function createStep3QuestionSketch(viewModel, customSketches) {\n      var customSketch = getCustomSketchForQuestion(viewModel, customSketches);\n    \n      if (customSketch) {\n        return createCustomStep3QuestionSketch(viewModel, customSketch);\n      }\n    \n      return null;\n    }\n    \n    function getStep3QuestionSketchCoverage() {\n      return Object.assign({}, QUESTION_SKETCH_TYPES);\n    }\n    \n    exports.getStep3QuestionSketchType = getStep3QuestionSketchType;\n    exports.createStep3QuestionSketch = createStep3QuestionSketch;\n    exports.getStep3QuestionSketchCoverage = getStep3QuestionSketchCoverage;\n  },\n  \"presentation/step4-renderer.js\": function (exports, module, __bundle) {\n    var { clearNode, createCard, createElement, createList, createStatusPill } = __bundle.require(\"presentation/shared-components.js\");\n    var { t, translateText, getRuntimeI18n } = __bundle.require(\"presentation/i18n.js\");\n    __bundle.require(\"presentation/edgevend-simple-pdf-global.js\");\n    function renderKpiList(items) {\n      return createList(items, function renderItem(item) {\n        return createElement(\"div\", { className: \"tfv1-kpi-row\" }, [\n          createElement(\"strong\", { text: translateText(item.label) + \": \" }),\n          createElement(\"span\", { text: compactText(item.value) }),\n          createStatusPill(item.status || \"neutral\", translateText(item.status || \"neutral\")),\n        ]);\n      });\n    }\n    \n    function getUserFacingBlockTitle(block) {\n      switch (block && block.blockType) {\n        case \"hero_recommendation\":\n          return translateText(\"Recommendation\");\n        case \"fit_kpis\":\n          return translateText(\"Decision signals\");\n        case \"recipe_start_values\":\n          return translateText(\"Recommended start values\");\n        case \"risk_notes\":\n          return translateText(\"What to watch\");\n        case \"machine_feasibility\":\n          return translateText(\"Machine fit\");\n        case \"tolerance_notes\":\n          return translateText(\"Quality and tolerance\");\n        case \"setup_notes\":\n          return translateText(\"Setup guidance\");\n        case \"geometry_fit\":\n          return translateText(\"Geometry review\");\n        case \"thread_identity\":\n          return translateText(\"Thread snapshot\");\n        case \"hole_summary\":\n          return translateText(\"Hole snapshot\");\n        case \"feature_summary\":\n          return translateText(\"Feature snapshot\");\n        case \"alternatives\":\n          return translateText(\"Alternatives worth checking\");\n        case \"bundle_recommendation\":\n          return translateText(\"Recommended setup\");\n        case \"commerce_cta\":\n          return translateText(\"Next step\");\n        case \"explanation\":\n          return translateText(\"Why this recommendation fits\");\n        case \"no_match_guidance\":\n          return translateText(\"Next best step\");\n        case \"warning\":\n          return translateText(\"What needs attention\");\n        default:\n          return translateText(titleCaseToken(block && (block.title || block.blockType) || \"Recommendation details\"));\n      }\n    }\n    \n    function formatLabelValue(label, value) {\n      return t(\"common.label_value\", null, {\n        label: translateText(label),\n        value: compactText(value),\n      });\n    }\n    \n    function formatLabelValueNote(label, value, note) {\n      return t(\"common.label_value_note\", null, {\n        label: translateText(label),\n        value: compactText(value),\n        note: compactText(note),\n      });\n    }\n    \n    function formatLabelScoreReason(label, score, reason) {\n      return t(\"common.label_score_reason\", null, {\n        label: translateText(label),\n        score: score,\n        reason: compactText(reason),\n      });\n    }\n    \n    function formatCountMeta(path, fallback, count) {\n      return t(path, fallback, { count: count });\n    }\n    \n    function normalizeActionLabel(value) {\n      return String(value == null ? \"\" : value).replace(/\\s+/g, \" \").trim().toLowerCase();\n    }\n    \n    function resolvePreferredActionLabel(label, key, fallback) {\n      if (!label || normalizeActionLabel(label) === normalizeActionLabel(fallback)) {\n        return t(key, fallback);\n      }\n      return translateText(label);\n    }\n    \n    function formatStep4PriceText(value) {\n      var text = String(value == null ? \"\" : value).replace(/\\s+/g, \" \").trim();\n    \n      if (!text || /^price on request$/i.test(text)) {\n        return t(\"step4.price_on_request\", \"Price on request\");\n      }\n    \n      text = text.replace(/\u00E2\u201A\u00AC/g, \"EUR \");\n      text = text.replace(/\\bEUR(?=\\S)/g, \"EUR \");\n      text = text.replace(/\\s+/g, \" \").trim();\n    \n      if (/^[+-]?\\d+(?:[.,]\\d{1,2})?$/.test(text)) {\n        text = \"EUR \" + text;\n      }\n    \n      return compactText(text);\n    }\n    \n    function resolveOpenProductLabel(label) {\n      var resolved;\n      var normalized = normalizeActionLabel(label);\n      if (!normalized || normalized === \"open product\") {\n        resolved = translateText(\"Open product\");\n        return resolved || t(\"common.open\", \"Open\") || \"Open product\";\n      }\n      if (normalized === \"unavailable\") {\n        resolved = translateText(\"Unavailable\");\n        return resolved || t(\"step4.unavailable\", \"Unavailable\") || \"Unavailable\";\n      }\n      resolved = translateText(label);\n      return resolved || compactText(label);\n    }\n    \n    function summarizeFallbackValue(value, label, depth) {\n      var currentDepth = depth || 0;\n      var prefix = label ? titleCaseToken(label) + \": \" : \"\";\n    \n      if (value == null || value === \"\") return [];\n      if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n        return [prefix + String(value)];\n      }\n      if (Array.isArray(value)) {\n        return dedupeTextItems(value.reduce(function reduceItems(items, item) {\n          if (typeof item === \"string\" || typeof item === \"number\" || typeof item === \"boolean\") {\n            items.push(prefix + String(item));\n            return items;\n          }\n          return items.concat(summarizeFallbackValue(item, label, currentDepth + 1));\n        }, [])).slice(0, 6);\n      }\n      if (typeof value === \"object\") {\n        if (currentDepth >= 2) return [prefix + translateText(\"Available\")];\n        return dedupeTextItems(Object.keys(value).reduce(function reduceEntries(items, key) {\n          return items.concat(summarizeFallbackValue(value[key], key, currentDepth + 1));\n        }, [])).slice(0, 8);\n      }\n      return [];\n    }\n    \n    function renderBlock(block) {\n      switch (block.blockType) {\n        case \"hero_recommendation\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createElement(\"p\", { text: (block.data.productTitle || \"\") + (block.data.variantTitle ? \" / \" + block.data.variantTitle : \"\") }),\n            createElement(\"p\", { text: t(\"step4.score_confidence\", null, { score: block.data.fitScore, confidence: block.data.confidence }) }),\n            createList(block.data.reasons || [], function renderReason(reason) {\n              return createElement(\"span\", { text: translateText(reason) });\n            }),\n          ]);\n        case \"fit_kpis\":\n          return createCard(getUserFacingBlockTitle(block), [renderKpiList(block.data.items || [])]);\n        case \"recipe_start_values\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.values || [], function renderValue(item) {\n              var valueText = [item.min, item.typ, item.max].filter(function keep(value) { return value != null; }).join(\" / \");\n              return createElement(\"span\", { text: translateText(item.label) + \": \" + valueText + \" \" + item.unit });\n            }),\n          ]);\n        case \"risk_notes\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.items || [], function renderRisk(item) {\n              return createElement(\"span\", { text: \"[\" + translateText(item.severity) + \"] \" + translateText(item.title) + \": \" + translateText(item.message) });\n            }),\n          ]);\n        case \"machine_feasibility\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.checks || [], function renderCheck(item) {\n              return createElement(\"span\", { text: item.note ? formatLabelValueNote(item.label, titleCaseToken(item.result || \"review\"), item.note) : formatLabelValue(item.label, titleCaseToken(item.result || \"review\")) });\n            }),\n          ]);\n        case \"tolerance_notes\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.notes || [], function renderNote(note) {\n              return createElement(\"span\", { text: compactText(note) });\n            }),\n          ]);\n        case \"setup_notes\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.notes || [], function renderNote(note) {\n              return createElement(\"span\", { text: formatLabelValue(note.area, note.message) });\n            }),\n          ]);\n        case \"geometry_fit\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.items || [], function renderItem(item) {\n              return createElement(\"span\", {\n                text: [\n                  translateText(item.label) + \":\",\n                  item.actual ? translateText(\"actual\") + \" \" + compactText(item.actual) : null,\n                  item.target ? translateText(\"target\") + \" \" + compactText(item.target) : null,\n                  item.result ? \"(\" + translateText(item.result) + \")\" : null,\n                ].filter(Boolean).join(\" \"),\n              });\n            }),\n          ]);\n        case \"thread_identity\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createElement(\"p\", { text: formatLabelValue(\"Standard\", block.data.standard || \"n/a\") }),\n            createElement(\"p\", { text: formatLabelValue(\"Size\", block.data.size || \"n/a\") }),\n            createElement(\"p\", { text: formatLabelValue(\"Pitch\", block.data.pitch || \"n/a\") }),\n            createElement(\"p\", { text: formatLabelValue(\"Tolerance\", block.data.tolerance || \"n/a\") }),\n          ]);\n        case \"hole_summary\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createElement(\"p\", { text: formatLabelValue(\"Diameter\", block.data.diameterMm || \"n/a\") }),\n            createElement(\"p\", { text: formatLabelValue(\"Depth\", block.data.depthMm || \"n/a\") }),\n            createElement(\"p\", { text: formatLabelValue(\"Depth ratio\", block.data.depthRatio || \"n/a\") }),\n          ]);\n        case \"feature_summary\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.items || [], function renderItem(item) {\n              return createElement(\"span\", { text: formatLabelValue(item.label, item.value) });\n            }),\n          ]);\n        case \"alternatives\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.items || [], function renderItem(item) {\n              return createElement(\"span\", { text: formatLabelScoreReason(item.label, item.score, item.reason) });\n            }),\n          ]);\n        case \"bundle_recommendation\":\n          return renderBundleRecommendationCard(block);\n        case \"commerce_cta\":\n          return createCard(getUserFacingBlockTitle(block), [\n            block.data && block.data.priceItems && block.data.priceItems.length ? renderBulletList(block.data.priceItems.map(function mapItem(item) {\n              return formatLabelValue(item.label, formatStep4PriceText(item.value));\n            }), \"tfv1-s4-mini-list\") : null,\n            createElement(\"a\", { href: block.data.productUrl || \"#\", text: resolveOpenProductLabel(block.data && block.data.ctaLabel) }),\n          ]);\n        case \"explanation\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createList(block.data.paragraphs || block.data.steps || [], function renderParagraph(text) {\n              return createElement(\"span\", { text: text });\n            }),\n          ]);\n        case \"no_match_guidance\":\n          return createCard(getUserFacingBlockTitle(block), [\n            block.data.message ? createElement(\"p\", { text: translateText(block.data.message) }) : null,\n            createList(block.data.paragraphs || block.data.steps || [], function renderParagraph(text) {\n              return createElement(\"span\", { text: translateText(text) });\n            }),\n          ]);\n        case \"warning\":\n          return createCard(getUserFacingBlockTitle(block), [\n            createElement(\"p\", { text: translateText(block.data.message) }),\n          ]);\n        default:\n          return createCard(getUserFacingBlockTitle(block), [\n            summarizeFallbackValue(block.data).length\n              ? renderBulletList(summarizeFallbackValue(block.data), \"tfv1-s4-detail-list\")\n              : createElement(\"p\", { text: translateText(\"Relevant recommendation details are available for this result.\") }),\n          ]);\n      }\n    }\n    \n    function findBlock(blocks, blockType) {\n      var index;\n      for (index = 0; index < (blocks || []).length; index += 1) {\n        if (blocks[index] && blocks[index].blockType === blockType) return blocks[index];\n      }\n      return null;\n    }\n    \n    function renderBulletList(items, className) {\n      return createElement(\"ul\", { className: className || \"tfv1-s4-list\" }, (items || []).map(function mapItem(item) {\n        return createElement(\"li\", { className: \"tfv1-s4-list-item\", text: translateText(item) });\n      }));\n    }\n    \n    function getAdvisorMedia(source) {\n      return source && source.runtimeConfig && source.runtimeConfig.advisorMedia\n        ? source.runtimeConfig.advisorMedia\n        : {};\n    }\n    \n    function getAdvisorIdentity(source) {\n      var media = getAdvisorMedia(source);\n      var name = translateText(media.advisorName || \"Mr. Edge\");\n    \n      if (!media.avatarUrl) return null;\n    \n      return {\n        name: name,\n        role: translateText(media.advisorRole || \"Digital machining advisor\"),\n        avatarUrl: media.avatarUrl,\n        avatarAlt: media.avatarAlt || name,\n      };\n    }\n    \n    function renderMediaThumbnail(url, alt, className) {\n      if (!url) return null;\n      return createElement(\"div\", { className: className || \"tfv1-s4-media-thumb\" }, [\n        createElement(\"img\", {\n          className: \"tfv1-s4-media-thumb-image\",\n          src: url,\n          alt: alt || t(\"step4.product_image_alt\", null),\n          loading: \"lazy\",\n          decoding: \"async\",\n        }),\n      ]);\n    }\n    \n    function renderAdvisorStamp(source, options) {\n      var advisor = getAdvisorIdentity(source);\n      var config = options || {};\n    \n      if (!advisor) return null;\n    \n      return createElement(\"div\", { className: \"tfv1-s4-advisor-stamp\" + (config.className ? \" \" + config.className : \"\") }, [\n        createElement(\"img\", {\n          className: \"tfv1-s4-advisor-stamp-avatar\",\n          src: advisor.avatarUrl,\n          alt: advisor.avatarAlt,\n          loading: \"lazy\",\n          decoding: \"async\",\n        }),\n        createElement(\"div\", { className: \"tfv1-s4-advisor-stamp-copy\" }, [\n          config.kicker ? createElement(\"div\", { className: \"tfv1-s4-advisor-stamp-kicker\", text: config.kicker }) : null,\n          createElement(\"div\", { className: \"tfv1-s4-advisor-stamp-label\", text: config.label || advisor.name }),\n        ]),\n      ]);\n    }\n    \n    function renderAdvisorInline(source, options) {\n      var advisor = getAdvisorIdentity(source);\n      var config = options || {};\n      var message = compactText(config.message || \"\");\n    \n      if (!advisor || !message) return null;\n    \n      return createElement(\"aside\", { className: \"tfv1-s4-advisor-inline\" + (config.className ? \" \" + config.className : \"\") }, [\n        createElement(\"img\", {\n          className: \"tfv1-s4-advisor-inline-avatar\",\n          src: advisor.avatarUrl,\n          alt: advisor.avatarAlt,\n          loading: \"lazy\",\n          decoding: \"async\",\n        }),\n        createElement(\"div\", { className: \"tfv1-s4-advisor-inline-copy\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-advisor-inline-top\" }, [\n            createElement(\"div\", { className: \"tfv1-s4-advisor-inline-eyebrow\", text: config.eyebrow || t(\"step4.guidance\", null, { name: advisor.name }) }),\n            config.context ? createElement(\"div\", { className: \"tfv1-s4-advisor-inline-context\", text: config.context }) : null,\n          ]),\n          createElement(\"p\", { className: \"tfv1-s4-advisor-inline-message\", text: message }),\n        ]),\n      ]);\n    }\n    \n    function renderHeroVisualRail(heroData, source, options) {\n      var config = options || {};\n      var imageUrl = heroData && heroData.imageUrl;\n      var imageAlt = compactText([\n        heroData && heroData.productTitle,\n        heroData && heroData.variantTitle,\n      ].filter(Boolean).join(\" / \")) || t(\"step4.product_image_alt\", translateText(\"Recommended tool image\"));\n      var caption = compactText([\n        heroData && heroData.variantTitle,\n        heroData && heroData.sku ? t(\"common.sku_value\", null, { value: heroData.sku }) : null,\n      ].filter(Boolean).join(\" | \"));\n      var advisorStamp = renderAdvisorStamp(source, {\n        className: \"is-overlay\",\n        kicker: config.badgeKicker || t(\"step4.edgevend_guidance\", null),\n        label: config.badgeLabel || t(\"step4.reviewed_by_mr_edge\", null),\n      });\n    \n      if (!imageUrl) return null;\n    \n      return createElement(\"div\", { className: \"tfv1-s4-hero-visual\" }, [\n        createElement(\"figure\", { className: \"tfv1-s4-tool-frame\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-tool-stage\" }, [\n            advisorStamp,\n            createElement(\"img\", {\n              className: \"tfv1-s4-tool-image\",\n              src: imageUrl,\n              alt: imageAlt,\n              loading: \"eager\",\n              decoding: \"async\",\n            }),\n          ]),\n          caption ? createElement(\"div\", { className: \"tfv1-s4-tool-caption-row\" }, [\n            createElement(\"figcaption\", { className: \"tfv1-s4-tool-caption\", text: caption }),\n          ]) : null,\n        ]),\n      ]);\n    }\n    \n    function createStep4Reveal(options) {\n      var config = options || {};\n      return createElement(\"details\", {\n        className: \"tfv1-s4-reveal\" + (config.className ? \" \" + config.className : \"\"),\n        open: config.open ? \"open\" : null,\n      }, [\n        createElement(\"summary\", { className: \"tfv1-s4-reveal-summary\" }, [\n          config.leadNode || null,\n          createElement(\"div\", { className: \"tfv1-s4-reveal-copy\" }, [\n            config.eyebrow ? createElement(\"div\", { className: \"tfv1-s4-reveal-eyebrow\", text: config.eyebrow }) : null,\n            createElement(\"div\", { className: \"tfv1-s4-reveal-title\", text: config.title || translateText(\"Details\") }),\n            config.hint ? createElement(\"div\", { className: \"tfv1-s4-reveal-hint\", text: config.hint }) : null,\n          ]),\n          config.meta ? createElement(\"span\", { className: \"tfv1-s4-reveal-meta\", text: config.meta }) : null,\n        ]),\n        createElement(\"div\", { className: \"tfv1-s4-reveal-body\" }, config.children || []),\n      ]);\n    }\n    \n    function renderTappingMetricTile(item, variant) {\n      var className = \"tfv1-s4-kpi\";\n      var valueClassName = \"tfv1-s4-kpi-value\";\n      if (variant) className += \" is-\" + variant;\n      if (item && item.tone === \"text\") valueClassName += \" is-text\";\n      if (item && (item.empty || item.value === \"n/a\")) className += \" is-empty\";\n      return createElement(\"div\", { className: className }, [\n        createElement(\"div\", { className: \"tfv1-s4-kpi-key\", text: item.label }),\n        createElement(\"div\", { className: valueClassName, text: compactText(item.value) }),\n        item.unit ? createElement(\"div\", { className: \"tfv1-s4-kpi-unit\", text: item.unit }) : null,\n      ]);\n    }\n    \n    function renderTappingStoryCard(title, items) {\n      if (!items || !items.length) return null;\n      return createElement(\"section\", { className: \"tfv1-s4-story-card\" }, [\n        createElement(\"h3\", { className: \"tfv1-s4-story-title\", text: title }),\n        renderBulletList(items, \"tfv1-s4-story-list\"),\n      ]);\n    }\n    \n    function renderTappingFactChip(text) {\n      return createElement(\"div\", { className: \"tfv1-s4-story-fact\", text: translateText(text) });\n    }\n    \n    function renderTappingStoryNote(text) {\n      return createElement(\"div\", { className: \"tfv1-s4-story-note\" }, [\n        createElement(\"span\", { className: \"tfv1-s4-story-note-dot\", text: \"\" }),\n        createElement(\"span\", { className: \"tfv1-s4-story-note-text\", text: translateText(text) }),\n      ]);\n    }\n    \n    function renderTappingStoryPanel(panel, fallbackTitle, fallbackItems) {\n      var items = panel && panel.items && panel.items.length ? panel.items : fallbackItems;\n      if (!panel) return renderTappingStoryCard(fallbackTitle, fallbackItems);\n      if (!items || !items.length) return null;\n      return createElement(\"section\", { className: \"tfv1-s4-story-card is-\" + (panel.tone || \"default\") }, [\n        createElement(\"div\", { className: \"tfv1-s4-story-top\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-story-eyebrow\", text: translateText(panel.eyebrow || fallbackTitle) }),\n          panel.badge ? createElement(\"span\", { className: \"tfv1-s4-story-badge is-\" + (panel.tone || \"default\"), text: translateText(panel.badge) }) : null,\n        ]),\n        createElement(\"h3\", { className: \"tfv1-s4-story-title\", text: translateText(panel.title || fallbackTitle) }),\n        panel.highlight ? createElement(\"p\", { className: \"tfv1-s4-story-highlight\", text: translateText(panel.highlight) }) : null,\n        panel.summary ? createElement(\"p\", { className: \"tfv1-s4-story-summary\", text: translateText(panel.summary) }) : null,\n        panel.facts && panel.facts.length ? createElement(\"div\", { className: \"tfv1-s4-story-facts\" }, panel.facts.map(function mapFact(item) {\n          return renderTappingFactChip(translateText(item));\n        })) : null,\n        createElement(\"div\", { className: \"tfv1-s4-story-notes\" }, items.map(renderTappingStoryNote)),\n      ]);\n    }\n    \n    function renderStep4StoryDeck(source, whyPanel, howPanel, watchPanel) {\n      var secondary = [];\n    \n      if (howPanel) {\n        secondary.push(createStep4Reveal({\n          eyebrow: translateText(\"Launch sequence\"),\n          title: translateText(\"How to start\"),\n          hint: translateText(\"Open to review the first-pass release approach and starting notes.\"),\n          meta: translateText(\"Start plan\"),\n          leadNode: renderAdvisorStamp(source, {\n            className: \"is-summary\",\n            kicker: translateText(\"Mr. Edge\"),\n            label: translateText(\"Start note\"),\n          }),\n          children: [howPanel],\n        }));\n      }\n      if (watchPanel) {\n        secondary.push(createStep4Reveal({\n          eyebrow: translateText(\"Critical signals\"),\n          title: translateText(\"Watch-outs\"),\n          hint: translateText(\"Open to review the checks that matter most before widening the process window.\"),\n          meta: translateText(\"Review\"),\n          children: [watchPanel],\n        }));\n      }\n    \n      if (!whyPanel && !secondary.length) return null;\n    \n      return createElement(\"div\", { className: \"tfv1-s4-story-grid tfv1-s4-story-grid-wow\" }, [\n        whyPanel ? createElement(\"div\", { className: \"tfv1-s4-story-hero-slot\" }, [whyPanel]) : null,\n        secondary.length ? createElement(\"div\", { className: \"tfv1-s4-story-stack\" }, secondary) : null,\n      ]);\n    }\n    \n    function renderTappingTrustCard(card) {\n      if (!card) return null;\n      return createElement(\"section\", { className: \"tfv1-s4-trust-card is-\" + (card.tone || \"default\") }, [\n        createElement(\"div\", { className: \"tfv1-s4-trust-top\" }, [\n          createElement(\"h3\", { className: \"tfv1-s4-story-title\", text: translateText(card.title) }),\n          card.badge ? createElement(\"span\", { className: \"tfv1-s4-tone is-\" + (card.tone || \"default\"), text: translateText(card.badge) }) : null,\n        ]),\n        createElement(\"div\", { className: \"tfv1-s4-trust-value\", text: translateText(card.value || \"\") }),\n        card.note ? createElement(\"p\", { className: \"tfv1-s4-trust-note\", text: translateText(card.note) }) : null,\n        card.items && card.items.length ? renderBulletList(card.items, \"tfv1-s4-mini-list\") : null,\n      ]);\n    }\n    \n    function renderDetailCard(title, items) {\n      if (!items || !items.length) return null;\n      return createElement(\"section\", { className: \"tfv1-s4-detail-card\" }, [\n        createElement(\"h3\", { className: \"tfv1-s4-detail-title\", text: translateText(title) }),\n        renderBulletList(items, \"tfv1-s4-detail-list\"),\n      ]);\n    }\n    \n    function renderBundleRecommendationCard(block) {\n      var data = block && block.data || {};\n      var body = data.body || {};\n      var insert = data.insert || {};\n    \n      return createElement(\"section\", { className: \"tfv1-s4-detail-card\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-story-eyebrow\", text: translateText(data.eyebrow || \"Recommended setup\") }),\n        createElement(\"h3\", { className: \"tfv1-s4-detail-title\", text: data.title || t(\"step4.body_insert_combination\", null) }),\n        data.summary ? createElement(\"p\", { className: \"tfv1-s4-trust-note\", text: translateText(data.summary) }) : null,\n        data.facts && data.facts.length ? createElement(\"div\", { className: \"tfv1-s4-story-facts\" }, data.facts.map(function mapFact(item) {\n          return createElement(\"span\", { className: \"tfv1-s4-story-fact\", text: translateText(item) });\n        })) : null,\n        createElement(\"div\", { className: \"tfv1-s4-details-grid\" }, [\n          createElement(\"section\", { className: \"tfv1-s4-detail-card\" }, [\n            renderMediaThumbnail(body.imageUrl, [body.productTitle, body.variantTitle].filter(Boolean).join(\" / \"), \"tfv1-s4-media-thumb is-card is-body\"),\n            createElement(\"h3\", { className: \"tfv1-s4-detail-title\", text: translateText(\"Body\") }),\n            createElement(\"p\", { text: [body.productTitle, body.variantTitle].filter(Boolean).join(\" / \") || \"n/a\" }),\n            body.sku ? createElement(\"p\", { text: formatLabelValue(\"SKU\", body.sku) }) : null,\n            body.priceLabel ? createElement(\"p\", { text: formatLabelValue(\"Unit price\", formatStep4PriceText(body.priceLabel)) }) : null,\n            body.productUrl ? createElement(\"a\", { href: body.productUrl, text: translateText(\"Open body\") }) : null,\n          ]),\n          createElement(\"section\", { className: \"tfv1-s4-detail-card\" }, [\n            renderMediaThumbnail(insert.imageUrl, [insert.productTitle, insert.variantTitle].filter(Boolean).join(\" / \"), \"tfv1-s4-media-thumb is-card is-insert\"),\n            createElement(\"h3\", { className: \"tfv1-s4-detail-title\", text: translateText(\"Insert\") }),\n            createElement(\"p\", { text: [insert.productTitle, insert.variantTitle].filter(Boolean).join(\" / \") || \"n/a\" }),\n            insert.sku ? createElement(\"p\", { text: formatLabelValue(\"SKU\", insert.sku) }) : null,\n            insert.priceLabel ? createElement(\"p\", { text: formatLabelValue(\"Unit price\", formatStep4PriceText(insert.priceLabel)) }) : null,\n            renderBulletList(([\n              insert.gradeCode ? formatLabelValue(\"Grade\", insert.gradeCode) : null,\n              insert.sizeCode ? formatLabelValue(\"Size\", insert.sizeCode) : null,\n              insert.chipbreaker ? formatLabelValue(\"Chipbreaker\", insert.chipbreaker) : null,\n              insert.cornerRadiusMm ? formatLabelValue(\"Corner radius\", insert.cornerRadiusMm) : null,\n            ]).filter(Boolean), \"tfv1-s4-mini-list\"),\n            insert.productUrl ? createElement(\"a\", { href: insert.productUrl, text: translateText(\"Open insert\") }) : null,\n          ]),\n        ]),\n        data.notes && data.notes.length ? renderBulletList(data.notes, \"tfv1-s4-detail-list\") : null,\n      ]);\n    }\n    \n    function renderBundleReveal(block) {\n      if (!block) return null;\n      return createStep4Reveal({\n        eyebrow: t(\"step4.setup_package\", null),\n        title: translateText(\"Bundle recommendation\"),\n        hint: t(\"step4.bundle_hint\", null),\n        meta: t(\"step4.body_insert_meta\", null),\n        children: [renderBundleRecommendationCard(block)],\n      });\n    }\n    \n    function renderSetupPackagePart(label, item, className) {\n      var data = item || {};\n      var title = [data.productTitle, data.variantTitle].filter(Boolean).join(\" / \") || \"n/a\";\n      var meta = [\n        data.sku ? formatLabelValue(\"SKU\", data.sku) : null,\n        data.priceLabel ? formatLabelValue(\"Unit price\", formatStep4PriceText(data.priceLabel)) : null,\n      ].filter(Boolean);\n      var attributes = [\n        data.gradeCode ? formatLabelValue(\"Grade\", data.gradeCode) : null,\n        data.sizeCode ? formatLabelValue(\"Size\", data.sizeCode) : null,\n        data.chipbreaker ? formatLabelValue(\"Chipbreaker\", data.chipbreaker) : null,\n        data.cornerRadiusMm ? formatLabelValue(\"Corner radius\", data.cornerRadiusMm) : null,\n      ].filter(Boolean);\n    \n      return createElement(\"section\", { className: \"tfv1-s4-package-part\" + (className ? \" \" + className : \"\") }, [\n        renderMediaThumbnail(data.imageUrl, title, \"tfv1-s4-media-thumb is-card\"),\n        createElement(\"div\", { className: \"tfv1-s4-story-eyebrow\", text: translateText(label) }),\n        createElement(\"h4\", { className: \"tfv1-s4-package-title\", text: title }),\n        meta.length ? renderBulletList(meta, \"tfv1-s4-mini-list\") : null,\n        attributes.length ? renderBulletList(attributes, \"tfv1-s4-mini-list\") : null,\n        data.productUrl ? createElement(\"a\", {\n          className: \"tfv1-s4-link tfv1-s4-package-link\",\n          href: data.productUrl,\n          text: translateText(label === \"Body\" ? \"Open body\" : \"Open insert\"),\n        }) : null,\n      ]);\n    }\n    \n    function renderSetupPackageCard(bundleBlock, heroData, setupBlock) {\n      var bundleData = bundleBlock && bundleBlock.data || null;\n      var setupLines = buildSetupLines(setupBlock).slice(0, 4);\n      var title;\n      var facts = dedupeTextItems([]\n        .concat(bundleData && bundleData.facts || [])\n      ).slice(0, 5);\n      var notes = dedupeTextItems([]\n        .concat(bundleData && bundleData.notes || [])\n        .concat(setupLines)).slice(0, 5);\n      var hasBundleParts = !!(bundleData && (bundleData.body || bundleData.insert));\n    \n      if (!hasBundleParts) return null;\n    \n      title = bundleData && bundleData.title\n        ? bundleData.title\n        : translateText(\"Recommended setup\");\n    \n      return createElement(\"details\", { className: \"tfv1-s4-detail-card tfv1-s4-setup-package tfv1-s4-setup-package-collapsible\" }, [\n        createElement(\"summary\", { className: \"tfv1-s4-setup-summary\" }, [\n          createElement(\"span\", { className: \"tfv1-s4-story-eyebrow\", text: \"SET UP PACKAGE\" }),\n          createElement(\"span\", { className: \"tfv1-s4-setup-title\", text: title }),\n          createElement(\"span\", { className: \"tfv1-s4-start-toggle tfv1-s4-setup-toggle\", text: translateText(\"Open\") }),\n        ]),\n        createElement(\"div\", { className: \"tfv1-s4-setup-body\" }, [\n          bundleData && bundleData.summary ? createElement(\"p\", { className: \"tfv1-s4-trust-note\", text: translateText(bundleData.summary) }) : null,\n          facts.length ? createElement(\"div\", { className: \"tfv1-s4-story-facts\" }, facts.map(function mapFact(item) {\n            return createElement(\"span\", { className: \"tfv1-s4-story-fact\", text: translateText(item) });\n          })) : null,\n          bundleData ? createElement(\"div\", { className: \"tfv1-s4-package-grid\" }, [\n            renderSetupPackagePart(\"Body\", bundleData.body || {}, \"is-body\"),\n            renderSetupPackagePart(\"Insert\", bundleData.insert || {}, \"is-insert\"),\n          ]) : null,\n          notes.length ? renderBulletList(notes, \"tfv1-s4-detail-list\") : null,\n        ]),\n      ]);\n    }\n    \n    function renderStartHereCard(config) {\n      var options = config || {};\n      var rowBackedValues = options.rowBackedValues || [];\n      var machineValues = options.machineValues || [];\n      var description = compactText(options.description || \"\");\n    \n      if (!rowBackedValues.length && !machineValues.length && !description && !options.advisorInline) return null;\n    \n      return createElement(\"details\", { className: \"tfv1-s4-start tfv1-s4-start-collapsible\" }, [\n        createElement(\"summary\", { className: \"tfv1-s4-start-summary\" }, [\n          createElement(\"span\", { className: \"tfv1-s4-kicker tfv1-s4-kicker-start\", text: \"START HERE\" }),\n          createElement(\"span\", { className: \"tfv1-s4-start-toggle\", text: translateText(\"Open\") }),\n        ]),\n        createElement(\"div\", { className: \"tfv1-s4-start-body\" }, [\n          options.advisorInline || null,\n          description ? createElement(\"p\", { className: \"tfv1-s4-start-copy\", text: description }) : null,\n          rowBackedValues.length ? createElement(\"div\", { className: \"tfv1-s4-start-group\" }, [\n            createElement(\"div\", { className: \"tfv1-s4-start-group-label\", text: options.rowLabel || t(\"step4.row_backed_cutting_data\", null) }),\n            createElement(\"div\", { className: \"tfv1-s4-kpi-grid is-row\" }, rowBackedValues.map(function mapItem(item) {\n              return renderTappingMetricTile(item, \"row\");\n            })),\n          ]) : null,\n          machineValues.length ? createElement(\"div\", { className: \"tfv1-s4-start-group\" }, [\n            createElement(\"div\", { className: \"tfv1-s4-start-group-label\", text: options.machineLabel || t(\"step4.derived_machine_values\", null) }),\n            createElement(\"div\", { className: \"tfv1-s4-kpi-grid is-machine\" }, machineValues.map(function mapItem(item) {\n              return renderTappingMetricTile(item, \"machine\");\n            })),\n          ]) : null,\n        ]),\n      ]);\n    }\n    \n    function getAlternativePriceLabel(item) {\n      var priceCents;\n      if (!item) return null;\n      if (item.priceItems && item.priceItems.length) {\n        return item.priceItems.map(function mapPriceItem(priceItem) {\n          return priceItem && priceItem.label && priceItem.value\n            ? translateText(priceItem.label) + \" \" + formatStep4PriceText(priceItem.value)\n            : null;\n        }).filter(Boolean).join(\" | \");\n      }\n      if (item.priceLabel || item.price) return item.priceLabel || item.price;\n      priceCents = item.priceCents;\n      if (priceCents == null && item.commerce) priceCents = item.commerce.priceCents;\n      if (priceCents == null || !Number.isFinite(Number(priceCents))) return null;\n      return \"EUR \" + (Number(priceCents) / 100).toFixed(2);\n    }\n    \n    function normalizeProductKey(value) {\n      var text = String(value == null ? \"\" : value).replace(/\\s+/g, \" \").trim().toLowerCase();\n      if (!text) return \"\";\n      return text.replace(/[?#].*$/, \"\").replace(/\\/$/, \"\");\n    }\n    \n    function hasActualAlternativePrice(item) {\n      var priceLabel = getAlternativePriceLabel(item);\n      var text = String(priceLabel == null ? \"\" : priceLabel).replace(/\\s+/g, \" \").trim();\n      if (!text) return false;\n      if (/price\\s+on\\s+request|on\\s+request|request\\s+price|n\\/a|unavailable/i.test(text)) return false;\n      return /\\d/.test(text);\n    }\n    \n    function isSameAlternativeSystem(item, heroData) {\n      var hero = heroData || {};\n      var heroVariantKey = normalizeProductKey(hero.variantId);\n      var itemVariantKey = normalizeProductKey(item && item.variantId);\n      var heroUrlKey = normalizeProductKey(hero.productUrl);\n      var itemUrlKey = normalizeProductKey(item && (item.productUrl || item.url || item.href));\n      var heroTitleKey = normalizeProductKey(hero.productTitle);\n      var itemTitleKey = normalizeProductKey(item && (item.productTitle || item.systemTitle));\n      var heroSystemKey = normalizeProductKey(hero.systemKey || hero.productId || heroUrlKey || heroTitleKey);\n      var itemSystemKey = normalizeProductKey(item && (item.systemKey || item.productId || itemUrlKey || itemTitleKey));\n    \n      if (heroVariantKey && itemVariantKey && heroVariantKey === itemVariantKey) return true;\n      if (heroSystemKey && itemSystemKey && heroSystemKey === itemSystemKey) return true;\n      if (heroUrlKey && itemUrlKey && heroUrlKey === itemUrlKey) return true;\n      if (heroTitleKey && itemTitleKey && heroTitleKey === itemTitleKey) return true;\n      return false;\n    }\n    \n    function renderAlternativeMedia(item) {\n      var label = item && compactText(item.label);\n      var media = renderMediaThumbnail(item && item.imageUrl, label, \"tfv1-s4-media-thumb is-card is-alternative\");\n      if (media) return media;\n      return createElement(\"div\", {\n        className: \"tfv1-s4-media-thumb is-card is-alternative is-placeholder\",\n        \"aria-label\": label || t(\"step4.product_image_alt\", null),\n      }, [\n        createElement(\"span\", { className: \"tfv1-s4-alternative-placeholder-mark\" }),\n      ]);\n    }\n    \n    function normalizeAlternativeItems(alternativesBlock, heroData) {\n      var items = alternativesBlock && alternativesBlock.data && Array.isArray(alternativesBlock.data.items)\n        ? alternativesBlock.data.items\n        : [];\n    \n      return items.filter(function keep(item) {\n        if (!(item && compactText(item.label))) return false;\n        if (item.suitable !== true && item.eligible !== true) return false;\n        if (item.available === false) return false;\n        if (!(item.productUrl || item.url || item.href)) return false;\n        if (isSameAlternativeSystem(item, heroData)) return false;\n        return hasActualAlternativePrice(item);\n      }).slice(0, 5);\n    }\n    \n    function renderAlternativeChoicesCard(alternativesBlock, heroData) {\n      var items = normalizeAlternativeItems(alternativesBlock, heroData);\n    \n      if (!items.length) return null;\n    \n      return createElement(\"section\", { className: \"tfv1-s4-detail-card tfv1-s4-alternatives-card\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-story-eyebrow\", text: \"ALTERNATIVE CHOICES\" }),\n        createElement(\"h3\", { className: \"tfv1-s4-detail-title\", text: translateText(\"Alternatives worth checking\") }),\n        createElement(\"div\", { className: \"tfv1-s4-alternative-grid\" }, items.map(function mapItem(item, index) {\n          var priceLabel = getAlternativePriceLabel(item);\n          var productUrl = item.productUrl || item.url || item.href || \"#\";\n          return createElement(\"article\", { className: \"tfv1-s4-alternative-choice\" }, [\n            createElement(\"div\", { className: \"tfv1-s4-alternative-rank\", text: String(index + 1) }),\n            renderAlternativeMedia(item),\n            createElement(\"div\", { className: \"tfv1-s4-alternative-copy\" }, [\n              createElement(\"h4\", { className: \"tfv1-s4-alternative-title\", text: item.label }),\n              item.reason ? createElement(\"p\", { className: \"tfv1-s4-tech-alt-reason\", text: item.reason }) : null,\n            ]),\n            createElement(\"div\", { className: \"tfv1-s4-alternative-commerce\" }, [\n              createElement(\"span\", {\n                className: \"tfv1-s4-alternative-price\",\n                text: formatStep4PriceText(priceLabel),\n              }),\n              item.score != null ? createElement(\"span\", { className: \"tfv1-s4-tech-alt-badge\", text: t(\"common.score_value\", \"{{score}}\", { score: item.score }) }) : null,\n              createElement(\"a\", {\n                className: \"tfv1-button tfv1-button-selected tfv1-s4-buy-primary tfv1-s4-alternative-button\",\n                href: productUrl,\n                text: resolveOpenProductLabel(item.ctaLabel),\n              }),\n            ]),\n          ]);\n        })),\n      ]);\n    }\n    \n    function renderTappingTroubleshootingCard(card) {\n      if (!card) return null;\n      if (!card.category && !card.cause && !card.actions) {\n        return renderDetailCard(card.title, card.items || []);\n      }\n      return createElement(\"section\", { className: \"tfv1-s4-troubleshoot-card is-\" + (card.tone || \"default\") }, [\n        createElement(\"div\", { className: \"tfv1-s4-troubleshoot-top\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-story-eyebrow\", text: translateText(card.eyebrow || \"Troubleshooting focus\") }),\n          card.category ? createElement(\"span\", { className: \"tfv1-s4-troubleshoot-pill is-\" + (card.tone || \"default\"), text: translateText(card.category) }) : null,\n        ]),\n        createElement(\"h3\", { className: \"tfv1-s4-detail-title\", text: translateText(card.title) }),\n        card.cause ? createElement(\"p\", { className: \"tfv1-s4-troubleshoot-cause\", text: translateText(card.cause) }) : null,\n        card.wear ? createElement(\"div\", { className: \"tfv1-s4-troubleshoot-meta\" }, [\n          createElement(\"span\", { className: \"tfv1-s4-troubleshoot-meta-label\", text: translateText(\"Wear signal\") }),\n          createElement(\"span\", { className: \"tfv1-s4-troubleshoot-meta-value\", text: translateText(card.wear) }),\n        ]) : null,\n        card.checkFirst && card.checkFirst.length ? createElement(\"div\", { className: \"tfv1-s4-troubleshoot-checks\" }, card.checkFirst.map(function mapItem(item) {\n          return createElement(\"span\", { className: \"tfv1-s4-troubleshoot-chip\", text: translateText(item) });\n        })) : null,\n        card.actions && card.actions.length ? createElement(\"div\", { className: \"tfv1-s4-troubleshoot-actions\" }, card.actions.map(function mapItem(item) {\n          return createElement(\"span\", { className: \"tfv1-s4-troubleshoot-action\", text: translateText(item) });\n        })) : null,\n        card.note ? createElement(\"p\", { className: \"tfv1-s4-troubleshoot-note\", text: translateText(card.note) }) : null,\n      ]);\n    }\n    \n    function renderTappingTroubleshootingFocus(cards) {\n      if (!cards || !cards.length) return null;\n      return createElement(\"section\", { className: \"tfv1-s4-troubleshoot\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-story-top\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-story-eyebrow\", text: translateText(\"Focused diagnostics\") }),\n          createElement(\"span\", { className: \"tfv1-s4-story-badge is-watch\", text: translateText(\"Use if the first holes drift\") }),\n        ]),\n        createElement(\"h3\", { className: \"tfv1-s4-story-title\", text: translateText(\"Troubleshooting focus\") }),\n        createElement(\"p\", { className: \"tfv1-s4-story-summary\", text: translateText(\"These responses are already filtered to the current setup, material behavior and the issues you flagged in Step 3.\") }),\n        createElement(\"div\", { className: \"tfv1-s4-troubleshoot-grid\" }, cards.map(function mapCard(card) {\n          return renderTappingTroubleshootingCard(card);\n        })),\n      ]);\n    }\n    \n    function renderTroubleshootingReveal(cards) {\n      if (!cards || !cards.length) return null;\n      return createStep4Reveal({\n        eyebrow: translateText(\"On-demand support\"),\n        title: translateText(\"Troubleshooting focus\"),\n        hint: translateText(\"Open if the first parts drift, the machine load spikes or the edge behavior looks unstable.\"),\n        meta: formatCountMeta(\"common.focused_plays_count\", \"{{count}} focused plays\", cards.length),\n        children: [renderTappingTroubleshootingFocus(cards)],\n      });\n    }\n    \n    function renderTappingBuyBar(commerceData, actions, source) {\n      var presentation = commerceData && commerceData.presentation || {};\n      var backAction = (actions || []).filter(function keep(action) {\n        return action && action.type === \"back_to_step3\";\n      })[0] || null;\n      var pdfButton = createPdfDownloadButton(source);\n      var priceNode;\n    \n      if (!commerceData) return null;\n    \n        if (commerceData.priceItems && commerceData.priceItems.length) {\n          priceNode = createElement(\"div\", { className: \"tfv1-s4-buy-price-stack\" }, commerceData.priceItems.map(function mapItem(item) {\n            return createElement(\"div\", { className: \"tfv1-s4-buy-price-row\" }, [\n              createElement(\"span\", { className: \"tfv1-s4-buy-price-label\" }, [\n                translateText(item.label),\n                document.createTextNode(\": \"),\n              ]),\n                createElement(\"span\", { className: \"tfv1-s4-buy-price\", text: formatStep4PriceText(item.value) }),\n              ]);\n          }));\n      } else {\n        priceNode = createElement(\"div\", { className: \"tfv1-s4-buy-price\", text: formatStep4PriceText(commerceData.priceLabel) });\n      }\n    \n      return createElement(\"div\", { className: \"tfv1-s4-buybar\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-buy-col\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-eyebrow\", text: presentation.eyebrow || t(\"step4.order_this_tool\", \"ORDER THIS TOOL\") }),\n          priceNode,\n        ]),\n          createElement(\"div\", { className: \"tfv1-s4-buy-col tfv1-s4-buy-col-status\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-eyebrow\", text: t(\"step4.status\", null) }),\n          createElement(\"div\", { className: \"tfv1-s4-buy-status\", text: presentation.availabilityLabel || (commerceData.available === false ? t(\"step4.unavailable\", null) : t(\"step4.ready_to_review\", null)) }),\n          createElement(\"div\", { className: \"tfv1-s4-buy-meta\", text: compactText(presentation.availabilityNote || \"\") }),\n          renderAdvisorStamp(source, {\n            className: \"is-inline-status\",\n            kicker: translateText(\"Mr. Edge\"),\n            label: t(\"step4.release_check_complete\", null),\n          }),\n        ]),\n        createElement(\"div\", { className: \"tfv1-s4-buy-actions\" }, [\n          createElement(\"a\", {\n            className: \"tfv1-button tfv1-button-selected tfv1-s4-buy-primary\",\n            href: commerceData.productUrl || \"#\",\n              text: resolveOpenProductLabel(commerceData.ctaLabel),\n          }),\n          backAction ? createElement(\"button\", {\n            type: \"button\",\n            className: \"tfv1-button tfv1-s4-buy-secondary\",\n              text: resolvePreferredActionLabel(backAction.label, \"step4.adjust_thread_setup\", \"Adjust thread setup\"),\n            onClick: function handleBackAction() {\n              if (typeof source.onAction === \"function\") source.onAction(backAction);\n            },\n          }) : null,\n          pdfButton,\n        ]),\n      ]);\n    }\n    \n    function renderTappingRefineBox(refineData, source) {\n      if (!refineData || refineData.visible === false || !refineData.items || !refineData.items.length) return null;\n      return createElement(\"div\", { className: \"tfv1-s4-refine\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-refine-copy\" }, [\n          createElement(\"h3\", { className: \"tfv1-s4-story-title\", text: refineData.title || t(\"step4.improve_confidence\", null) }),\n          createElement(\"p\", { className: \"tfv1-s4-trust-note\", text: refineData.description || \"\" }),\n        ]),\n        createElement(\"div\", { className: \"tfv1-s4-refine-actions\" }, (refineData.items || []).map(function mapItem(item) {\n          return createElement(\"button\", {\n            type: \"button\",\n            className: \"tfv1-s4-chip tfv1-s4-chip-action\",\n            text: item.label,\n            onClick: function handleRefineAction() {\n              if (typeof source.onAction === \"function\") {\n                source.onAction({ type: \"back_to_step3\", label: item.label, targetId: item.questionId || null });\n              }\n            },\n          });\n        })),\n      ]);\n    }\n    \n    function renderTrustReveal(cards) {\n      if (!cards || !cards.length) return null;\n      return createStep4Reveal({\n        eyebrow: translateText(\"Decision basis\"),\n        title: translateText(\"Why this recommendation is credible\"),\n        hint: translateText(\"Open to review the evidence behind the recommendation, the setup snapshot and the machine-fit read.\"),\n        meta: formatCountMeta(\"common.evidence_views_count\", \"{{count}} evidence views\", cards.length),\n        children: [createElement(\"div\", { className: \"tfv1-s4-trust-grid\" }, cards.map(function mapCard(card) {\n          return renderTappingTrustCard(card);\n        }))],\n      });\n    }\n\n    function renderCollapsedV1Step4Cards(source, options) {\n      var config = options || {};\n      var howPanel = config.howPanel || null;\n      var watchPanel = config.watchPanel || null;\n      var whyPanel = config.whyPanel || null;\n      var troubleshootingCards = Array.isArray(config.troubleshootingCards) ? config.troubleshootingCards : [];\n      var trustCards = Array.isArray(config.trustCards) ? config.trustCards : [];\n      var supportPanel = troubleshootingCards.length\n        ? renderTappingTroubleshootingFocus(troubleshootingCards)\n        : renderTappingStoryPanel({\n          tone: \"default\",\n          eyebrow: translateText(\"Focused diagnostics\"),\n          title: translateText(\"Troubleshooting focus\"),\n          badge: t(\"common.ready\", null),\n          highlight: translateText(\"No blocking guidance issues are active right now.\"),\n          summary: translateText(\"Open if the first parts drift, the machine load spikes or the edge behavior looks unstable.\"),\n          facts: [],\n          items: [t(\"step4.release_note_message\", null)],\n        }, translateText(\"Troubleshooting focus\"), [t(\"step4.release_note_message\", null)]);\n      var decisionPanel = trustCards.length\n        ? createElement(\"div\", { className: \"tfv1-s4-trust-grid\" }, trustCards.map(function mapCard(card) {\n          return renderTappingTrustCard(card);\n        }))\n        : (whyPanel || renderTappingStoryPanel({\n          tone: \"fit\",\n          eyebrow: translateText(\"Recommendation basis\"),\n          title: translateText(\"Why it fits\"),\n          badge: t(\"step4.ready_to_review\", null),\n          highlight: t(\"step4.release_note_message\", null),\n          summary: t(\"step4.review_and_release_copy\", null),\n          facts: [],\n          items: [t(\"step4.release_note_message\", null)],\n        }, translateText(\"Why it fits\"), [t(\"step4.release_note_message\", null)]));\n      var cards = [\n        createStep4Reveal({\n          eyebrow: translateText(\"Launch sequence\"),\n          title: translateText(\"Launch sequence\"),\n          hint: translateText(\"Open to review the first-pass release approach and starting notes.\"),\n          meta: translateText(\"Start plan\"),\n          leadNode: renderAdvisorStamp(source, {\n            className: \"is-summary\",\n            kicker: translateText(\"Mr. Edge\"),\n            label: translateText(\"Start note\"),\n          }),\n          children: [howPanel || renderTappingStoryPanel({\n            tone: \"start\",\n            eyebrow: translateText(\"First release\"),\n            title: translateText(\"How to start\"),\n            badge: t(\"step4.first_part_first\", null),\n            highlight: t(\"step4.release_note_start_message\", null),\n            summary: translateText(\"The first parts should confirm quality, machine load and process stability before output is increased.\"),\n            facts: [],\n            items: [t(\"step4.release_note_start_message\", null)],\n          }, translateText(\"How to start\"), [t(\"step4.release_note_start_message\", null)])],\n        }),\n        createStep4Reveal({\n          eyebrow: translateText(\"Critical signals\"),\n          title: translateText(\"Critical signals\"),\n          hint: translateText(\"Open to review the checks that matter most before widening the process window.\"),\n          meta: translateText(\"Review\"),\n          children: [watchPanel || renderTappingStoryPanel({\n            tone: \"watch\",\n            eyebrow: translateText(\"Critical signals\"),\n            title: translateText(\"Watch-outs\"),\n            badge: t(\"step4.ready_to_review\", null),\n            highlight: translateText(\"No blocking guidance issues are active right now.\"),\n            summary: translateText(\"The first parts should confirm quality, machine load and process stability before output is increased.\"),\n            facts: [],\n            items: [t(\"step4.release_note_message\", null)],\n          }, translateText(\"Watch-outs\"), [t(\"step4.release_note_message\", null)])],\n        }),\n        createStep4Reveal({\n          eyebrow: translateText(\"On-demand support\"),\n          title: translateText(\"On-demand support\"),\n          hint: translateText(\"Open if the first parts drift, the machine load spikes or the edge behavior looks unstable.\"),\n          meta: troubleshootingCards.length\n            ? formatCountMeta(\"common.focused_plays_count\", \"{{count}} focused plays\", troubleshootingCards.length)\n            : t(\"common.ready\", null),\n          children: [supportPanel],\n        }),\n        createStep4Reveal({\n          eyebrow: translateText(\"Decision basis\"),\n          title: translateText(\"Decision basis\"),\n          hint: translateText(\"Open to review the evidence behind the recommendation, the setup snapshot and the machine-fit read.\"),\n          meta: trustCards.length\n            ? formatCountMeta(\"common.evidence_views_count\", \"{{count}} evidence views\", trustCards.length)\n            : translateText(\"Recommendation basis\"),\n          children: [decisionPanel],\n        }),\n      ].filter(Boolean);\n\n      return createElement(\"div\", { className: \"tfv1-s4-v1-support-stack\" }, cards);\n    }\n    \n    function renderTappingDetails(threadBlock, toleranceBlock, setupBlock, fitBlock, alternativesBlock) {\n      var setupPresentation = setupBlock && setupBlock.data && setupBlock.data.presentation || {};\n      var detailPanels = setupPresentation.detailPanels || [];\n      var detailCards = [];\n      var threadItems = [];\n      var fitItems = [];\n      var alternativeItems = [];\n    \n      function renderTechSummaryPanel(panel) {\n        return createElement(\"section\", { className: \"tfv1-s4-tech-card is-\" + (panel.tone || \"default\") }, [\n          createElement(\"div\", { className: \"tfv1-s4-tech-eyebrow\", text: panel.eyebrow || translateText(\"Technical basis\") }),\n          createElement(\"h3\", { className: \"tfv1-s4-tech-title\", text: translateText(panel.title || \"\") }),\n          panel.summary ? createElement(\"p\", { className: \"tfv1-s4-tech-summary\", text: translateText(panel.summary) }) : null,\n          panel.facts && panel.facts.length ? createElement(\"div\", { className: \"tfv1-s4-tech-facts\" }, panel.facts.map(function mapFact(item) {\n            return createElement(\"span\", { className: \"tfv1-s4-tech-fact\", text: translateText(item) });\n          })) : null,\n          panel.items && panel.items.length ? createElement(\"div\", { className: \"tfv1-s4-tech-notes\" }, panel.items.map(function mapItem(item) {\n            return createElement(\"div\", { className: \"tfv1-s4-tech-note\", text: translateText(item) });\n          })) : null,\n        ]);\n      }\n    \n      function renderTechAlternativesPanel(panel) {\n        return createElement(\"section\", { className: \"tfv1-s4-tech-card is-alternatives\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-tech-eyebrow\", text: panel.eyebrow || translateText(\"Alternatives\") }),\n          createElement(\"h3\", { className: \"tfv1-s4-tech-title\", text: panel.title || translateText(\"Alternatives worth checking\") }),\n          panel.summary ? createElement(\"p\", { className: \"tfv1-s4-tech-summary\", text: translateText(panel.summary) }) : null,\n          createElement(\"div\", { className: \"tfv1-s4-tech-alt-grid\" }, (panel.items || []).map(function mapItem(item) {\n            return createElement(\"div\", { className: \"tfv1-s4-tech-alt\" }, [\n              item.badge ? createElement(\"span\", { className: \"tfv1-s4-tech-alt-badge\", text: translateText(item.badge) }) : null,\n              createElement(\"div\", { className: \"tfv1-s4-tech-alt-title\", text: translateText(item.label || \"\") }),\n              item.reason ? createElement(\"div\", { className: \"tfv1-s4-tech-alt-reason\", text: translateText(item.reason) }) : null,\n            ]);\n          })),\n        ]);\n      }\n    \n      if (detailPanels.length) {\n        return createElement(\"details\", { className: \"tfv1-s4-details\" }, [\n          createElement(\"summary\", { text: translateText(\"Data confidence & technical details\") }),\n          createElement(\"div\", { className: \"tfv1-s4-tech-grid\" }, detailPanels.map(function mapPanel(panel) {\n            return panel && panel.type === \"alternatives\"\n              ? renderTechAlternativesPanel(panel)\n              : renderTechSummaryPanel(panel);\n          })),\n        ]);\n      }\n    \n      if (threadBlock && threadBlock.data) {\n        threadItems = [\n          formatLabelValue(\"Standard\", threadBlock.data.standard || \"n/a\"),\n          formatLabelValue(\"Size\", threadBlock.data.size || \"n/a\"),\n          formatLabelValue(\"Pitch\", threadBlock.data.pitch || \"n/a\"),\n          formatLabelValue(\"Tolerance\", threadBlock.data.tolerance || \"n/a\"),\n        ];\n      }\n    \n      if (fitBlock && fitBlock.data && Array.isArray(fitBlock.data.items)) {\n        fitItems = fitBlock.data.items.map(function mapItem(item) {\n          return formatLabelValue(item.label, item.value);\n        });\n      }\n    \n      if (alternativesBlock && alternativesBlock.data && Array.isArray(alternativesBlock.data.items)) {\n        alternativeItems = alternativesBlock.data.items.map(function mapItem(item) {\n          return formatLabelScoreReason(item.label, item.score, item.reason);\n        });\n      }\n    \n      detailCards.push(renderDetailCard(translateText(\"Thread snapshot\"), threadItems));\n      detailCards.push(renderDetailCard(translateText(\"Quality and tolerance\"), toleranceBlock && toleranceBlock.data && toleranceBlock.data.notes || []));\n      detailCards.push(renderDetailCard(translateText(\"Setup guidance\"), (setupBlock && setupBlock.data && setupBlock.data.notes || []).map(function mapNote(note) {\n        return formatLabelValue(titleCaseToken(note.area), note.message);\n      })));\n      detailCards.push(renderDetailCard(translateText(\"Decision signals\"), fitItems));\n      detailCards.push(renderDetailCard(translateText(\"Alternatives worth checking\"), alternativeItems));\n      detailCards = detailCards.filter(Boolean);\n    \n      if (!detailCards.length) return null;\n    \n      return createElement(\"details\", { className: \"tfv1-s4-details\" }, [\n        createElement(\"summary\", { text: translateText(\"Data confidence & technical details\") }),\n        createElement(\"div\", { className: \"tfv1-s4-details-grid\" }, detailCards),\n      ]);\n    }\n    \n    function renderTappingThroughResult(source) {\n      var viewModel = source.resultViewModel;\n      var blocks = viewModel.blocks || [];\n      var heroBlock = findBlock(blocks, \"hero_recommendation\");\n      var recipeBlock = findBlock(blocks, \"recipe_start_values\");\n      var machineBlock = findBlock(blocks, \"machine_feasibility\");\n      var riskBlock = findBlock(blocks, \"risk_notes\");\n      var setupBlock = findBlock(blocks, \"setup_notes\");\n      var toleranceBlock = findBlock(blocks, \"tolerance_notes\");\n      var threadBlock = findBlock(blocks, \"thread_identity\");\n      var fitBlock = findBlock(blocks, \"fit_kpis\");\n      var commerceBlock = findBlock(blocks, \"commerce_cta\");\n      var alternativesBlock = findBlock(blocks, \"alternatives\");\n      var bundleBlock = findBlock(blocks, \"bundle_recommendation\");\n      var heroData = heroBlock && heroBlock.data || {};\n      var heroPresentation = heroData.presentation || {};\n      var recipeData = recipeBlock && recipeBlock.data || {};\n      var recipePresentation = recipeData.presentation || {};\n      var machinePresentation = machineBlock && machineBlock.data && machineBlock.data.presentation || {};\n      var riskPresentation = riskBlock && riskBlock.data && riskBlock.data.presentation || {};\n      var setupPresentation = setupBlock && setupBlock.data && setupBlock.data.presentation || {};\n      var storyData = setupPresentation.stories || {};\n      var storyPanels = setupPresentation.storyPanels || {};\n      var troubleshootingCards = setupPresentation.troubleshooting || [];\n      var startPrimary = recipePresentation.primaryValues || [];\n      var startSecondary = recipePresentation.secondaryValues || [];\n      var rowBackedValues = recipePresentation.rowBackedValues || [];\n      var machineValues = recipePresentation.machineValues || [];\n      var startValues = recipeData.values || [];\n      var holePrepCard = recipePresentation.holePrepCard || null;\n      var auxiliaryCard = recipePresentation.auxiliaryCard || null;\n      var whyPanel;\n      var howPanel;\n      var watchPanel;\n      var trustCards;\n      var heroVisual;\n      var advisorInline;\n      var actionBar;\n    \n      if (!heroBlock || (!startPrimary.length && !startValues.length)) return null;\n    \n      if (!startPrimary.length && startValues.length) {\n        startPrimary = startValues.map(function mapItem(item) {\n          var value = item.typ != null ? item.typ : (item.min != null ? item.min : item.max);\n          return {\n            label: String(item.label || \"\").toUpperCase(),\n            value: value == null ? null : String(value),\n            unit: item.unit || null,\n          };\n        }).filter(function keep(item) { return item.value != null; });\n      }\n    \n      if (!rowBackedValues.length) rowBackedValues = startPrimary;\n      if (!machineValues.length) machineValues = startSecondary;\n    \n      whyPanel = renderTappingStoryPanel(storyPanels.why, translateText(\"Why it fits\"), storyData.why || heroData.reasons || []);\n      howPanel = renderTappingStoryPanel(storyPanels.how, translateText(\"How to start\"), storyData.how || []);\n      watchPanel = renderTappingStoryPanel(storyPanels.watch, translateText(\"Watch-outs\"), storyData.watch || ((riskBlock && riskBlock.data && riskBlock.data.items || []).map(function mapRisk(item) {\n        return item.title + \": \" + item.message;\n      })));\n      trustCards = [\n        recipePresentation.trustCard,\n        holePrepCard,\n        auxiliaryCard,\n        machinePresentation.trustCard || {\n          title: translateText(\"Machine fit\"),\n          tone: machinePresentation.tone || \"default\",\n          badge: translateText(machinePresentation.value || \"Review\"),\n          value: translateText(machinePresentation.note || \"\"),\n          note: translateText(riskPresentation.note || \"\"),\n          items: machinePresentation.items || [],\n        },\n      ].filter(Boolean);\n      heroVisual = renderHeroVisualRail(heroData, source, {\n        badgeLabel: t(\"step4.mr_edge_reviewed\", null),\n      });\n      advisorInline = renderAdvisorInline(source, {\n        eyebrow: t(\"step4.release_note\", null),\n        message: t(\"step4.release_note_start_message\", null),\n        context: [heroData.variantTitle, heroData.sku ? t(\"common.sku_value\", null, { value: heroData.sku }) : null].filter(Boolean).join(\" | \") || null,\n      });\n      actionBar = renderUnifiedActionBar(viewModel, commerceBlock, heroData, source);\n    \n      return createElement(\"section\", { className: \"tfv1-s4-hero\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-hero-top\" + (heroVisual ? \" has-visual\" : \"\") }, [\n          createElement(\"div\", { className: \"tfv1-s4-hero-main\" }, [\n            createElement(\"div\", { className: \"tfv1-s4-kicker\", text: compactText(heroPresentation.kicker || translateText(\"Recommended tool\")) }),\n            createElement(\"div\", { className: \"tfv1-s4-title-row\" }, [\n              createElement(\"h2\", { className: \"tfv1-s4-title\", text: heroData.productTitle || translateText(\"Recommended tool\") }),\n              heroData.productUrl ? createElement(\"a\", {\n                className: \"tfv1-s4-link\",\n                href: heroData.productUrl,\n                text: t(\"step4.product_details_link\", null),\n              }) : null,\n            ]),\n            heroPresentation.summaryLine ? createElement(\"p\", { className: \"tfv1-s4-summary\", text: compactText(heroPresentation.summaryLine) }) : null,\n            heroPresentation.headerPills && heroPresentation.headerPills.length ? createElement(\"div\", { className: \"tfv1-s4-pills\" }, heroPresentation.headerPills.map(function mapPill(pill) {\n              return createElement(\"span\", { className: \"tfv1-s4-chip is-\" + (pill.tone || \"default\"), text: compactText(pill.text) });\n            })) : null,\n          ]),\n          heroVisual,\n          actionBar,\n        ]),\n        renderSetupPackageCard(bundleBlock, heroData, setupBlock),\n        renderStartHereCard({\n          description: recipePresentation.description,\n          rowBackedValues: rowBackedValues,\n          machineValues: machineValues,\n          advisorInline: advisorInline,\n        }),\n        renderAlternativeChoicesCard(alternativesBlock, heroData),\n        renderCollapsedV1Step4Cards(source, {\n          whyPanel: whyPanel,\n          howPanel: howPanel,\n          watchPanel: watchPanel,\n          troubleshootingCards: troubleshootingCards,\n          trustCards: trustCards,\n        }),\n      ]);\n    }\n    \n    function humanizeToken(value) {\n      return String(value == null ? \"\" : value).replace(/[_-]+/g, \" \").trim();\n    }\n    \n    function titleCaseToken(value) {\n      return humanizeToken(value).split(/\\s+/).filter(Boolean).map(function mapWord(word) {\n        return word.charAt(0).toUpperCase() + word.slice(1);\n      }).join(\" \");\n    }\n    \n    function compactText(value) {\n      return translateText(String(value == null ? \"\" : value).replace(/\\s+/g, \" \").trim());\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).map(compactText).filter(function keep(text) {\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function getConfidenceLabel(confidence) {\n      if (!Number.isFinite(confidence)) return translateText(\"Review\");\n      if (confidence >= 0.88) return translateText(\"High\");\n      if (confidence >= 0.75) return translateText(\"Medium\");\n      return translateText(\"Review\");\n    }\n    \n    function getConfidenceTone(confidence) {\n      if (!Number.isFinite(confidence)) return \"conf-low\";\n      if (confidence >= 0.88) return \"conf-high\";\n      if (confidence >= 0.75) return \"conf-medium\";\n      return \"conf-low\";\n    }\n    \n    function getRecipeSourceLabel(source) {\n      switch (String(source || \"\").toLowerCase()) {\n        case \"exact\":\n          return translateText(\"Exact row\");\n        case \"near\":\n          return translateText(\"Closest row\");\n        case \"estimated\":\n          return translateText(\"Estimated\");\n        case \"none\":\n          return translateText(\"Process rules\");\n        default:\n          return translateText(\"Process rules\");\n      }\n    }\n    \n    function getRecipeSourceTone(source) {\n      switch (String(source || \"\").toLowerCase()) {\n        case \"exact\":\n          return \"source-exact\";\n        case \"near\":\n          return \"source-near\";\n        default:\n          return \"source-default\";\n      }\n    }\n    \n    function getRecipeTrustTone(source) {\n      switch (String(source || \"\").toLowerCase()) {\n        case \"exact\":\n          return \"exact\";\n        case \"near\":\n          return \"near\";\n        default:\n          return \"default\";\n      }\n    }\n    \n    function isMachineMetric(item) {\n      var key = String(item && (item.key || item.label) || \"\").toLowerCase().replace(/\\s+/g, \"_\");\n      return [\n        \"n\",\n        \"rpm\",\n        \"vf\",\n        \"feed_speed\",\n        \"q\",\n        \"mrr\",\n        \"time\",\n        \"cycle_time\",\n        \"z\",\n      ].indexOf(key) >= 0;\n    }\n    \n    function formatMetricLabel(item) {\n      var raw = String(item && (item.label || item.key) || \"\").trim();\n      if (!raw) return \"Value\";\n      if (/^[a-z]{1,4}$/i.test(raw) || /%/.test(raw)) return raw.toUpperCase();\n      return titleCaseToken(raw);\n    }\n    \n    function formatMetricTileValue(item) {\n      if (!item) return \"n/a\";\n      if (item.typ != null) return String(item.typ);\n      if (item.min != null && item.max != null) return String(item.min) + \" - \" + String(item.max);\n      if (item.min != null) return String(item.min);\n      if (item.max != null) return String(item.max);\n      return \"n/a\";\n    }\n    \n    function formatMetricBandValue(item) {\n      var parts = [];\n      if (!item) return \"n/a\";\n      if (item.min != null) parts.push(\"min \" + item.min);\n      if (item.typ != null) parts.push(\"typ \" + item.typ);\n      if (item.max != null) parts.push(\"max \" + item.max);\n      if (!parts.length) return \"n/a\";\n      return parts.join(\" / \") + (item.unit ? \" \" + item.unit : \"\");\n    }\n    \n    function buildMetricGroups(recipeBlock) {\n      var values = recipeBlock && recipeBlock.data && Array.isArray(recipeBlock.data.values)\n        ? recipeBlock.data.values\n        : [];\n      var primary = [];\n      var machine = [];\n    \n      values.forEach(function eachValue(item) {\n        var tile = {\n          label: formatMetricLabel(item),\n          value: formatMetricTileValue(item),\n          unit: item.unit || null,\n          tone: item.unit ? null : \"text\",\n        };\n        if (isMachineMetric(item)) {\n          machine.push(tile);\n          return;\n        }\n        primary.push(tile);\n      });\n    \n      return {\n        primary: primary.slice(0, 6),\n        machine: machine.slice(0, 4),\n        bands: values.map(function mapBand(item) {\n          return formatMetricLabel(item) + \": \" + formatMetricBandValue(item);\n        }),\n      };\n    }\n    \n    function buildPdfToolMeta(heroData) {\n      return compactText([\n        heroData && heroData.variantTitle,\n        heroData && heroData.sku ? t(\"common.sku_value\", null, { value: heroData.sku }) : null,\n      ].filter(Boolean).join(\" | \"));\n    }\n    \n    function buildPdfHeroSignals(heroData, source) {\n      var presentation = heroData && heroData.presentation || {};\n      var pills = Array.isArray(presentation.headerPills) ? presentation.headerPills : [];\n      var texts = pills.map(function mapPill(pill) {\n        return pill && pill.text ? translateText(pill.text) : null;\n      }).map(compactText).filter(hasPdfText);\n    \n      if (texts.length) return dedupeTextItems(texts).slice(0, 6);\n    \n      return dedupeTextItems([\n        getPdfOutcomeLabel(source && source.resultViewModel),\n        getPdfProcessLabel(source),\n        getPdfMaterialLabel(source),\n      ]).slice(0, 4);\n    }\n    \n    function buildPdfSnapshotEntries(source, heroData, recipeBlock) {\n      var entries = [];\n    \n      entries.push({\n        label: t(\"pdf.cover.status_label\", null),\n        value: getPdfOutcomeLabel(source && source.resultViewModel),\n        tone: \"cool\",\n      });\n      if (hasPdfText(getPdfMaterialLabel(source))) {\n        entries.push({\n          label: t(\"pdf.cover.material_label\", null),\n          value: getPdfMaterialLabel(source),\n          tone: \"warm\",\n        });\n      }\n      if (hasPdfText(getPdfProcessLabel(source))) {\n        entries.push({\n          label: t(\"pdf.cover.process_label\", null),\n          value: getPdfProcessLabel(source),\n          tone: \"cool\",\n        });\n      }\n      if (Number.isFinite(heroData && heroData.confidence)) {\n        entries.push({\n          label: t(\"pdf.cover.confidence_label\", null),\n          value: getConfidenceLabel(heroData.confidence),\n          tone: \"warm\",\n        });\n      }\n      if (recipeBlock && recipeBlock.data && hasPdfText(getRecipeSourceLabel(recipeBlock.data.source))) {\n        entries.push({\n          label: t(\"pdf.cover.data_basis_label\", null),\n          value: getRecipeSourceLabel(recipeBlock.data.source),\n          tone: \"cool\",\n        });\n      }\n    \n      return entries;\n    }\n    \n    function buildPdfInputEntries(source) {\n      var questionViewModels = source && Array.isArray(source.questionViewModels) ? source.questionViewModels : [];\n      var rawAnswers = source && source.answers ? source.answers : {};\n      var normalizedAnswers = source && source.normalizedAnswers ? source.normalizedAnswers : {};\n    \n      return questionViewModels.reduce(function reduceEntries(entries, viewModel) {\n        var rawValue;\n        var displayValue;\n    \n        if (!viewModel || viewModel.visible === false || viewModel.type === \"display\") return entries;\n        rawValue = Object.prototype.hasOwnProperty.call(rawAnswers, viewModel.id)\n          ? rawAnswers[viewModel.id]\n          : Object.prototype.hasOwnProperty.call(normalizedAnswers, viewModel.id)\n            ? normalizedAnswers[viewModel.id]\n            : viewModel.value;\n        displayValue = formatPdfAnswerValue(viewModel, rawValue);\n        if (!hasPdfText(viewModel.label) || !hasPdfText(displayValue)) return entries;\n        entries.push({\n          label: compactText(translateText(viewModel.label)),\n          value: compactText(translateText(displayValue)),\n          emphasis: viewModel.type === \"number\" ? \"metric\" : \"default\",\n          tone: viewModel.type === \"number\" ? \"cool\" : \"warm\",\n        });\n        return entries;\n      }, []);\n    }\n    \n    function buildPdfRecipeMetricEntries(items, fallbackEntries) {\n      var sourceItems = Array.isArray(items) && items.length ? items : null;\n      var fallback = Array.isArray(fallbackEntries) ? fallbackEntries : [];\n    \n      if (sourceItems) {\n        return sourceItems.reduce(function reduceItems(list, item) {\n          var valueText = item && item.value != null ? String(item.value) : \"\";\n          if (!hasPdfText(item && item.label) || !hasPdfText(valueText)) return list;\n          list.push({\n            label: compactText(translateText(item.label)),\n            value: compactText(valueText),\n            note: hasPdfText(item.unit) ? compactText(item.unit) : null,\n            emphasis: \"metric\",\n            tone: \"cool\",\n          });\n          return list;\n        }, []);\n      }\n    \n      return fallback.reduce(function reduceFallback(list, entry) {\n        if (!hasPdfText(entry && entry.label) || !hasPdfText(entry && entry.value)) return list;\n        list.push({\n          label: compactText(translateText(entry.label)),\n          value: compactText(String(entry.value)),\n          note: hasPdfText(entry.unit) ? compactText(entry.unit) : null,\n          emphasis: \"metric\",\n          tone: \"cool\",\n        });\n        return list;\n      }, []);\n    }\n    \n    function buildPdfBundleCardData(block, mediaAssets) {\n      var data = block && block.data || {};\n      var body = data.body || {};\n      var insert = data.insert || {};\n      var bodyAsset = findPdfMediaAsset(mediaAssets, \"bundle_body\");\n      var insertAsset = findPdfMediaAsset(mediaAssets, \"bundle_insert\");\n    \n      return {\n        eyebrow: compactText(translateText(data.eyebrow || \"Recommended setup\")) || null,\n        facts: dedupeTextItems((data.facts || []).map(translateText)).slice(0, 6),\n        body: {\n          label: compactText(translateText(\"Body\")),\n          title: compactText([body.productTitle, body.variantTitle].filter(Boolean).join(\" / \")),\n          meta: compactText([\n            body.sku ? formatLabelValue(\"SKU\", body.sku) : null,\n            body.priceLabel ? formatLabelValue(\"Unit price\", formatStep4PriceText(body.priceLabel)) : null,\n          ].filter(Boolean).join(\" | \")),\n          link: compactText(body.productUrl),\n          imageAlias: bodyAsset ? bodyAsset.alias : null,\n        },\n        insert: {\n          label: compactText(translateText(\"Insert\")),\n          title: compactText([insert.productTitle, insert.variantTitle].filter(Boolean).join(\" / \")),\n          meta: compactText([\n            insert.sku ? formatLabelValue(\"SKU\", insert.sku) : null,\n            insert.priceLabel ? formatLabelValue(\"Unit price\", formatStep4PriceText(insert.priceLabel)) : null,\n          ].filter(Boolean).join(\" | \")),\n          link: compactText(insert.productUrl),\n          imageAlias: insertAsset ? insertAsset.alias : null,\n          attributes: [\n            insert.gradeCode ? { label: translateText(\"Grade\"), value: insert.gradeCode } : null,\n            insert.sizeCode ? { label: translateText(\"Size\"), value: insert.sizeCode } : null,\n            insert.chipbreaker ? { label: translateText(\"Chipbreaker\"), value: insert.chipbreaker } : null,\n            insert.cornerRadiusMm ? { label: translateText(\"Corner radius\"), value: insert.cornerRadiusMm } : null,\n          ].filter(Boolean),\n        },\n        notes: dedupeTextItems((data.notes || []).map(translateText)),\n      };\n    }\n    \n    function buildThreadLines(threadBlock) {\n      var data = threadBlock && threadBlock.data || {};\n      return dedupeTextItems([\n        data.standard ? formatLabelValue(\"Standard\", data.standard) : null,\n        data.size ? formatLabelValue(\"Size\", data.size) : null,\n        data.pitch ? formatLabelValue(\"Pitch\", data.pitch) : null,\n        data.tolerance ? formatLabelValue(\"Tolerance\", data.tolerance) : null,\n      ]);\n    }\n    \n    function buildHoleLines(holeBlock) {\n      var data = holeBlock && holeBlock.data || {};\n      return dedupeTextItems([\n        data.diameterMm != null ? formatLabelValue(\"Diameter\", String(data.diameterMm) + \" mm\") : null,\n        data.depthMm != null ? formatLabelValue(\"Depth\", String(data.depthMm) + \" mm\") : null,\n        data.depthRatio != null ? formatLabelValue(\"Depth ratio\", data.depthRatio) : null,\n        data.blindThrough ? formatLabelValue(\"Hole type\", titleCaseToken(data.blindThrough)) : null,\n      ]);\n    }\n    \n    function buildFeatureLines(featureBlock) {\n      return dedupeTextItems((featureBlock && featureBlock.data && featureBlock.data.items || []).map(function mapItem(item) {\n        return item && item.label ? formatLabelValue(item.label, item.value) : null;\n      }));\n    }\n    \n    function buildGeometryLines(geometryBlock) {\n      return dedupeTextItems((geometryBlock && geometryBlock.data && geometryBlock.data.items || []).map(function mapItem(item) {\n        var parts = [];\n        if (!item) return null;\n        if (item.label) parts.push(translateText(item.label) + \":\");\n        if (item.actual) parts.push(translateText(\"actual\") + \" \" + item.actual);\n        if (item.target) parts.push(translateText(\"target\") + \" \" + item.target);\n        if (item.result) parts.push(\"(\" + translateText(item.result) + \")\");\n        return parts.join(\" \");\n      }));\n    }\n    \n    function buildFitLines(fitBlock) {\n      return dedupeTextItems((fitBlock && fitBlock.data && fitBlock.data.items || []).map(function mapItem(item) {\n        return item && item.label ? translateText(item.label) + \": \" + item.value + (item.status ? \" [\" + translateText(item.status) + \"]\" : \"\") : null;\n      }));\n    }\n    \n    function buildToleranceLines(toleranceBlock) {\n      return dedupeTextItems((toleranceBlock && toleranceBlock.data && toleranceBlock.data.notes || []).slice());\n    }\n    \n    function buildMachineLines(machineBlock) {\n      return dedupeTextItems((machineBlock && machineBlock.data && machineBlock.data.checks || []).map(function mapItem(item) {\n        return item && item.label\n          ? translateText(item.label) + \": \" + translateText(titleCaseToken(item.result || \"review\")) + (item.note ? \" - \" + translateText(item.note) : \"\")\n          : null;\n      }));\n    }\n    \n    function buildSetupLine(item) {\n      var area;\n      var message;\n      if (!item) return null;\n      if (typeof item === \"string\") return translateText(item);\n      area = compactText(titleCaseToken(item.area || \"\"));\n      message = compactText(item.message || \"\");\n      if (!area) return message;\n      if (!message) return area;\n      if (message.toLowerCase().indexOf(area.toLowerCase() + \":\") === 0) return message;\n      return formatLabelValue(area, message);\n    }\n    \n    function buildSetupLines(setupBlock) {\n      return dedupeTextItems((setupBlock && setupBlock.data && setupBlock.data.notes || []).map(function mapItem(item) {\n        return buildSetupLine(item);\n      }));\n    }\n    \n    function buildRiskLines(riskBlock, warningBlock) {\n      return dedupeTextItems([]\n        .concat((riskBlock && riskBlock.data && riskBlock.data.items || []).map(function mapItem(item) {\n          return item && item.title ? translateText(item.title) + \": \" + translateText(item.message) : item && item.message ? translateText(item.message) : null;\n        }))\n        .concat(warningBlock && warningBlock.data && warningBlock.data.message ? [translateText(warningBlock.data.message)] : []));\n    }\n    \n    function buildAlternativeLines(alternativesBlock) {\n      return dedupeTextItems((alternativesBlock && alternativesBlock.data && alternativesBlock.data.items || []).map(function mapItem(item) {\n        return item && item.label ? translateText(item.label) + (item.reason ? \" - \" + translateText(item.reason) : \"\") : null;\n      }));\n    }\n    \n    function hasPdfText(value) {\n      var text = compactText(value);\n      return !!text && text !== \"-\" && text.toLowerCase() !== \"n/a\";\n    }\n    \n    function normalizePdfTextValue(value) {\n      return String(value == null ? \"\" : value).replace(/\\s+/g, \" \").trim();\n    }\n    \n    function getPdfLocaleInfo() {\n      var runtimeI18n = getRuntimeI18n();\n      var currentLocale = normalizePdfTextValue(runtimeI18n && (runtimeI18n.__locale || runtimeI18n.locale)).toLowerCase().split(/[-_]/)[0];\n      var sourceLocale = normalizePdfTextValue(runtimeI18n && runtimeI18n.__sourceLocale).toLowerCase().split(/[-_]/)[0] || \"en\";\n    \n      return {\n        current: currentLocale || sourceLocale || \"en\",\n        source: sourceLocale || \"en\",\n      };\n    }\n    \n    function isPdfDataLikeText(value) {\n      var text = normalizePdfTextValue(value);\n    \n      if (!text) return true;\n      if (/^(https?:\\/\\/|www\\.)/i.test(text)) return true;\n      if (/^[\\d\\s.,/+%:;()_-]+$/.test(text)) return true;\n      if (/^[A-Z0-9][A-Z0-9 ._\\/:+-]*$/.test(text) && !/[a-z]/.test(text)) return true;\n      if (/^(n\\/a|mm|rpm|m\\/min|mm\\/min|cm3\\/min|deg|vc|vf|fz|ap|ae|mrr|sku)$/i.test(text)) return true;\n      return false;\n    }\n    \n    function shouldDropPdfUnlocalizedCopy(original, translated) {\n      var locale = getPdfLocaleInfo();\n      var source = normalizePdfTextValue(original);\n      var result = normalizePdfTextValue(translated);\n    \n      if (!source || !result) return false;\n      if (locale.current === locale.source) return false;\n      if (source !== result) return false;\n      if (isPdfDataLikeText(source)) return false;\n      return /[A-Za-z\u00C3\u201E\u00C3\u2013\u00C3\u0153\u00C3\u00A4\u00C3\u00B6\u00C3\u00BC]/.test(source);\n    }\n    \n    function shouldDropPdfUiCopy(original, translated) {\n      var locale = getPdfLocaleInfo();\n      var source = normalizePdfTextValue(original);\n      var result = normalizePdfTextValue(translated);\n    \n      if (!source || !result) return false;\n      if (locale.current === locale.source) return false;\n      if (source !== result) return false;\n      if (isPdfDataLikeText(source)) return false;\n      return /[A-Za-z]/.test(source);\n    }\n    \n    function compactPdfUiText(value, options) {\n      var config = options || {};\n      var sourceText = normalizePdfTextValue(value);\n      var translatedText;\n    \n      if (!sourceText) return null;\n      translatedText = normalizePdfTextValue(translateText(sourceText));\n      if (!hasPdfText(translatedText)) return null;\n      if (config.dropUnlocalized !== false && shouldDropPdfUiCopy(sourceText, translatedText)) {\n        return null;\n      }\n      return translatedText;\n    }\n    \n    function pushPdfKeyValue(items, label, value) {\n      var safeLabel = compactText(translateText(label));\n      var safeValue = compactText(translateText(value));\n      if (!hasPdfText(safeLabel) || !hasPdfText(safeValue)) return;\n      items.push({ type: \"key_value\", label: safeLabel, value: safeValue });\n    }\n    \n    function pushPdfParagraph(items, text) {\n      var safeText = compactText(translateText(text));\n      if (!hasPdfText(safeText)) return;\n      items.push({ type: \"paragraph\", text: safeText });\n    }\n    \n    function pushPdfBullets(items, title, entries) {\n      var filtered = (entries || []).map(translateText).map(compactText).filter(hasPdfText);\n      if (!filtered.length) return;\n      if (hasPdfText(title)) {\n        items.push({ type: \"subheading\", text: compactText(translateText(title)) });\n      }\n      items.push({ type: \"bullets\", items: filtered });\n    }\n    \n    function pushPdfCallout(items, config) {\n      var eyebrow = compactText(translateText(config && config.eyebrow));\n      var title = compactText(translateText(config && config.title));\n      var text = compactText(translateText(config && config.text));\n    \n      if (!hasPdfText(eyebrow) && !hasPdfText(title) && !hasPdfText(text)) return;\n    \n      items.push({\n        type: \"callout\",\n        eyebrow: hasPdfText(eyebrow) ? eyebrow : null,\n        title: hasPdfText(title) ? title : null,\n        text: hasPdfText(text) ? text : null,\n        tone: compactText(config && config.tone) || \"accent\",\n      });\n    }\n    \n    function pushPdfUiParagraph(items, text) {\n      var safeText = compactPdfUiText(text);\n      if (!hasPdfText(safeText)) return;\n      items.push({ type: \"paragraph\", text: safeText });\n    }\n    \n    function pushPdfUiBullets(items, title, entries) {\n      var filtered = (entries || []).map(function mapItem(entry) {\n        return compactPdfUiText(entry);\n      }).filter(hasPdfText);\n    \n      if (!filtered.length) return;\n      if (hasPdfText(title)) {\n        items.push({ type: \"subheading\", text: compactText(translateText(title)) });\n      }\n      items.push({ type: \"bullets\", items: filtered });\n    }\n    \n    function pushPdfUiCallout(items, config) {\n      var eyebrow = compactPdfUiText(config && config.eyebrow);\n      var title = compactPdfUiText(config && config.title);\n      var text = compactPdfUiText(config && config.text);\n    \n      if (!hasPdfText(eyebrow) && !hasPdfText(title) && !hasPdfText(text)) return;\n    \n      items.push({\n        type: \"callout\",\n        eyebrow: hasPdfText(eyebrow) ? eyebrow : null,\n        title: hasPdfText(title) ? title : null,\n        text: hasPdfText(text) ? text : null,\n        tone: compactText(config && config.tone) || \"accent\",\n      });\n    }\n    \n    function pushPdfStatsGrid(items, entries, config) {\n      var options = config || {};\n      var filtered = (entries || []).reduce(function reduceItems(list, entry) {\n        var label = compactText(translateText(entry && entry.label));\n        var value = compactText(translateText(entry && entry.value));\n        var note = compactText(translateText(entry && entry.note));\n    \n        if (!hasPdfText(label) || !hasPdfText(value)) return list;\n        list.push({\n          label: label,\n          value: value,\n          note: hasPdfText(note) ? note : null,\n          tone: compactText(entry && entry.tone) || null,\n          emphasis: compactText(entry && entry.emphasis) || null,\n        });\n        return list;\n      }, []);\n    \n      if (!filtered.length) return;\n    \n      items.push(Object.assign({\n        type: \"stats_grid\",\n        items: filtered,\n      }, options));\n    }\n    \n    function hasUnitSuffix(text, unit) {\n      var normalizedText = compactText(text).toLowerCase();\n      var normalizedUnit = compactText(unit).toLowerCase();\n      return !!normalizedUnit && normalizedText.slice(-normalizedUnit.length) === normalizedUnit;\n    }\n    \n    function findQuestionOptionLabel(viewModel, rawValue) {\n      var options = viewModel && Array.isArray(viewModel.options) ? viewModel.options : [];\n      var token = compactText(rawValue);\n      var index;\n      for (index = 0; index < options.length; index += 1) {\n        if (compactText(options[index] && options[index].value) === token) {\n          return compactText(options[index].label);\n        }\n      }\n      return null;\n    }\n    \n    function formatPdfAnswerValue(viewModel, rawValue) {\n      var text;\n      var optionLabel;\n    \n      if (rawValue == null || rawValue === \"\") return null;\n      if (Array.isArray(rawValue)) {\n        text = rawValue.map(function mapItem(item) {\n          return formatPdfAnswerValue(viewModel, item);\n        }).filter(hasPdfText).join(\", \");\n        return hasPdfText(text) ? text : null;\n      }\n      if (typeof rawValue === \"boolean\") {\n        return rawValue ? t(\"common.yes\", null) : t(\"common.no\", null);\n      }\n    \n      optionLabel = findQuestionOptionLabel(viewModel, rawValue);\n      if (hasPdfText(optionLabel)) return optionLabel;\n    \n      text = compactText(rawValue);\n      if (!hasPdfText(text)) return null;\n    \n      if (viewModel && viewModel.type === \"boolean\") {\n        if (/^(true|yes|y|1)$/i.test(text)) return t(\"common.yes\", null);\n        if (/^(false|no|n|0)$/i.test(text)) return t(\"common.no\", null);\n      }\n    \n      if (viewModel && viewModel.type === \"number\" && hasPdfText(viewModel.unit) && !hasUnitSuffix(text, viewModel.unit)) {\n        return text + \" \" + viewModel.unit;\n      }\n      return text;\n    }\n    \n    function getPdfOutcomeLabel(viewModel) {\n      switch (viewModel && viewModel.outcome) {\n        case \"match\":\n          return translateText(\"Best fit\");\n        case \"limited_match\":\n          return translateText(\"Limited match\");\n        case \"no_match\":\n          return translateText(\"No safe recommendation yet\");\n        case \"insufficient_data\":\n          return translateText(\"More input required\");\n        default:\n          return translateText(\"Recommendation\");\n      }\n    }\n    \n    function getPdfBuilder() {\n      return typeof window !== \"undefined\" ? window.EdgeVendSimplePdf : null;\n    }\n    \n    function isPdfExportEnabled(source) {\n      return !!(source && source.resultViewModel) && !(source.runtimeConfig && source.runtimeConfig.shadowModeEnabled === true);\n    }\n    \n    function getPdfProcessLabel(source) {\n      return compactText(translateText(source && (source.processLabel || titleCaseToken(source.processId || source.resultViewModel && source.resultViewModel.processId || \"Process\"))));\n    }\n    \n    function getPdfMaterialLabel(source) {\n      return compactText(translateText(source && (source.materialLabel || source.materialCode || \"\")));\n    }\n    \n    function getAdvisorProfile(source) {\n      var media = getAdvisorMedia(source);\n      var name = translateText(media.advisorName || \"Mr. Edge\");\n    \n      return {\n        name: name,\n        role: translateText(media.advisorRole || \"Digital machining advisor\"),\n        avatarUrl: media.avatarUrl || null,\n        avatarAlt: media.avatarAlt || name,\n      };\n    }\n    \n    function getPdfAdvisorNote(source) {\n      var viewModel = source && source.resultViewModel;\n    \n      if (!viewModel) return null;\n      if (viewModel.outcome === \"no_match\" || viewModel.outcome === \"insufficient_data\") {\n        return t(\"step4.no_match_guidance_message\", null);\n      }\n      return t(\"step4.release_note_message\", null);\n    }\n    \n    function loadPdfImageAsset(url, alias, options) {\n      var cleanUrl = compactText(url);\n      var config = options || {};\n    \n      if (!hasPdfText(cleanUrl) || typeof Image === \"undefined\" || typeof document === \"undefined\") {\n        return Promise.resolve(null);\n      }\n    \n      return new Promise(function resolveAsset(resolve) {\n        var image = new Image();\n        var settled = false;\n    \n        function finish(asset) {\n          if (settled) return;\n          settled = true;\n          resolve(asset);\n        }\n    \n        image.onload = function handleLoad() {\n          var canvas;\n          var context;\n          var naturalWidth = image.naturalWidth || image.width || 0;\n          var naturalHeight = image.naturalHeight || image.height || 0;\n          var scale;\n          var width;\n          var height;\n    \n          if (!naturalWidth || !naturalHeight) {\n            finish(null);\n            return;\n          }\n    \n          scale = Math.min(\n            (config.maxWidth || naturalWidth) / naturalWidth,\n            (config.maxHeight || naturalHeight) / naturalHeight,\n            1\n          );\n          width = Math.max(1, Math.round(naturalWidth * scale));\n          height = Math.max(1, Math.round(naturalHeight * scale));\n    \n          try {\n            canvas = document.createElement(\"canvas\");\n            canvas.width = width;\n            canvas.height = height;\n            context = canvas.getContext(\"2d\");\n            if (!context) {\n              finish(null);\n              return;\n            }\n            context.fillStyle = \"#ffffff\";\n            context.fillRect(0, 0, width, height);\n            context.drawImage(image, 0, 0, width, height);\n            finish({\n              alias: alias,\n              dataUrl: canvas.toDataURL(\"image/jpeg\", config.quality || 0.92),\n              width: width,\n              height: height,\n            });\n          } catch (error) {\n            finish(null);\n          }\n        };\n    \n        image.onerror = function handleError() {\n          finish(null);\n        };\n    \n        try {\n          image.crossOrigin = \"anonymous\";\n        } catch (error) {\n          /* no-op */\n        }\n        image.decoding = \"async\";\n        image.src = cleanUrl;\n      });\n    }\n    \n    function resolvePdfMediaAssets(source) {\n      var viewModel = source && source.resultViewModel;\n      var heroBlock = findBlock(viewModel && viewModel.blocks, \"hero_recommendation\");\n      var heroData = heroBlock && heroBlock.data || {};\n      var bundleBlock = findBlock(viewModel && viewModel.blocks, \"bundle_recommendation\");\n      var bundleData = bundleBlock && bundleBlock.data || {};\n      var advisor = getAdvisorProfile(source);\n    \n      return Promise.all([\n        loadPdfImageAsset(heroData.imageUrl, \"product_hero\", { maxWidth: 1200, maxHeight: 820 }),\n        loadPdfImageAsset(advisor.avatarUrl, \"advisor_avatar\", { maxWidth: 520, maxHeight: 520 }),\n        loadPdfImageAsset(bundleData.body && bundleData.body.imageUrl, \"bundle_body\", { maxWidth: 1200, maxHeight: 720 }),\n        loadPdfImageAsset(bundleData.insert && bundleData.insert.imageUrl, \"bundle_insert\", { maxWidth: 900, maxHeight: 900 }),\n      ]).then(function filterAssets(assets) {\n        return assets.filter(Boolean);\n      });\n    }\n    \n    function findPdfMediaAsset(mediaAssets, alias) {\n      var assets = Array.isArray(mediaAssets) ? mediaAssets : [];\n      var index;\n      for (index = 0; index < assets.length; index += 1) {\n        if (assets[index] && assets[index].alias === alias) return assets[index];\n      }\n      return null;\n    }\n    \n    function buildPdfCoverSpec(source, mediaAssets) {\n      var viewModel = source && source.resultViewModel;\n      var heroBlock = findBlock(viewModel && viewModel.blocks, \"hero_recommendation\");\n      var heroData = heroBlock && heroBlock.data || {};\n      var recipeBlock = findBlock(viewModel && viewModel.blocks, \"recipe_start_values\");\n      var advisor = getAdvisorProfile(source);\n      var productAsset = findPdfMediaAsset(mediaAssets, \"product_hero\");\n      var advisorAsset = findPdfMediaAsset(mediaAssets, \"advisor_avatar\");\n      var toolLabel = compactText([heroData.productTitle, heroData.variantTitle].filter(Boolean).join(\" / \"));\n      var stats = buildPdfSnapshotEntries(source, heroData, recipeBlock);\n      var signals = buildPdfHeroSignals(heroData, source);\n    \n      if (!viewModel) return null;\n    \n      return {\n        kicker: t(\"pdf.cover.kicker\", null),\n        title: compactText(heroData.productTitle || docTitleFromProcess(source) || t(\"pdf.title\", null)),\n        subtitle: compactText(translateText(heroData.presentation && heroData.presentation.summaryLine || viewModel.summary || \"\")),\n        meta: buildPdfToolMeta(heroData),\n        tags: dedupeTextItems([\n          getPdfOutcomeLabel(viewModel),\n          getPdfProcessLabel(source),\n          getPdfMaterialLabel(source),\n        ]).slice(0, 3),\n        signals: signals.slice(0, 5),\n        stats: stats.slice(0, 4),\n        product: hasPdfText(heroData.productTitle) || productAsset ? {\n          label: t(\"pdf.cover.product_label\", null),\n          title: compactText(heroData.productTitle || getPdfOutcomeLabel(viewModel)),\n          caption: buildPdfToolMeta(heroData),\n          imageAlias: productAsset ? productAsset.alias : null,\n        } : null,\n        advisor: {\n          label: t(\"pdf.cover.advisor_label\", null),\n          name: advisor.name,\n          role: advisor.role,\n          avatarAlias: advisorAsset ? advisorAsset.alias : null,\n          note: getPdfAdvisorNote(source),\n        },\n      };\n    }\n    \n    function docTitleFromProcess(source) {\n      var processLabel = getPdfProcessLabel(source);\n      return hasPdfText(processLabel) ? processLabel + \" summary\" : null;\n    }\n    \n    function buildPdfSummarySection(source, mediaAssets) {\n      var viewModel = source && source.resultViewModel;\n      var heroBlock = findBlock(viewModel && viewModel.blocks, \"hero_recommendation\");\n      var heroData = heroBlock && heroBlock.data || {};\n      var recipeBlock = findBlock(viewModel && viewModel.blocks, \"recipe_start_values\");\n      var advisorAsset = findPdfMediaAsset(mediaAssets, \"advisor_avatar\");\n      var productAsset = findPdfMediaAsset(mediaAssets, \"product_hero\");\n      var items = [];\n      var summary = compactText(heroData.presentation && heroData.presentation.summaryLine || viewModel && viewModel.summary);\n      var snapshot = buildPdfSnapshotEntries(source, heroData, recipeBlock);\n      var signals = buildPdfHeroSignals(heroData, source);\n      var guidance = {\n        eyebrow: t(\"step4.guidance\", null),\n        title: t(\"pdf.summary.release_note_title\", null),\n        text: getPdfAdvisorNote(source),\n        tone: viewModel && (viewModel.outcome === \"match\" || viewModel.outcome === \"limited_match\") ? \"primary\" : \"warning\",\n      };\n    \n      if (!viewModel) return null;\n    \n      pushPdfStatsGrid(items, snapshot.slice(0, 4), { columns: 2, style: \"spotlight\" });\n      pushPdfCallout(items, guidance);\n      pushPdfParagraph(items, summary);\n      pushPdfBullets(items, \"Why this recommendation fits\", heroData.reasons || []);\n    \n      if (!items.length) return null;\n    \n      return {\n        title: translateText(\"Recommendation summary\"),\n        summary: summary || null,\n        items: items,\n        variant: \"summary\",\n        decision: {\n          snapshot: snapshot,\n          signals: signals,\n          guidance: guidance,\n          advisor: {\n            name: getAdvisorProfile(source).name,\n            role: getAdvisorProfile(source).role,\n            avatarAlias: advisorAsset ? advisorAsset.alias : null,\n          },\n          tool: {\n            label: t(\"pdf.cover.product_label\", null),\n            title: compactText(heroData.productTitle || getPdfOutcomeLabel(viewModel)),\n            meta: buildPdfToolMeta(heroData),\n            imageAlias: productAsset ? productAsset.alias : null,\n          },\n          reasonsTitle: translateText(\"Why this recommendation fits\"),\n          reasons: (heroData.reasons || []).slice(0, 5),\n        },\n      };\n    }\n    \n    function buildPdfInputSection(source) {\n      var entries = buildPdfInputEntries(source);\n      var spotlight = [];\n      var items = [];\n    \n      if (hasPdfText(getPdfMaterialLabel(source))) {\n        spotlight.push({\n          label: t(\"pdf.cover.material_label\", null),\n          value: getPdfMaterialLabel(source),\n          tone: \"cool\",\n          emphasis: \"hero\",\n        });\n      }\n      if (hasPdfText(getPdfProcessLabel(source))) {\n        spotlight.push({\n          label: t(\"pdf.cover.process_label\", null),\n          value: getPdfProcessLabel(source),\n          tone: \"warm\",\n          emphasis: \"hero\",\n        });\n      }\n    \n      if (spotlight.length) {\n        pushPdfStatsGrid(items, spotlight, { columns: Math.min(2, spotlight.length), style: \"spotlight\" });\n      }\n      if (entries.length) {\n        pushPdfStatsGrid(items, entries, { columns: 2, style: \"fingerprint\" });\n      }\n    \n      return items.length ? {\n        title: translateText(\"Entered inputs\"),\n        items: items,\n        variant: \"inputs\",\n        board: {\n          spotlight: spotlight,\n          entries: entries,\n        },\n      } : null;\n    }\n    \n    function buildBundlePdfLines(block) {\n      var data = block && block.data || {};\n      var body = data.body || {};\n      var insert = data.insert || {};\n      var lines = [];\n    \n      lines = lines.concat([\n        body.productTitle ? formatLabelValue(\"Body\", [body.productTitle, body.variantTitle].filter(Boolean).join(\" / \")) : null,\n        body.sku ? formatLabelValue(\"Body SKU\", body.sku) : null,\n        body.priceLabel ? formatLabelValue(\"Body price\", formatStep4PriceText(body.priceLabel)) : null,\n        body.productUrl ? formatLabelValue(\"Body link\", body.productUrl) : null,\n        insert.productTitle ? formatLabelValue(\"Insert\", [insert.productTitle, insert.variantTitle].filter(Boolean).join(\" / \")) : null,\n        insert.sku ? formatLabelValue(\"Insert SKU\", insert.sku) : null,\n        insert.priceLabel ? formatLabelValue(\"Insert price\", formatStep4PriceText(insert.priceLabel)) : null,\n        insert.gradeCode ? formatLabelValue(\"Grade\", insert.gradeCode) : null,\n        insert.sizeCode ? formatLabelValue(\"Size\", insert.sizeCode) : null,\n        insert.chipbreaker ? formatLabelValue(\"Chipbreaker\", insert.chipbreaker) : null,\n        insert.cornerRadiusMm ? formatLabelValue(\"Corner radius\", insert.cornerRadiusMm) : null,\n        insert.productUrl ? formatLabelValue(\"Insert link\", insert.productUrl) : null,\n      ]);\n      lines = lines.concat(data.facts || []);\n      lines = lines.concat(data.notes || []);\n    \n      return dedupeTextItems(lines);\n    }\n    \n    function buildCommercePdfLines(block) {\n      var data = block && block.data || {};\n      var presentation = data.presentation || {};\n      return dedupeTextItems([]\n        .concat((data.priceItems || []).map(function mapItem(item) {\n          return item && item.label ? formatLabelValue(item.label, formatStep4PriceText(item.value)) : null;\n        }))\n        .concat([\n          data.priceLabel ? formatLabelValue(\"Price\", formatStep4PriceText(data.priceLabel)) : null,\n          presentation.availabilityLabel ? formatLabelValue(\"Availability\", presentation.availabilityLabel) : null,\n          presentation.availabilityNote || null,\n          data.productUrl ? formatLabelValue(\"Product link\", data.productUrl) : null,\n        ]));\n    }\n    \n    function buildHeroPdfLines(block, source) {\n      var heroData = block && block.data || {};\n      return dedupeTextItems([]\n        .concat([\n          heroData.productTitle ? formatLabelValue(\"Product\", heroData.productTitle) : null,\n          heroData.variantTitle ? formatLabelValue(\"Variant\", heroData.variantTitle) : null,\n          heroData.sku ? formatLabelValue(\"SKU\", heroData.sku) : null,\n          Number.isFinite(heroData.confidence) ? formatLabelValue(\"Confidence\", getConfidenceLabel(heroData.confidence)) : null,\n          heroData.fitScore != null ? formatLabelValue(\"Fit score\", heroData.fitScore) : null,\n          heroData.productUrl ? formatLabelValue(\"Product link\", heroData.productUrl) : null,\n          heroData.presentation && heroData.presentation.summaryLine ? heroData.presentation.summaryLine : source && source.resultViewModel ? source.resultViewModel.summary : null,\n        ])\n        .concat(heroData.reasons || []));\n    }\n    \n    function buildEnhancedStoryPdfSection(panel, fallbackTitle, fallbackItems, fallbackSummary) {\n      var items = [];\n      var resolvedTitle = compactText(translateText(panel && panel.title || fallbackTitle));\n      var resolvedSummary = compactPdfUiText(panel && panel.summary || fallbackSummary || null);\n      var resolvedHighlight = compactPdfUiText(panel && panel.highlight || null);\n      var facts = panel && Array.isArray(panel.facts) ? panel.facts : [];\n      var bulletItems = panel && Array.isArray(panel.items) ? panel.items : (fallbackItems || []);\n    \n      pushPdfUiCallout(items, {\n        eyebrow: panel && panel.eyebrow || null,\n        title: panel && panel.badge || null,\n        text: panel && panel.summary ? panel.highlight : null,\n        tone: panel && panel.tone || \"accent\",\n      });\n      if (hasPdfText(resolvedHighlight) && !hasPdfText(resolvedSummary) && !items.length) {\n        items.push({ type: \"paragraph\", text: resolvedHighlight });\n      }\n      pushPdfUiBullets(items, null, facts);\n      pushPdfUiBullets(items, null, bulletItems);\n    \n      if (!items.length && !hasPdfText(resolvedSummary) && !hasPdfText(resolvedHighlight)) return null;\n    \n      return {\n        title: resolvedTitle || compactText(translateText(fallbackTitle)),\n        summary: hasPdfText(resolvedSummary) ? resolvedSummary : (!items.length && hasPdfText(resolvedHighlight) ? resolvedHighlight : null),\n        items: items,\n        variant: panel && panel.tone === \"watch\" ? \"warning\" : \"default\",\n      };\n    }\n    \n    function buildEnhancedTrustPdfSection(cards) {\n      var items = [];\n    \n      (cards || []).forEach(function eachCard(card) {\n        if (!card) return;\n        pushPdfUiCallout(items, {\n          eyebrow: card.badge || null,\n          title: card.title || null,\n          text: card.value || null,\n          tone: card.tone || \"accent\",\n        });\n        if (normalizePdfTextValue(card.note) && normalizePdfTextValue(card.note) !== normalizePdfTextValue(card.value)) {\n          pushPdfUiParagraph(items, card.note);\n        }\n        pushPdfUiBullets(items, null, card.items || []);\n      });\n    \n      if (!items.length) return null;\n    \n      return {\n        title: compactText(translateText(\"Why this recommendation is credible\")),\n        summary: null,\n        items: items,\n        variant: \"default\",\n      };\n    }\n    \n    function buildEnhancedTroubleshootingPdfSection(cards) {\n      var items = [];\n    \n      (cards || []).forEach(function eachCard(card) {\n        var bulletItems;\n    \n        if (!card) return;\n        pushPdfUiCallout(items, {\n          eyebrow: card.eyebrow || card.category || null,\n          title: card.title || null,\n          text: card.cause || card.note || null,\n          tone: card.tone || \"warning\",\n        });\n        if (card.wear) {\n          pushPdfKeyValue(items, \"Wear signal\", card.wear);\n        }\n        bulletItems = []\n          .concat(card.checkFirst || [])\n          .concat(card.actions || [])\n          .concat(card.items || []);\n        pushPdfUiBullets(items, null, bulletItems);\n      });\n    \n      if (!items.length) return null;\n    \n      return {\n        title: compactText(translateText(\"Troubleshooting focus\")),\n        summary: compactPdfUiText(\"These responses are already filtered to the current setup, material behavior and the issues you flagged in Step 3.\", { dropUnlocalized: false }),\n        items: items,\n        variant: \"warning\",\n      };\n    }\n    \n    function buildEnhancedTechnicalPdfSection(detailPanels) {\n      var items = [];\n    \n      (detailPanels || []).forEach(function eachPanel(panel) {\n        var alternativeItems;\n        var leadText;\n    \n        if (!panel) return;\n        leadText = panel.summary || panel.value || null;\n        pushPdfUiCallout(items, {\n          eyebrow: panel.eyebrow || panel.badge || null,\n          title: panel.title || null,\n          text: leadText,\n          tone: panel.tone || \"accent\",\n        });\n        if (panel.note && normalizePdfTextValue(panel.note) !== normalizePdfTextValue(leadText)) {\n          pushPdfUiParagraph(items, panel.note);\n        }\n        pushPdfUiBullets(items, null, panel.facts || []);\n        if (panel.type === \"alternatives\") {\n          alternativeItems = (panel.items || []).map(function mapAlternative(item) {\n            if (!item) return null;\n            if (item.badge && item.reason) return item.badge + \": \" + item.label + \" - \" + item.reason;\n            if (item.badge) return item.badge + \": \" + item.label;\n            if (item.reason) return item.label + \" - \" + item.reason;\n            return item.label || null;\n          });\n          pushPdfUiBullets(items, null, alternativeItems);\n          return;\n        }\n        pushPdfUiBullets(items, null, panel.items || []);\n      });\n    \n      if (!items.length) return null;\n    \n      return {\n        title: compactText(translateText(\"Data confidence & technical details\")),\n        summary: null,\n        items: items,\n        variant: \"default\",\n      };\n    }\n    \n    function buildTappingEnhancedPdfSections(source) {\n      var viewModel = source && source.resultViewModel;\n      var blocks;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n      var riskBlock;\n      var setupBlock;\n      var heroData;\n      var recipeData;\n      var recipePresentation;\n      var machinePresentation;\n      var riskPresentation;\n      var setupPresentation;\n      var storyData;\n      var storyPanels;\n      var troubleshootingCards;\n      var startPrimary;\n      var startValues;\n      var rowBackedValues;\n      var machineValues;\n      var trustCards;\n    \n      if (!viewModel || !shouldUseEnhancedResultLayout(viewModel) || (viewModel.outcome !== \"match\" && viewModel.outcome !== \"limited_match\")) return [];\n    \n      blocks = viewModel.blocks || [];\n      heroBlock = findBlock(blocks, \"hero_recommendation\");\n      recipeBlock = findBlock(blocks, \"recipe_start_values\");\n      machineBlock = findBlock(blocks, \"machine_feasibility\");\n      riskBlock = findBlock(blocks, \"risk_notes\");\n      setupBlock = findBlock(blocks, \"setup_notes\");\n      heroData = heroBlock && heroBlock.data || {};\n      recipeData = recipeBlock && recipeBlock.data || {};\n      recipePresentation = recipeData.presentation || {};\n      machinePresentation = machineBlock && machineBlock.data && machineBlock.data.presentation || {};\n      riskPresentation = riskBlock && riskBlock.data && riskBlock.data.presentation || {};\n      setupPresentation = setupBlock && setupBlock.data && setupBlock.data.presentation || {};\n      storyData = setupPresentation.stories || {};\n      storyPanels = setupPresentation.storyPanels || {};\n      troubleshootingCards = setupPresentation.troubleshooting || [];\n      startPrimary = recipePresentation.primaryValues || [];\n      startValues = recipeData.values || [];\n      rowBackedValues = recipePresentation.rowBackedValues || [];\n      machineValues = recipePresentation.machineValues || [];\n    \n      if (!heroBlock || (!startPrimary.length && !startValues.length)) return [];\n      if (\n        !Object.keys(storyPanels).length\n        && !troubleshootingCards.length\n        && !(setupPresentation.detailPanels && setupPresentation.detailPanels.length)\n        && !recipePresentation.trustCard\n        && !recipePresentation.holePrepCard\n        && !recipePresentation.auxiliaryCard\n        && !machinePresentation.trustCard\n      ) {\n        return [];\n      }\n    \n      if (!rowBackedValues.length) rowBackedValues = startPrimary;\n      if (!machineValues.length) machineValues = recipePresentation.secondaryValues || [];\n      trustCards = [\n        recipePresentation.trustCard,\n        recipePresentation.holePrepCard,\n        recipePresentation.auxiliaryCard,\n        machinePresentation.trustCard || {\n          title: translateText(\"Machine fit\"),\n          tone: machinePresentation.tone || \"default\",\n          badge: translateText(machinePresentation.value || \"Review\"),\n          value: translateText(machinePresentation.note || \"\"),\n          note: translateText(riskPresentation.note || \"\"),\n          items: machinePresentation.items || [],\n        },\n      ].filter(Boolean);\n    \n      return [\n        buildEnhancedStoryPdfSection(storyPanels.why, \"Why it fits\", storyData.why || heroData.reasons || [], null),\n        buildEnhancedStoryPdfSection(storyPanels.how, \"How to start\", storyData.how || [], recipePresentation.description || null),\n        buildEnhancedStoryPdfSection(storyPanels.watch, \"Watch-outs\", storyData.watch || [], null),\n        buildEnhancedTroubleshootingPdfSection(troubleshootingCards),\n        buildEnhancedTrustPdfSection(trustCards),\n        buildEnhancedTechnicalPdfSection(setupPresentation.detailPanels || []),\n      ].filter(Boolean);\n    }\n    \n    function buildGenericEnhancedPdfSections(source) {\n      var viewModel = source && source.resultViewModel;\n      var blocks;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n      var riskBlock;\n      var warningBlock;\n      var setupBlock;\n      var toleranceBlock;\n      var threadBlock;\n      var holeBlock;\n      var featureBlock;\n      var geometryBlock;\n      var fitBlock;\n      var alternativesBlock;\n      var heroData;\n      var metricGroups;\n      var recipeSource;\n      var confidence;\n      var threadLines;\n      var holeLines;\n      var featureLines;\n      var geometryLines;\n      var fitLines;\n      var machineLines;\n      var setupLines;\n      var riskLines;\n      var snapshotLines;\n      var whyItems;\n      var howItems;\n      var watchItems;\n      var machineChecks;\n      var troubleshootingCards;\n      var trustCards;\n      var technicalItems = [];\n    \n      if (!viewModel || !shouldUseEnhancedResultLayout(viewModel) || (viewModel.outcome !== \"match\" && viewModel.outcome !== \"limited_match\")) return [];\n    \n      blocks = viewModel.blocks || [];\n      heroBlock = findBlock(blocks, \"hero_recommendation\");\n      if (!heroBlock) return [];\n    \n      recipeBlock = findBlock(blocks, \"recipe_start_values\");\n      machineBlock = findBlock(blocks, \"machine_feasibility\");\n      riskBlock = findBlock(blocks, \"risk_notes\");\n      warningBlock = findBlock(blocks, \"warning\");\n      setupBlock = findBlock(blocks, \"setup_notes\");\n      toleranceBlock = findBlock(blocks, \"tolerance_notes\");\n      threadBlock = findBlock(blocks, \"thread_identity\");\n      holeBlock = findBlock(blocks, \"hole_summary\");\n      featureBlock = findBlock(blocks, \"feature_summary\");\n      geometryBlock = findBlock(blocks, \"geometry_fit\");\n      fitBlock = findBlock(blocks, \"fit_kpis\");\n      alternativesBlock = findBlock(blocks, \"alternatives\");\n      heroData = heroBlock.data || {};\n      metricGroups = buildMetricGroups(recipeBlock);\n      recipeSource = recipeBlock && recipeBlock.data ? recipeBlock.data.source : null;\n      confidence = Number.isFinite(heroData.confidence) ? heroData.confidence : null;\n      threadLines = buildThreadLines(threadBlock);\n      holeLines = buildHoleLines(holeBlock);\n      featureLines = buildFeatureLines(featureBlock);\n      geometryLines = buildGeometryLines(geometryBlock);\n      fitLines = buildFitLines(fitBlock);\n      machineLines = buildMachineLines(machineBlock);\n      setupLines = buildSetupLines(setupBlock);\n      riskLines = buildRiskLines(riskBlock, warningBlock);\n      snapshotLines = dedupeTextItems([].concat(threadLines).concat(holeLines).concat(featureLines));\n      whyItems = dedupeTextItems([])\n        .concat(heroData.reasons || [])\n        .concat(snapshotLines.slice(0, 2))\n        .concat(geometryLines.slice(0, 1)).slice(0, 4);\n      howItems = dedupeTextItems([])\n        .concat(metricGroups.bands.length ? [t(\"step4.release_note_start_message\", null)] : [])\n        .concat(setupLines.slice(0, 2))\n        .concat(machineLines.slice(0, 1))\n        .concat(toleranceBlock ? buildToleranceLines(toleranceBlock).slice(0, 1) : []).slice(0, 4);\n      watchItems = dedupeTextItems([])\n        .concat(riskLines)\n        .concat(machineLines.filter(function keep(line) {\n          return /fail|limited|review/i.test(line);\n        }))\n        .concat(warningBlock && warningBlock.data && warningBlock.data.message ? [warningBlock.data.message] : []).slice(0, 4);\n      machineChecks = machineBlock && machineBlock.data && Array.isArray(machineBlock.data.checks)\n        ? machineBlock.data.checks\n        : [];\n      troubleshootingCards = riskLines.length\n        ? riskLines.map(function mapRiskLine(line, index) {\n          return {\n            title: index === 0 ? translateText(\"What needs attention\") : translateText(\"What to watch\"),\n            items: [line],\n            tone: \"watch\",\n          };\n        })\n        : [];\n    \n      trustCards = [\n        recipeBlock && metricGroups.bands.length ? {\n          title: translateText(\"Recommendation basis\"),\n          tone: getRecipeTrustTone(recipeSource),\n          badge: getRecipeSourceLabel(recipeSource),\n          value: viewModel.summary || translateText(\"Best result for the current setup.\"),\n          note: t(\"step4.release_note_start_message\", null),\n          items: metricGroups.bands.slice(0, 2),\n        } : null,\n        snapshotLines.length ? {\n          title: threadBlock ? \"Thread snapshot\" : holeBlock ? \"Hole snapshot\" : \"Feature snapshot\",\n          tone: \"good\",\n          badge: titleCaseToken(viewModel.processId),\n          value: snapshotLines[0] || viewModel.summary,\n          note: snapshotLines[1] || viewModel.summary,\n          items: snapshotLines.slice(2, 4),\n        } : null,\n        machineLines.length ? {\n          title: translateText(\"Machine fit\"),\n          tone: getMachineTrustTone(machineChecks),\n          badge: getMachineBadgeLabel(machineChecks),\n          value: machineLines[0] || translateText(\"Machine checked\"),\n          note: riskLines[0] || t(\"step4.release_note_message\", null),\n          items: machineLines.slice(1, 3),\n        } : (fitLines.length ? {\n          title: translateText(\"Decision signals\"),\n          tone: \"near\",\n          badge: confidence != null ? t(\"step4.confidence_badge\", null, { confidence: getConfidenceLabel(confidence) }) : translateText(\"Review\"),\n          value: fitLines[0],\n          note: viewModel.summary,\n          items: fitLines.slice(1, 3),\n        } : null),\n      ].filter(Boolean);\n    \n      pushPdfUiBullets(technicalItems, \"Recommended start values\", metricGroups.bands);\n      pushPdfUiBullets(technicalItems, threadBlock ? \"Thread snapshot\" : holeBlock ? \"Hole snapshot\" : \"Feature snapshot\", snapshotLines);\n      pushPdfUiBullets(technicalItems, \"Geometry review\", geometryLines);\n      pushPdfUiBullets(technicalItems, \"Decision signals\", fitLines);\n      pushPdfUiBullets(technicalItems, \"Quality and tolerance\", toleranceBlock ? buildToleranceLines(toleranceBlock) : []);\n      pushPdfUiBullets(technicalItems, \"Machine fit\", machineLines);\n      pushPdfUiBullets(technicalItems, \"Setup guidance\", setupLines);\n      pushPdfUiBullets(technicalItems, \"What to watch\", riskLines);\n      pushPdfUiBullets(technicalItems, \"Alternatives worth checking\", buildAlternativeLines(alternativesBlock));\n    \n      return [\n        buildEnhancedStoryPdfSection({\n          tone: \"fit\",\n          title: \"Why it fits\",\n          badge: confidence != null ? t(\"step4.confidence_badge\", null, { confidence: getConfidenceLabel(confidence) }) : titleCaseToken(viewModel.processId),\n          summary: viewModel.summary,\n          highlight: whyItems[0] || viewModel.summary,\n          facts: dedupeTextItems([])\n            .concat(snapshotLines.slice(0, 1))\n            .concat(recipeBlock ? [t(\"step4.hero.data_chip\", null, { source: getRecipeSourceLabel(recipeSource) })] : [])\n            .concat(heroData.sku ? [t(\"common.sku_value\", null, { value: heroData.sku })] : []).slice(0, 3),\n          items: whyItems,\n        }, \"Why it fits\", whyItems, viewModel.summary),\n        buildEnhancedStoryPdfSection({\n          tone: \"start\",\n          title: \"How to start\",\n          badge: recipeBlock ? getRecipeSourceLabel(recipeSource) : t(\"step4.first_part_first\", null),\n          summary: translateText(\"The first parts should confirm quality, machine load and process stability before output is increased.\"),\n          highlight: t(\"step4.release_note_start_message\", null),\n          facts: dedupeTextItems([])\n            .concat(metricGroups.primary.slice(0, 2).map(function mapTile(item) {\n              return item.label + \": \" + item.value + (item.unit ? \" \" + item.unit : \"\");\n            }))\n            .concat(metricGroups.machine.slice(0, 1).map(function mapTile(item) {\n              return item.label + \": \" + item.value + (item.unit ? \" \" + item.unit : \"\");\n            })).slice(0, 3),\n          items: howItems,\n        }, \"How to start\", howItems, t(\"step4.release_note_start_message\", null)),\n        buildEnhancedStoryPdfSection({\n          tone: watchItems.length ? \"watch\" : \"default\",\n          title: \"Watch-outs\",\n          badge: watchItems.length ? \"Review\" : t(\"step4.ready_to_review\", null),\n          summary: watchItems.length\n            ? translateText(\"Open to review the checks that matter most before widening the process window.\")\n            : translateText(\"The first parts should confirm quality, machine load and process stability before output is increased.\"),\n          highlight: watchItems[0] || translateText(\"No blocking guidance issues are active right now.\"),\n          facts: dedupeTextItems([])\n            .concat(riskLines.slice(0, 1))\n            .concat(machineLines.slice(0, 1)).slice(0, 3),\n          items: watchItems.length ? watchItems : [t(\"step4.release_note_message\", null)],\n        }, \"Watch-outs\", watchItems, null),\n        buildEnhancedTrustPdfSection(trustCards),\n        technicalItems.length ? {\n          title: compactText(translateText(\"Data confidence & technical details\")),\n          summary: null,\n          items: technicalItems,\n          variant: \"default\",\n        } : null,\n      ].filter(Boolean);\n    }\n    \n    function buildEnhancedPdfSections(source) {\n      var sections = buildTappingEnhancedPdfSections(source);\n      if (sections.length) return sections;\n      return buildGenericEnhancedPdfSections(source);\n    }\n    \n    function buildPdfSectionFromBlock(block, source, mediaAssets) {\n      var items = [];\n      var title = getUserFacingBlockTitle(block);\n      var summary = null;\n      var data = block && block.data || {};\n      var metricGroups;\n      var recipePresentation;\n      var recipeRowValues;\n      var recipeMachineValues;\n    \n      if (!block || block.visible === false) return null;\n    \n      switch (block.blockType) {\n        case \"hero_recommendation\":\n          pushPdfBullets(items, null, buildHeroPdfLines(block, source));\n          summary = (data.presentation && data.presentation.summaryLine)\n            || (source && source.resultViewModel ? source.resultViewModel.summary : null);\n          break;\n          case \"recipe_start_values\":\n            metricGroups = buildMetricGroups(block);\n            recipePresentation = data.presentation || {};\n            recipeRowValues = Array.isArray(recipePresentation.rowBackedValues) ? recipePresentation.rowBackedValues : [];\n            recipeMachineValues = Array.isArray(recipePresentation.machineValues) ? recipePresentation.machineValues : [];\n            pushPdfKeyValue(items, \"Data basis\", getRecipeSourceLabel(data.source));\n            recipeRowValues.forEach(function eachMetric(item) {\n              pushPdfKeyValue(items, item.label, compactText((item.value != null ? String(item.value) : \"\") + (item.unit ? \" \" + item.unit : \"\")));\n            });\n            recipeMachineValues.forEach(function eachMetric(item) {\n              pushPdfKeyValue(items, item.label, compactText((item.value != null ? String(item.value) : \"\") + (item.unit ? \" \" + item.unit : \"\")));\n            });\n            if (!recipeRowValues.length && !recipeMachineValues.length) {\n              metricGroups.primary.concat(metricGroups.machine).forEach(function eachMetric(item) {\n                pushPdfKeyValue(items, item.label, item.value + (item.unit ? \" \" + item.unit : \"\"));\n              });\n            }\n            pushPdfBullets(items, \"Recommended start values\", metricGroups.bands);\n            summary = data.presentation && data.presentation.description || null;\n            break;\n        case \"fit_kpis\":\n          pushPdfBullets(items, null, buildFitLines(block));\n          break;\n        case \"risk_notes\":\n          pushPdfBullets(items, null, buildRiskLines(block, null));\n          break;\n        case \"machine_feasibility\":\n          pushPdfBullets(items, null, buildMachineLines(block));\n          break;\n        case \"tolerance_notes\":\n          pushPdfBullets(items, null, buildToleranceLines(block));\n          break;\n        case \"setup_notes\":\n          pushPdfBullets(items, null, buildSetupLines(block));\n          summary = data.presentation && data.presentation.summary || null;\n          break;\n        case \"geometry_fit\":\n          pushPdfBullets(items, null, buildGeometryLines(block));\n          break;\n        case \"thread_identity\":\n          pushPdfBullets(items, null, buildThreadLines(block));\n          break;\n        case \"hole_summary\":\n          pushPdfBullets(items, null, buildHoleLines(block));\n          break;\n        case \"feature_summary\":\n          pushPdfBullets(items, null, buildFeatureLines(block));\n          break;\n        case \"alternatives\":\n          pushPdfBullets(items, null, buildAlternativeLines(block));\n          break;\n        case \"bundle_recommendation\":\n          summary = data.summary || null;\n          pushPdfBullets(items, null, buildBundlePdfLines(block));\n          break;\n        case \"commerce_cta\":\n          summary = data.presentation && data.presentation.availabilityNote || null;\n          pushPdfBullets(items, null, buildCommercePdfLines(block));\n          break;\n        case \"explanation\":\n          pushPdfParagraph(items, data.summary || null);\n          pushPdfBullets(items, null, (data.paragraphs || data.steps || []).slice());\n          break;\n        case \"warning\":\n          pushPdfParagraph(items, data.message || null);\n          break;\n        case \"no_match_guidance\":\n          summary = data.message || null;\n          pushPdfParagraph(items, data.message || null);\n          pushPdfBullets(items, \"Next best step\", (data.steps || data.paragraphs || []).slice());\n          break;\n        default:\n          pushPdfBullets(items, null, summarizeFallbackValue(data));\n          break;\n      }\n    \n      if (!items.length && !hasPdfText(summary)) return null;\n    \n      return {\n        title: title,\n        summary: hasPdfText(summary) ? compactText(summary) : null,\n        items: items,\n        variant: block.blockType === \"recipe_start_values\"\n          ? \"recipe\"\n          : block.blockType === \"bundle_recommendation\"\n            ? \"bundle\"\n            : block.blockType === \"no_match_guidance\"\n              ? \"warning\"\n              : \"default\",\n        recipe: block.blockType === \"recipe_start_values\" ? {\n          sourceLabel: t(\"pdf.cover.data_basis_label\", null),\n          sourceValue: getRecipeSourceLabel(data.source),\n          description: data.presentation && data.presentation.description || null,\n          primary: buildPdfRecipeMetricEntries(recipeRowValues, metricGroups.primary),\n          machine: buildPdfRecipeMetricEntries(recipeMachineValues, metricGroups.machine),\n          bands: metricGroups.bands,\n        } : null,\n        bundle: block.blockType === \"bundle_recommendation\" ? buildPdfBundleCardData(block, mediaAssets) : null,\n      };\n    }\n    \n    function buildPdfSpec(source, mediaAssets) {\n      var viewModel = source && source.resultViewModel;\n      var title;\n      var subtitle;\n      var sections = [];\n      var now = new Date();\n      var summarySection;\n      var inputSection;\n      var cover;\n      var recipeSection;\n      var bundleSection;\n      var commerceSection;\n      var enhancedSections;\n    \n      if (!viewModel) return null;\n    \n      title = t(\"pdf.title\", null);\n      subtitle = compactText(viewModel.summary ? translateText(viewModel.summary) : translateText(getPdfProcessLabel(source) || \"Recommendation summary\"));\n      inputSection = buildPdfInputSection(source);\n      cover = buildPdfCoverSpec(source, mediaAssets);\n      summarySection = buildPdfSummarySection(source, mediaAssets);\n      recipeSection = buildPdfSectionFromBlock(findBlock(viewModel.blocks, \"recipe_start_values\"), source, mediaAssets);\n      bundleSection = buildPdfSectionFromBlock(findBlock(viewModel.blocks, \"bundle_recommendation\"), source, mediaAssets);\n      commerceSection = buildPdfSectionFromBlock(findBlock(viewModel.blocks, \"commerce_cta\"), source, mediaAssets);\n      enhancedSections = buildEnhancedPdfSections(source);\n    \n      if (summarySection) sections.push(summarySection);\n      if (recipeSection) sections.push(recipeSection);\n      if (bundleSection) sections.push(bundleSection);\n      if (inputSection) sections.push(inputSection);\n      if (enhancedSections && enhancedSections.length) {\n        Array.prototype.push.apply(sections, enhancedSections);\n        if (commerceSection) sections.push(commerceSection);\n      } else {\n        (viewModel.blocks || []).forEach(function eachBlock(block) {\n          var section = buildPdfSectionFromBlock(block, source, mediaAssets);\n          if (block && (block.blockType === \"hero_recommendation\" || block.blockType === \"recipe_start_values\" || block.blockType === \"bundle_recommendation\")) return;\n          if (section) sections.push(section);\n        });\n      }\n    \n      if (!sections.length) return null;\n    \n      return {\n        title: title,\n        subtitle: subtitle,\n        meta: t(\"pdf.meta.generated\", null, {\n          timestamp: now.toLocaleString(source && source.runtimeConfig && source.runtimeConfig.locale || undefined),\n        }),\n        cover: cover,\n        branding: {\n          brand_name: \"EdgeVend\",\n          logo: null,\n        },\n        theme: {\n          primary: \"#123d4a\",\n          primary_dark: \"#0d2730\",\n          accent: \"#c47a33\",\n          panel: \"#f5f8fa\",\n          panel_alt: \"#eef3f6\",\n          text: \"#15212b\",\n          muted: \"#5f6974\",\n          line: \"#d7dfe5\",\n          line_soft: \"#e6edf1\",\n          line_strong: \"#c9d6dc\",\n          paper: \"#f7fafb\",\n          paper_alt: \"#eef4f6\",\n          surface: \"#ffffff\",\n          surface_alt: \"#f8fbfc\",\n          surface_cool: \"#e8f1f4\",\n          surface_warm: \"#f5ede4\",\n          success: \"#1b6a52\",\n          warning: \"#a46220\",\n        },\n        media: Array.isArray(mediaAssets) ? mediaAssets : [],\n        sections: sections,\n      };\n    }\n    \n    function buildPdfFileName(source) {\n      var dateStamp = (new Date()).toISOString().slice(0, 10);\n      var processToken = getPdfProcessLabel(source).replace(/[^a-z0-9._-]+/gi, \"-\").replace(/-+/g, \"-\").toLowerCase() || \"summary\";\n      return \"edgevend-tool-finder-\" + processToken + \"-\" + dateStamp + \".pdf\";\n    }\n    \n    function handlePdfDownload(source, button) {\n      var builder = getPdfBuilder();\n      var defaultLabel = compactText(button && button.textContent) || translateText(\"Download summary\");\n      var busyLabel = t(\"pdf.button.preparing\", null);\n    \n      if (!builder || typeof builder.download !== \"function\") {\n        if (typeof window !== \"undefined\" && typeof window.alert === \"function\") {\n          window.alert(t(\"pdf.error.unavailable\", null));\n        }\n        return;\n      }\n    \n      if (button) {\n        button.disabled = true;\n        button.textContent = busyLabel;\n      }\n    \n      Promise.resolve()\n          .then(function resolvePdfMedia() {\n            return resolvePdfMediaAssets(source);\n          })\n          .then(function buildAndDownloadPdf(mediaAssets) {\n            var spec = buildPdfSpec(source, mediaAssets);\n            if (!spec) {\n              if (typeof window !== \"undefined\" && typeof window.alert === \"function\") {\n                window.alert(t(\"pdf.error.no_result\", null));\n              }\n              return;\n            }\n          builder.download(spec, buildPdfFileName(source));\n        })\n        .catch(function handlePdfError(error) {\n            if (typeof console !== \"undefined\" && console.error) {\n              console.error(\"EdgeVend Tool Finder PDF export failed\", error);\n            }\n            if (typeof window !== \"undefined\" && typeof window.alert === \"function\") {\n              window.alert(t(\"pdf.error.unavailable\", null));\n            }\n          })\n        .then(function restoreButton() {\n          if (button) {\n            button.disabled = false;\n            button.textContent = defaultLabel;\n          }\n        });\n    }\n    \n    function createPdfDownloadButton(source) {\n      if (!isPdfExportEnabled(source)) return null;\n      return createElement(\"button\", {\n        type: \"button\",\n        className: \"tfv1-button tfv1-s4-buy-secondary tfv1-s4-buy-tertiary\",\n        text: translateText(\"Download summary\"),\n        dataset: {\n          step4DownloadSummary: \"true\",\n        },\n        onClick: function handlePdfClick(event) {\n          handlePdfDownload(source, event && event.currentTarget ? event.currentTarget : null);\n        },\n      });\n    }\n    \n    function hasCheckResult(checks, result) {\n      return (checks || []).some(function someCheck(item) {\n        return item && String(item.result || \"\").toLowerCase() === result;\n      });\n    }\n    \n    function getMachineChipTone(checks) {\n      if (hasCheckResult(checks, \"fail\")) return \"machine-tight\";\n      if (hasCheckResult(checks, \"limited\")) return \"machine-limited\";\n      return \"machine-good\";\n    }\n    \n    function getMachineTrustTone(checks) {\n      if (hasCheckResult(checks, \"fail\")) return \"high\";\n      if (hasCheckResult(checks, \"limited\")) return \"limited\";\n      if ((checks || []).length) return \"exact\";\n      return \"default\";\n    }\n    \n    function getMachineBadgeLabel(checks) {\n      if (hasCheckResult(checks, \"fail\")) return translateText(\"Tight window\");\n      if (hasCheckResult(checks, \"limited\")) return translateText(\"Review\");\n      if ((checks || []).length) return translateText(\"Machine checked\");\n      return translateText(\"Review\");\n    }\n    \n    function getRiskChipTone(riskLines) {\n      if (!riskLines || !riskLines.length) return \"risk-low\";\n      if (riskLines.length === 1) return \"risk-medium\";\n      return \"risk-high\";\n    }\n    \n    function renderUnifiedActionBar(viewModel, commerceBlock, heroData, source) {\n      var actions = viewModel && Array.isArray(viewModel.actions) ? viewModel.actions : [];\n      var openAction = actions.filter(function keep(action) {\n        return action && action.type === \"open_product\";\n      })[0] || null;\n      var backAction = actions.filter(function keep(action) {\n        return action && action.type === \"back_to_step3\";\n      })[0] || null;\n      var pdfButton = createPdfDownloadButton(source);\n      var href = commerceBlock && commerceBlock.data && commerceBlock.data.productUrl\n        ? commerceBlock.data.productUrl\n        : openAction && openAction.targetId\n          ? openAction.targetId\n          : heroData && heroData.productUrl\n            ? heroData.productUrl\n            : \"#\";\n    \n      if (commerceBlock) {\n        return renderTappingBuyBar(commerceBlock.data, actions, source);\n      }\n      if (!openAction && !backAction && !pdfButton) return null;\n    \n      return createElement(\"div\", { className: \"tfv1-s4-buybar tfv1-s4-buybar-actions\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-buy-col\" }, [\n          createElement(\"div\", { className: \"tfv1-s4-eyebrow\", text: \"ORDER THIS TOOL\" }),\n          createElement(\"div\", { className: \"tfv1-s4-buy-status\", text: t(\"step4.review_and_release\", null) }),\n          createElement(\"div\", { className: \"tfv1-s4-buy-meta\", text: t(\"step4.review_and_release_copy\", null) }),\n          renderAdvisorStamp(source, {\n            className: \"is-inline-status\",\n            kicker: translateText(\"Mr. Edge\"),\n            label: t(\"step4.ready_for_final_check\", null),\n          }),\n        ]),\n        createElement(\"div\", { className: \"tfv1-s4-buy-actions\" }, [\n          openAction ? createElement(\"a\", {\n            className: \"tfv1-button tfv1-button-selected tfv1-s4-buy-primary\",\n            href: href,\n              text: resolveOpenProductLabel(openAction.label),\n          }) : null,\n          backAction ? createElement(\"button\", {\n            type: \"button\",\n            className: \"tfv1-button tfv1-s4-buy-secondary\",\n              text: resolvePreferredActionLabel(backAction.label, \"step4.adjust_inputs\", \"Adjust inputs\"),\n            onClick: function handleBackAction() {\n              if (typeof source.onAction === \"function\") source.onAction(backAction);\n            },\n          }) : null,\n          pdfButton,\n        ]),\n      ]);\n    }\n    \n    function renderGenericDetailsAccordion(recipeBlock, threadBlock, holeBlock, featureBlock, geometryBlock, fitBlock, toleranceBlock, machineBlock, setupBlock, riskBlock, warningBlock, alternativesBlock) {\n      var cards = [];\n      var snapshotLines = dedupeTextItems([]\n        .concat(buildThreadLines(threadBlock))\n        .concat(buildHoleLines(holeBlock))\n        .concat(buildFeatureLines(featureBlock)));\n      var recipeLines = buildMetricGroups(recipeBlock).bands;\n      var geometryLines = buildGeometryLines(geometryBlock);\n      var fitLines = buildFitLines(fitBlock);\n      var qualityLines = buildToleranceLines(toleranceBlock);\n      var machineLines = buildMachineLines(machineBlock);\n      var setupLines = buildSetupLines(setupBlock);\n      var riskLines = buildRiskLines(riskBlock, warningBlock);\n      var alternativeLines = buildAlternativeLines(alternativesBlock);\n    \n      cards.push(renderDetailCard(\"Recommended start values\", recipeLines));\n      cards.push(renderDetailCard(\n        threadBlock ? \"Thread snapshot\" : holeBlock ? \"Hole snapshot\" : \"Feature snapshot\",\n        snapshotLines\n      ));\n      cards.push(renderDetailCard(\"Geometry review\", geometryLines));\n      cards.push(renderDetailCard(\"Decision signals\", fitLines));\n      cards.push(renderDetailCard(\"Quality and tolerance\", qualityLines));\n      cards.push(renderDetailCard(\"Machine fit\", machineLines));\n      cards.push(renderDetailCard(\"Setup guidance\", setupLines));\n      cards.push(renderDetailCard(\"What to watch\", riskLines));\n      cards.push(renderDetailCard(\"Alternatives worth checking\", alternativeLines));\n      cards = cards.filter(Boolean);\n    \n      if (!cards.length) return null;\n    \n      return createElement(\"details\", { className: \"tfv1-s4-details\" }, [\n          createElement(\"summary\", { text: translateText(\"Data confidence & technical details\") }),\n        createElement(\"div\", { className: \"tfv1-s4-details-grid\" }, cards),\n      ]);\n    }\n    \n    function renderGenericEnhancedResult(source) {\n      var viewModel = source && source.resultViewModel;\n      var blocks;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n      var riskBlock;\n      var warningBlock;\n      var setupBlock;\n      var toleranceBlock;\n      var threadBlock;\n      var holeBlock;\n      var featureBlock;\n      var geometryBlock;\n      var fitBlock;\n      var alternativesBlock;\n      var commerceBlock;\n      var bundleBlock;\n      var heroData;\n      var metricGroups;\n      var recipeSource;\n      var confidence;\n      var threadLines;\n      var holeLines;\n      var featureLines;\n      var geometryLines;\n      var fitLines;\n      var machineLines;\n      var setupLines;\n      var riskLines;\n      var snapshotLines;\n      var whyItems;\n      var howItems;\n      var watchItems;\n      var machineChecks;\n      var trustCards;\n      var whyPanel;\n      var howPanel;\n      var watchPanel;\n      var heroVisual;\n      var advisorInline;\n      var actionBar;\n    \n      if (!viewModel || (viewModel.outcome !== \"match\" && viewModel.outcome !== \"limited_match\")) return null;\n    \n      blocks = viewModel.blocks || [];\n      heroBlock = findBlock(blocks, \"hero_recommendation\");\n      if (!heroBlock) return null;\n    \n      recipeBlock = findBlock(blocks, \"recipe_start_values\");\n      machineBlock = findBlock(blocks, \"machine_feasibility\");\n      riskBlock = findBlock(blocks, \"risk_notes\");\n      warningBlock = findBlock(blocks, \"warning\");\n      setupBlock = findBlock(blocks, \"setup_notes\");\n      toleranceBlock = findBlock(blocks, \"tolerance_notes\");\n      threadBlock = findBlock(blocks, \"thread_identity\");\n      holeBlock = findBlock(blocks, \"hole_summary\");\n      featureBlock = findBlock(blocks, \"feature_summary\");\n      geometryBlock = findBlock(blocks, \"geometry_fit\");\n      fitBlock = findBlock(blocks, \"fit_kpis\");\n      alternativesBlock = findBlock(blocks, \"alternatives\");\n      commerceBlock = findBlock(blocks, \"commerce_cta\");\n      bundleBlock = findBlock(blocks, \"bundle_recommendation\");\n      heroData = heroBlock.data || {};\n      metricGroups = buildMetricGroups(recipeBlock);\n      recipeSource = recipeBlock && recipeBlock.data ? recipeBlock.data.source : null;\n      confidence = Number.isFinite(heroData.confidence) ? heroData.confidence : null;\n      threadLines = buildThreadLines(threadBlock);\n      holeLines = buildHoleLines(holeBlock);\n      featureLines = buildFeatureLines(featureBlock);\n      geometryLines = buildGeometryLines(geometryBlock);\n      fitLines = buildFitLines(fitBlock);\n      machineLines = buildMachineLines(machineBlock);\n      setupLines = buildSetupLines(setupBlock);\n      riskLines = buildRiskLines(riskBlock, warningBlock);\n      snapshotLines = dedupeTextItems([].concat(threadLines).concat(holeLines).concat(featureLines));\n      whyItems = dedupeTextItems([]\n        .concat(heroData.reasons || [])\n        .concat(snapshotLines.slice(0, 2))\n        .concat(geometryLines.slice(0, 1))).slice(0, 4);\n      howItems = dedupeTextItems([]\n        .concat(metricGroups.bands.length ? [t(\"step4.release_note_start_message\", null)] : [])\n        .concat(setupLines.slice(0, 2))\n        .concat(machineLines.slice(0, 1))\n        .concat(toleranceBlock ? buildToleranceLines(toleranceBlock).slice(0, 1) : [])).slice(0, 4);\n      watchItems = dedupeTextItems([]\n        .concat(riskLines)\n        .concat(machineLines.filter(function keep(line) {\n          return /fail|limited|review/i.test(line);\n        }))\n        .concat(warningBlock && warningBlock.data && warningBlock.data.message ? [warningBlock.data.message] : [])).slice(0, 4);\n      machineChecks = machineBlock && machineBlock.data && Array.isArray(machineBlock.data.checks)\n        ? machineBlock.data.checks\n        : [];\n    \n      trustCards = [\n        recipeBlock && metricGroups.bands.length ? {\n          title: translateText(\"Recommendation basis\"),\n          tone: getRecipeTrustTone(recipeSource),\n          badge: getRecipeSourceLabel(recipeSource),\n          value: viewModel.summary || translateText(\"Best result for the current setup.\"),\n          note: t(\"step4.release_note_start_message\", null),\n          items: metricGroups.bands.slice(0, 2),\n        } : null,\n        snapshotLines.length ? {\n          title: threadBlock ? \"Thread snapshot\" : holeBlock ? \"Hole snapshot\" : \"Feature snapshot\",\n          tone: \"good\",\n          badge: titleCaseToken(viewModel.processId),\n          value: snapshotLines[0] || viewModel.summary,\n          note: snapshotLines[1] || viewModel.summary,\n          items: snapshotLines.slice(2, 4),\n        } : null,\n        machineLines.length ? {\n          title: translateText(\"Machine fit\"),\n          tone: getMachineTrustTone(machineChecks),\n          badge: getMachineBadgeLabel(machineChecks),\n          value: machineLines[0] || translateText(\"Machine checked\"),\n          note: riskLines[0] || t(\"step4.release_note_message\", null),\n          items: machineLines.slice(1, 3),\n        } : (fitLines.length ? {\n          title: translateText(\"Decision signals\"),\n          tone: \"near\",\n          badge: confidence != null ? t(\"step4.confidence_badge\", null, { confidence: getConfidenceLabel(confidence) }) : translateText(\"Review\"),\n          value: fitLines[0],\n          note: viewModel.summary,\n          items: fitLines.slice(1, 3),\n        } : null),\n      ].filter(Boolean);\n      whyPanel = renderTappingStoryPanel({\n        tone: \"fit\",\n        eyebrow: translateText(\"Recommendation logic\"),\n        title: translateText(\"Why it fits\"),\n        badge: confidence != null ? t(\"step4.confidence_badge\", null, { confidence: getConfidenceLabel(confidence) }) : titleCaseToken(viewModel.processId),\n        highlight: whyItems[0] || viewModel.summary,\n        summary: viewModel.summary,\n        facts: dedupeTextItems([])\n          .concat(snapshotLines.slice(0, 1))\n          .concat(recipeBlock ? [t(\"step4.hero.data_chip\", null, { source: getRecipeSourceLabel(recipeSource) })] : [])\n          .concat(heroData.sku ? [t(\"common.sku_value\", null, { value: heroData.sku })] : []).slice(0, 3),\n        items: whyItems,\n      }, translateText(\"Why it fits\"), whyItems);\n      howPanel = renderTappingStoryPanel({\n        tone: \"start\",\n        eyebrow: translateText(\"First release\"),\n        title: translateText(\"How to start\"),\n        badge: recipeBlock ? getRecipeSourceLabel(recipeSource) : t(\"step4.first_part_first\", null),\n        highlight: t(\"step4.release_note_start_message\", null),\n        summary: translateText(\"The first parts should confirm quality, machine load and process stability before output is increased.\"),\n        facts: dedupeTextItems([])\n          .concat(metricGroups.primary.slice(0, 2).map(function mapTile(item) {\n            return item.label + \": \" + item.value + (item.unit ? \" \" + item.unit : \"\");\n          }))\n          .concat(metricGroups.machine.slice(0, 1).map(function mapTile(item) {\n            return item.label + \": \" + item.value + (item.unit ? \" \" + item.unit : \"\");\n          })).slice(0, 3),\n        items: howItems,\n      }, translateText(\"How to start\"), howItems);\n      watchPanel = renderTappingStoryPanel({\n        tone: watchItems.length ? \"watch\" : \"default\",\n        eyebrow: translateText(\"Critical signals\"),\n        title: translateText(\"Watch-outs\"),\n        badge: watchItems.length ? \"Review\" : t(\"step4.ready_to_review\", null),\n        highlight: watchItems[0] || translateText(\"No blocking guidance issues are active right now.\"),\n        summary: watchItems.length\n          ? translateText(\"Open to review the checks that matter most before widening the process window.\")\n          : translateText(\"The first parts should confirm quality, machine load and process stability before output is increased.\"),\n        facts: dedupeTextItems([])\n          .concat(riskLines.slice(0, 1))\n          .concat(machineLines.slice(0, 1)).slice(0, 3),\n        items: watchItems.length ? watchItems : [t(\"step4.release_note_message\", null)],\n      }, translateText(\"Watch-outs\"), watchItems);\n      heroVisual = renderHeroVisualRail(heroData, source, {\n        badgeLabel: t(\"step4.mr_edge_reviewed\", null),\n      });\n      advisorInline = renderAdvisorInline(source, {\n        eyebrow: t(\"step4.release_note\", null),\n        message: t(\"step4.release_note_message\", null),\n        context: recipeBlock ? t(\"step4.basis_label\", null, { source: getRecipeSourceLabel(recipeSource) }) : null,\n      });\n      actionBar = renderUnifiedActionBar(viewModel, commerceBlock, heroData, source);\n    \n      return createElement(\"section\", { className: \"tfv1-s4-hero tfv1-s4-hero-generic\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-hero-top\" + (heroVisual ? \" has-visual\" : \"\") }, [\n            createElement(\"div\", { className: \"tfv1-s4-hero-main\" }, [\n              createElement(\"div\", { className: \"tfv1-s4-kicker\", text: t(\"common.recommended_tool\", null) }),\n              createElement(\"div\", { className: \"tfv1-s4-title-row\" }, [\n                createElement(\"h2\", { className: \"tfv1-s4-title\", text: heroData.productTitle || t(\"common.recommended_tool\", null) }),\n                heroData.productUrl ? createElement(\"a\", {\n                className: \"tfv1-s4-link\",\n                href: heroData.productUrl,\n                  text: t(\"step4.product_details_link\", null),\n                }) : null,\n              ]),\n            createElement(\"p\", { className: \"tfv1-s4-summary\", text: compactText(heroData.presentation && heroData.presentation.summaryLine || viewModel.summary || translateText(\"Best result for the current setup.\")) }),\n            createElement(\"div\", { className: \"tfv1-s4-pills\" }, [\n              createElement(\"span\", { className: \"tfv1-s4-chip is-fit\", text: viewModel.outcome === \"match\" ? translateText(\"Best fit\") : translateText(\"Limited match\") }),\n              confidence != null ? createElement(\"span\", { className: \"tfv1-s4-chip is-\" + getConfidenceTone(confidence), text: t(\"step4.hero.confidence_chip\", null, { confidence: getConfidenceLabel(confidence) }) }) : null,\n              recipeBlock ? createElement(\"span\", { className: \"tfv1-s4-chip is-\" + getRecipeSourceTone(recipeSource), text: t(\"step4.hero.data_chip\", null, { source: getRecipeSourceLabel(recipeSource) }) }) : null,\n              createElement(\"span\", { className: \"tfv1-s4-chip is-\" + getRiskChipTone(riskLines), text: riskLines.length ? t(\"step4.hero.attention_points\", null, { count: riskLines.length }) : t(\"step4.hero.risk_controlled\", null) }),\n            ]),\n          ]),\n          heroVisual,\n          actionBar,\n        ]),\n        renderSetupPackageCard(bundleBlock, heroData, setupBlock),\n        renderStartHereCard({\n          description: recipeBlock ? t(\"step4.start_copy\", null) : null,\n          rowBackedValues: metricGroups.primary,\n          machineValues: metricGroups.machine,\n          rowLabel: translateText(\"Recommended start values\"),\n          advisorInline: advisorInline,\n        }),\n        renderAlternativeChoicesCard(alternativesBlock, heroData),\n        renderCollapsedV1Step4Cards(source, {\n          whyPanel: whyPanel,\n          howPanel: howPanel,\n          watchPanel: watchPanel,\n          troubleshootingCards: troubleshootingCards,\n          trustCards: trustCards,\n        }),\n      ]);\n    }\n    \n    function renderNoMatchResult(source) {\n      var viewModel = source && source.resultViewModel;\n      var blocks;\n      var guidanceBlock;\n      var warningBlock;\n      var message;\n      var steps;\n      var heroVisual;\n      var advisorInline;\n    \n      if (!viewModel || (viewModel.outcome !== \"no_match\" && viewModel.outcome !== \"insufficient_data\")) return null;\n    \n      blocks = viewModel.blocks || [];\n      guidanceBlock = findBlock(blocks, \"no_match_guidance\");\n      warningBlock = findBlock(blocks, \"warning\");\n      message = guidanceBlock && guidanceBlock.data && guidanceBlock.data.message\n        ? guidanceBlock.data.message\n        : warningBlock && warningBlock.data && warningBlock.data.message\n          ? warningBlock.data.message\n          : viewModel.summary || t(\"step4.no_match_summary\", null);\n      steps = dedupeTextItems([]\n        .concat(guidanceBlock && guidanceBlock.data && guidanceBlock.data.steps || [])\n        .concat(guidanceBlock && guidanceBlock.data && guidanceBlock.data.paragraphs || []));\n      heroVisual = renderHeroVisualRail(null, source);\n      advisorInline = renderAdvisorInline(source, {\n        eyebrow: t(\"step4.guidance\", null),\n        message: t(\"step4.no_match_guidance_message\", null),\n        context: steps[0] || null,\n        className: \"is-empty-state\",\n      });\n    \n      return createElement(\"section\", { className: \"tfv1-s4-hero is-empty\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-hero-top\" + (heroVisual ? \" has-visual\" : \"\") }, [\n          createElement(\"div\", { className: \"tfv1-s4-hero-main\" }, [\n            createElement(\"div\", { className: \"tfv1-s4-kicker\", text: translateText(\"Recommendation status\") }),\n            createElement(\"div\", { className: \"tfv1-s4-title-row\" }, [\n              createElement(\"h2\", { className: \"tfv1-s4-title\", text: viewModel.outcome === \"insufficient_data\" ? t(\"step4.more_input_needed\", null) : translateText(\"No safe recommendation yet\") }),\n            ]),\n            createElement(\"p\", { className: \"tfv1-s4-summary\", text: message }),\n            createElement(\"div\", { className: \"tfv1-s4-pills\" }, [\n              createElement(\"span\", { className: \"tfv1-s4-chip is-risk-high\", text: viewModel.outcome === \"insufficient_data\" ? t(\"step4.input_missing\", null) : t(\"step4.setup_review\", null) }),\n              warningBlock && warningBlock.data && warningBlock.data.message ? createElement(\"span\", { className: \"tfv1-s4-chip is-source-default\", text: t(\"step4.no_release_band\", null) }) : null,\n            ]),\n          ]),\n          heroVisual,\n        ]),\n        advisorInline,\n        createElement(\"div\", { className: \"tfv1-s4-story-grid tfv1-s4-story-grid-single\" }, [\n          renderTappingStoryPanel({\n            tone: \"watch\",\n            eyebrow: t(\"step4.what_to_check_next\", null),\n            title: translateText(\"Next best step\"),\n            badge: t(\"step4.guidance_badge\", null),\n            highlight: message,\n            summary: t(\"step4.no_match_summary\", null),\n            facts: [],\n            items: steps.length ? steps : [t(\"step4.go_back_step3\", null)],\n          }, translateText(\"Next best step\"), steps),\n        ]),\n        renderUnifiedActionBar(viewModel, null, {}, source),\n      ]);\n    }\n    \n    function renderFallbackResult(source) {\n      var viewModel = source && source.resultViewModel;\n      var blocks;\n      var heroBlock;\n      var commerceBlock;\n      var recipeBlock;\n      var setupBlock;\n      var alternativesBlock;\n      var bundleBlock;\n      var heroData;\n      var metricGroups;\n      var heroVisual;\n      var advisorInline;\n      var actionBar;\n    \n      if (!viewModel) return null;\n    \n      blocks = viewModel.blocks || [];\n      heroBlock = findBlock(blocks, \"hero_recommendation\");\n      commerceBlock = findBlock(blocks, \"commerce_cta\");\n      recipeBlock = findBlock(blocks, \"recipe_start_values\");\n      setupBlock = findBlock(blocks, \"setup_notes\");\n      alternativesBlock = findBlock(blocks, \"alternatives\");\n      bundleBlock = findBlock(blocks, \"bundle_recommendation\");\n      heroData = heroBlock && heroBlock.data || {};\n      metricGroups = buildMetricGroups(recipeBlock);\n      heroVisual = renderHeroVisualRail(heroData, source, {\n        badgeLabel: t(\"step4.mr_edge_reviewed\", null),\n      });\n      advisorInline = renderAdvisorInline(source, {\n        eyebrow: t(\"step4.guidance\", null),\n        message: t(\"step4.fallback_guidance_message\", null),\n        context: [heroData.variantTitle, heroData.sku ? t(\"common.sku_value\", null, { value: heroData.sku }) : null].filter(Boolean).join(\" | \") || null,\n      });\n      actionBar = renderUnifiedActionBar(viewModel, commerceBlock, heroData, source);\n    \n      return createElement(\"section\", { className: \"tfv1-s4-hero tfv1-s4-hero-generic tfv1-s4-hero-fallback\" }, [\n        createElement(\"div\", { className: \"tfv1-s4-hero-top\" + (heroVisual ? \" has-visual\" : \"\") }, [\n          createElement(\"div\", { className: \"tfv1-s4-hero-main\" }, [\n            createElement(\"div\", { className: \"tfv1-s4-kicker\", text: heroBlock ? translateText(\"Recommended tool\") : translateText(\"Recommendation overview\") }),\n            createElement(\"div\", { className: \"tfv1-s4-title-row\" }, [\n              createElement(\"h2\", {\n                className: \"tfv1-s4-title\",\n                text: heroData.productTitle || titleCaseToken(viewModel.processId || \"recommendation\"),\n              }),\n              heroData.productUrl ? createElement(\"a\", {\n                className: \"tfv1-s4-link\",\n                href: heroData.productUrl,\n                text: t(\"step4.product_details_link\", null),\n              }) : null,\n            ]),\n            createElement(\"p\", {\n              className: \"tfv1-s4-summary\",\n              text: viewModel.summary || t(\"step4.fallback_summary\", null),\n            }),\n          ]),\n          heroVisual,\n          actionBar,\n        ]),\n        renderSetupPackageCard(bundleBlock, heroData, setupBlock),\n        renderStartHereCard({\n          description: recipeBlock ? t(\"step4.start_copy\", null) : null,\n          rowBackedValues: metricGroups.primary,\n          machineValues: metricGroups.machine,\n          rowLabel: translateText(\"Recommended start values\"),\n          advisorInline: advisorInline,\n        }),\n        renderAlternativeChoicesCard(alternativesBlock, heroData),\n        renderCollapsedV1Step4Cards(source, {}),\n      ]);\n    }\n    \n    function shouldUseEnhancedResultLayout(viewModel) {\n      if (!viewModel) return false;\n      if (viewModel.outcome !== \"match\" && viewModel.outcome !== \"limited_match\") return false;\n      return [\n        \"tapping_through\",\n        \"tapping_blind\",\n        \"forming_through\",\n        \"forming_blind\",\n        \"drilling_through\",\n        \"drilling_blind\",\n        \"slotting\",\n        \"shoulder_milling\",\n        \"face_milling\",\n        \"pocket_milling\",\n        \"trochoidal_milling\",\n        \"ramping_helical_interpolation\",\n        \"plunging\",\n        \"high_feed_milling\",\n        \"copy_milling\",\n      ].indexOf(viewModel.processId) >= 0;\n    }\n    \n    function renderStep4(container, options) {\n      var source = options || {};\n      var tappingResult;\n      var genericResult;\n      var noMatchResult;\n      clearNode(container);\n      if (!source.resultViewModel) {\n        container.appendChild(createCard(t(\"step4.result_title\", null), [createElement(\"p\", { text: t(\"step4.no_result_yet\", null) })]));\n        return;\n      }\n      noMatchResult = renderNoMatchResult(source);\n      if (noMatchResult) {\n        container.appendChild(noMatchResult);\n        return;\n      }\n      if (shouldUseEnhancedResultLayout(source.resultViewModel)) {\n        tappingResult = renderTappingThroughResult(source);\n        if (tappingResult) {\n          container.appendChild(tappingResult);\n          return;\n        }\n      }\n      genericResult = renderGenericEnhancedResult(source);\n      if (genericResult) {\n        container.appendChild(genericResult);\n        return;\n      }\n      container.appendChild(renderFallbackResult(source));\n    }\n    \n    exports.renderStep4 = renderStep4;\n  },\n  \"processes/_shared/milling-composite-presenter.js\": function (exports, module, __bundle) {\n    var { bundleRecommendation } = __bundle.require(\"core/result-blocks.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      var value = toNullableNumber(priceCents);\n      if (value == null) return null;\n      return \"EUR \" + (value / 100).toFixed(2);\n    }\n    \n    function joinLabel(parts) {\n      return (parts || []).filter(Boolean).join(\" / \");\n    }\n    \n    function buildCompositePriceItems(systemContext, selectedInsert) {\n      var items = [];\n    \n      if (systemContext && systemContext.bodyPriceCents != null) {\n        items.push({\n          label: \"Body\",\n          value: formatPriceLabel(systemContext.bodyPriceCents),\n        });\n      }\n      if (selectedInsert && selectedInsert.priceCents != null) {\n        items.push({\n          label: \"Insert\",\n          value: formatPriceLabel(selectedInsert.priceCents),\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildMillingBundleRecommendation(candidate) {\n      var systemContext = candidate && candidate.attachments && candidate.attachments.systemContext\n        ? candidate.attachments.systemContext\n        : {};\n      var selectedInsert = systemContext.selectedInsert || null;\n      var facts = [];\n      var priceItems;\n    \n      if (systemContext.toolRole !== \"composite\" || !selectedInsert) return null;\n    \n      if (selectedInsert.gradeCode) facts.push(\"Grade \" + selectedInsert.gradeCode);\n      if (selectedInsert.sizeCode) facts.push(\"Size \" + selectedInsert.sizeCode);\n      if (selectedInsert.chipbreaker) facts.push(\"Chipbreaker \" + selectedInsert.chipbreaker);\n      if (selectedInsert.cornerRadiusMm != null) facts.push(\"RE \" + formatDisplayNumber(selectedInsert.cornerRadiusMm, 2) + \" mm\");\n      priceItems = buildCompositePriceItems(systemContext, selectedInsert);\n    \n      return bundleRecommendation({\n        eyebrow: \"Indexable setup\",\n        title: \"Body + insert combination\",\n        summary: \"This milling recommendation is a matched cutter body with a compatible insert. The body carries the main geometry fit, while the insert carries the grade and recipe context.\",\n        body: {\n          productTitle: candidate.catalog.productTitle || null,\n          variantTitle: systemContext.bodyVariantTitle || null,\n          sku: systemContext.bodySku || candidate.ids.sku || null,\n          productUrl: systemContext.bodyProductUrl || candidate.catalog.url || null,\n          imageUrl: candidate.catalog.imageUrl || null,\n          priceLabel: formatPriceLabel(systemContext.bodyPriceCents),\n        },\n        insert: {\n          productTitle: selectedInsert.productTitle || null,\n          variantTitle: selectedInsert.variantTitle || null,\n          sku: selectedInsert.sku || null,\n          productUrl: selectedInsert.productUrl || null,\n          imageUrl: selectedInsert.imageUrl || null,\n          gradeCode: selectedInsert.gradeCode || null,\n          sizeCode: selectedInsert.sizeCode || null,\n          chipbreaker: selectedInsert.chipbreaker || null,\n          cornerRadiusMm: selectedInsert.cornerRadiusMm != null ? formatDisplayNumber(selectedInsert.cornerRadiusMm, 2) + \" mm\" : null,\n          priceLabel: formatPriceLabel(selectedInsert.priceCents),\n        },\n        facts: facts,\n        priceItems: priceItems,\n        notes: [\n          \"Body: \" + joinLabel([candidate.catalog.productTitle, systemContext.bodyVariantTitle, systemContext.bodySku]),\n          \"Insert: \" + joinLabel([selectedInsert.productTitle, selectedInsert.variantTitle, selectedInsert.sku]),\n        ],\n      });\n    }\n    \n    function buildMillingCompositeCommerceData(candidate) {\n      var systemContext = candidate && candidate.attachments && candidate.attachments.systemContext\n        ? candidate.attachments.systemContext\n        : {};\n      var selectedInsert = systemContext.selectedInsert || null;\n      var priceItems;\n    \n      if (systemContext.toolRole !== \"composite\" || !selectedInsert) return null;\n    \n      priceItems = buildCompositePriceItems(systemContext, selectedInsert);\n      if (priceItems.length === 0) return null;\n    \n      return {\n        priceLabel: priceItems.map(function mapItem(item) {\n          return item.label + \" \" + item.value;\n        }).join(\" | \"),\n        priceItems: priceItems,\n      };\n    }\n    \n    exports.buildMillingBundleRecommendation = buildMillingBundleRecommendation;\n    exports.buildMillingCompositeCommerceData = buildMillingCompositeCommerceData;\n  },\n  \"processes/_shared/process-specs.js\": function (exports, module, __bundle) {\n    const PROCESS_SPECS = Object.freeze({\n      drilling_through: { family: \"drilling\", toolkits: [\"drilling\"], questionIds: [\"feature_diameter_mm\", \"feature_depth_mm\", \"coolant_capability\", \"entry_condition\", \"hole_passability\", \"material_condition_class\", \"priority\", \"exit_condition\", \"pilot_spot_status\", \"setup_stability\", \"machine_torque_capability\", \"tolerance_level\"], resultBlocks: { required: [\"hero_recommendation\", \"hole_summary\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"risk_notes\", \"machine_feasibility\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: true },\n      drilling_blind: { family: \"drilling\", toolkits: [\"drilling\"], questionIds: [\"feature_diameter_mm\", \"feature_depth_mm\", \"coolant_capability\", \"entry_condition\", \"hole_passability\", \"material_condition_class\", \"blind_bottom_type\", \"priority\", \"pilot_spot_status\", \"setup_stability\", \"machine_torque_capability\", \"tolerance_level\"], resultBlocks: { required: [\"hero_recommendation\", \"hole_summary\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"tolerance_notes\", \"risk_notes\", \"machine_feasibility\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: true },\n      deep_hole_drilling: { family: \"drilling\", toolkits: [\"drilling\"], questionIds: [\"feature_diameter_mm\", \"feature_depth_mm\", \"hole_depth_class\", \"through_coolant\", \"chip_evac_condition\", \"machine_coolant_bar\"], resultBlocks: { required: [\"hero_recommendation\", \"hole_summary\", \"fit_kpis\"], conditional: [\"machine_feasibility\", \"recipe_start_values\", \"risk_notes\", \"warning\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      reaming: { family: \"drilling\", toolkits: [\"drilling\"], questionIds: [\"feature_diameter_mm\", \"hole_tolerance\", \"pre_hole_status\", \"pre_hole_diameter\", \"feature_depth_mm\", \"blind_through\"], resultBlocks: { required: [\"hero_recommendation\", \"hole_summary\", \"fit_kpis\"], conditional: [\"tolerance_notes\", \"recipe_start_values\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      countersinking: { family: \"drilling\", toolkits: [\"drilling\"], questionIds: [\"countersink_purpose\", \"countersink_angle\", \"pre_hole_diameter\", \"target_top_dia_or_depth\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"fit_kpis\"], conditional: [\"recipe_start_values\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      chamfering: { family: \"drilling\", toolkits: [\"drilling\"], questionIds: [\"feature_diameter_mm\", \"condition_stage\", \"entry_condition\", \"workpiece_condition\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"fit_kpis\"], conditional: [\"recipe_start_values\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      tapping_blind: { family: \"threading\", toolkits: [\"threading\"], questionIds: [\"thread_standard_choice\", \"thread_nominal_size\", \"thread_length_mm\", \"bottom_clearance_class\", \"sync_tapping_capability\", \"coolant_lubrication_mode\", \"core_hole_status\", \"thread_tolerance\", \"thread_designation_override\", \"priority\", \"actual_predrill_diameter_mm\", \"actual_bottom_clearance_mm\", \"holder_type\", \"quality_sensitivity\", \"problem_history\", \"sealing_relevant\"], resultBlocks: { required: [\"hero_recommendation\", \"thread_identity\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"tolerance_notes\", \"risk_notes\", \"machine_feasibility\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: true },\n      tapping_through: { family: \"threading\", toolkits: [\"threading\"], questionIds: [\"thread_designation\", \"thread_length_mm\", \"core_hole_status\", \"sync_tapping_capability\", \"runout_condition\", \"lubrication_quality\", \"fit_class_important\", \"thread_tolerance\", \"sealing_relevant\"], resultBlocks: { required: [\"hero_recommendation\", \"thread_identity\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"tolerance_notes\", \"risk_notes\", \"machine_feasibility\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: true },\n      forming_blind: { family: \"threading\", toolkits: [\"threading\"], questionIds: [\"thread_standard_choice\", \"thread_nominal_size\", \"material_formability_class\", \"thread_length_mm\", \"bottom_reserve_class\", \"sync_tapping_capability\", \"coolant_lubrication_mode\", \"core_hole_status\", \"thread_tolerance\", \"thread_designation_override\", \"priority\", \"actual_predrill_diameter_mm\", \"actual_bottom_reserve_mm\", \"total_hole_depth_mm\", \"material_strength_class\", \"holder_type\", \"entry_protection\", \"quality_sensitivity\", \"problem_history\", \"sealing_relevant\"], resultBlocks: { required: [\"hero_recommendation\", \"thread_identity\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"tolerance_notes\", \"risk_notes\", \"machine_feasibility\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      forming_through: { family: \"threading\", toolkits: [\"threading\"], questionIds: [\"thread_standard_choice\", \"thread_nominal_size\", \"material_formability_class\", \"thread_length_mm\", \"sync_tapping_capability\", \"coolant_lubrication_mode\", \"core_hole_status\", \"entry_exit_sensitivity\", \"thread_tolerance\", \"thread_designation_override\", \"priority\", \"actual_predrill_diameter_mm\", \"material_strength_class\", \"holder_type\", \"entry_exit_protection\", \"quality_sensitivity\", \"problem_history\", \"sealing_relevant\"], resultBlocks: { required: [\"hero_recommendation\", \"thread_identity\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"tolerance_notes\", \"risk_notes\", \"machine_feasibility\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      thread_milling: { family: \"threading\", toolkits: [\"threading\", \"milling\"], questionIds: [\"thread_designation\", \"blind_through\", \"thread_depth_mm\", \"core_hole_status\", \"interpolation_capability\", \"cam_capability\", \"reason_for_thread_milling\", \"tolerance_level\", \"entry_strategy\"], resultBlocks: { required: [\"hero_recommendation\", \"thread_identity\", \"geometry_fit\", \"fit_kpis\"], conditional: [\"tolerance_notes\", \"recipe_start_values\", \"risk_notes\", \"machine_feasibility\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      profile_turning: { family: \"turning\", toolkits: [\"turning\"], questionIds: [\"profile_mode\", \"operation_phase\", \"material_refinement\", \"workpiece_diameter_mm\", \"ap_mm\", \"min_profile_radius_mm\", \"profile_steepness\", \"cut_interruption\", \"slender_or_confined\", \"surface_vs_productivity\", \"coolant_class\", \"tool_family_preference\", \"profile_angle_deg\", \"target_roughness\", \"wiper_allowed\", \"overhang_class\", \"special_material_route\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"risk_notes\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      boring: { family: \"turning\", toolkits: [\"turning\"], questionIds: [\"bore_type\", \"bore_diameter_mm\", \"bore_length_mm\", \"operation_phase\", \"material_refinement\", \"cut_interruption\", \"surface_vs_productivity\", \"coolant_class\", \"stability_class\", \"bar_diameter_mm\", \"damped_bar_allowed\", \"wiper_allowed\", \"target_roughness\", \"minimum_shoulder_access\", \"overhang_class\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"risk_notes\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: true },\n      grooving: { family: \"turning\", toolkits: [\"turning\"], questionIds: [\"groove_operation_type\", \"internal_external\", \"feature_width_mm\", \"groove_depth_mm\", \"chip_evac_condition\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\"], conditional: [\"recipe_start_values\", \"risk_notes\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      diameter_turning: { family: \"turning\", toolkits: [\"turning\"], questionIds: [\"turn_mode\", \"operation_phase\", \"material_refinement\", \"cut_interruption\", \"workpiece_diameter_mm\", \"ap_mm\", \"surface_vs_productivity\", \"slender_or_thinwall\", \"turning_shoulder_access\", \"coolant_class\", \"nose_radius_limit\", \"wiper_allowed\", \"overhang_class\", \"target_roughness\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"risk_notes\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      face_turning: { family: \"turning\", toolkits: [\"turning\"], questionIds: [\"operation_phase\", \"material_refinement\", \"workpiece_diameter_mm\", \"ap_mm\", \"surface_vs_productivity\", \"face_rigidity_class\", \"cut_interruption\", \"center_finish_required\", \"coolant_class\", \"special_face_mode\", \"target_roughness\", \"wiper_allowed\", \"nose_radius_limit\", \"tool_set_up_quality\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"risk_notes\", \"setup_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      slotting: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"feature_width_mm\", \"feature_depth_mm\", \"slot_type\", \"slot_start_state\", \"corner_radius_need\", \"max_corner_radius_mm\", \"material_condition_class\", \"setup_stability\", \"coolant_capability\", \"priority\", \"condition_stage\", \"max_tool_diameter_mm\", \"slot_reach_mm\", \"tool_concept_preference\", \"slot_quality_target\", \"machine_torque_capability\", \"cut_interruption\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: true },\n      shoulder_milling: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"wall_height_mm\", \"feature_width_mm\", \"shoulder_access\", \"shoulder_90_required\", \"corner_radius_need\", \"max_corner_radius_mm\", \"material_condition_class\", \"setup_stability\", \"priority\", \"condition_stage\", \"max_tool_diameter_mm\", \"shoulder_reach_mm\", \"tool_concept_preference\", \"coolant_capability\", \"machine_torque_capability\", \"cut_interruption\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      face_milling: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"face_size_l_mm\", \"face_size_w_mm\", \"stock_removal_mm\", \"face_sidewall_proximity\", \"condition_stage\", \"face_axial_weakness_class\", \"material_condition_class\", \"face_area_access_class\", \"priority\", \"max_tool_diameter_mm\", \"face_surface_finish_target\", \"face_tool_concept_preference\", \"face_pitch_preference\", \"coolant_capability\", \"machine_torque_capability\", \"face_variable_allowance_class\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      pocket_milling: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"pocket_topology_class\", \"pocket_min_opening_mm\", \"pocket_d_mm\", \"pocket_start_condition\", \"max_corner_radius_mm\", \"pocket_finish_strategy\", \"material_condition_class\", \"pocket_stability_class\", \"priority\", \"max_tool_diameter_mm\", \"pocket_tool_concept_preference\", \"pocket_opening_method\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      trochoidal_milling: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"trochoidal_feature_type\", \"feature_width_mm\", \"feature_depth_mm\", \"trochoidal_start_condition\", \"trochoidal_dynamic_capability\", \"material_condition_class\", \"trochoidal_stability_class\", \"trochoidal_finish_strategy\", \"trochoidal_coolant_support\", \"max_tool_diameter_mm\", \"trochoidal_reach_mm\", \"trochoidal_tool_concept_preference\", \"trochoidal_opening_method\", \"trochoidal_machine_torque_class\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      ramping_helical_interpolation: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"feature_diameter_mm\", \"feature_depth_mm\", \"helical_start_condition\", \"helical_finish_strategy\", \"helical_capability_class\", \"material_condition_class\", \"helical_coolant_support\", \"priority\", \"helical_tool_concept_preference\", \"helical_ramp_angle_deg\", \"max_tool_diameter_mm\", \"helical_tolerance_target\", \"helical_machine_limit_class\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      high_feed_milling: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"high_feed_geometry_class\", \"high_feed_ap_mm\", \"high_feed_shoulder_proximity\", \"high_feed_stability_class\", \"material_condition_class\", \"high_feed_finish_strategy\", \"high_feed_access_class\", \"priority\", \"max_tool_diameter_mm\", \"high_feed_reach_mm\", \"high_feed_tool_concept_preference\", \"high_feed_cam_side_milling_capability\", \"high_feed_axial_force_sensitivity\", \"coolant_capability\", \"machine_torque_capability\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      copy_milling: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"copy_operation_phase\", \"copy_surface_character\", \"copy_min_detail_mm\", \"feature_depth_mm\", \"copy_tilt_capability\", \"material_condition_class\", \"copy_surface_quality_target\", \"priority\", \"copy_stock_consistency_class\", \"copy_toolpath_strategy\", \"copy_tool_concept_preference\", \"copy_target_cusp_mm\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n      plunging: { family: \"milling\", toolkits: [\"milling\"], questionIds: [\"plunging_feature_type\", \"feature_width_mm\", \"feature_depth_mm\", \"plunging_starting_hole_status\", \"plunging_stability_class\", \"material_condition_class\", \"plunging_finish_strategy\", \"plunging_coolant_support\", \"priority\", \"max_tool_diameter_mm\", \"plunging_reach_mm\", \"plunging_tool_concept_preference\", \"plunging_opening_method\", \"plunging_machine_limit_class\", \"plunging_bottom_contact_critical\"], resultBlocks: { required: [\"hero_recommendation\", \"feature_summary\", \"geometry_fit\", \"fit_kpis\", \"recipe_start_values\"], conditional: [\"machine_feasibility\", \"setup_notes\", \"risk_notes\", \"alternatives\"], optional: [\"commerce_cta\"] }, reference: false },\n    });\n    \n    function getProcessSpec(processId) {\n      return PROCESS_SPECS[processId];\n    }\n    \n    exports.getProcessSpec = getProcessSpec;\n    exports.PROCESS_SPECS = PROCESS_SPECS;\n  },\n  \"processes/_shared/question-library.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { toNullableDraftNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    function positiveNumberQuestion(id, label, unit, options) {\n      return createQuestionDef({\n        id: id,\n        type: \"number\",\n        label: label,\n        unit: unit || null,\n        helpText: null,\n        placeholder: null,\n        group: options && options.group || \"core\",\n        required: options ? options.required !== false : true,\n        expertOnly: Boolean(options && options.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: \"keep\",\n        normalize: function normalize(value) { return toNullableDraftNumber(value); },\n        validate: function validate(value) {\n          return value == null || value > 0 ? [] : [{ field: id, message: \"Please enter a positive value.\", severity: \"error\" }];\n        },\n        derive: null,\n        viewHint: { width: \"half\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function tokenQuestion(id, label, options, config) {\n      return createQuestionDef({\n        id: id,\n        type: config && config.type || \"select\",\n        label: label,\n        helpText: null,\n        placeholder: null,\n        unit: null,\n        group: config && config.group || \"core\",\n        required: config ? config.required !== false : true,\n        expertOnly: Boolean(config && config.expertOnly),\n        options: options || [],\n        defaultValue: null,\n        hiddenValuePolicy: config && config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) { return toNullableString(value); },\n        validate: null,\n        derive: null,\n        viewHint: { width: \"half\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function textQuestion(id, label, config) {\n      return createQuestionDef({\n        id: id,\n        type: \"text\",\n        label: label,\n        helpText: null,\n        placeholder: null,\n        unit: null,\n        group: config && config.group || \"core\",\n        required: config ? config.required !== false : true,\n        expertOnly: Boolean(config && config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: \"keep\",\n        normalize: function normalize(value) { return toNullableString(value); },\n        validate: null,\n        derive: null,\n        viewHint: { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    const QUESTION_LIBRARY = Object.freeze({\n      feature_diameter_mm: positiveNumberQuestion(\"feature_diameter_mm\", \"Target diameter\", \"mm\"),\n      feature_depth_mm: positiveNumberQuestion(\"feature_depth_mm\", \"Target depth\", \"mm\"),\n      feature_width_mm: positiveNumberQuestion(\"feature_width_mm\", \"Feature width\", \"mm\"),\n      bore_diameter_mm: positiveNumberQuestion(\"bore_diameter_mm\", \"Bore diameter\", \"mm\"),\n      bore_depth_mm: positiveNumberQuestion(\"bore_depth_mm\", \"Bore depth\", \"mm\"),\n      bore_length_mm: positiveNumberQuestion(\"bore_length_mm\", \"Bore length\", \"mm\"),\n      groove_depth_mm: positiveNumberQuestion(\"groove_depth_mm\", \"Groove depth\", \"mm\"),\n      thread_depth_mm: positiveNumberQuestion(\"thread_depth_mm\", \"Thread depth\", \"mm\"),\n      thread_length_mm: positiveNumberQuestion(\"thread_length_mm\", \"Thread length\", \"mm\"),\n      pre_hole_diameter: positiveNumberQuestion(\"pre_hole_diameter\", \"Pre-hole diameter\", \"mm\"),\n      core_hole_dia: positiveNumberQuestion(\"core_hole_dia\", \"Core hole diameter\", \"mm\"),\n      bottom_clearance: positiveNumberQuestion(\"bottom_clearance\", \"Bottom clearance\", \"mm\"),\n      machine_coolant_bar: positiveNumberQuestion(\"machine_coolant_bar\", \"Coolant pressure\", \"bar\"),\n      exact_overhang_mm: positiveNumberQuestion(\"exact_overhang_mm\", \"Exact overhang\", \"mm\"),\n      bar_diameter_mm: positiveNumberQuestion(\"bar_diameter_mm\", \"Boring bar diameter\", \"mm\", { required: false, expertOnly: true }),\n      face_size_l_mm: positiveNumberQuestion(\"face_size_l_mm\", \"Face size L\", \"mm\"),\n      face_size_w_mm: positiveNumberQuestion(\"face_size_w_mm\", \"Face size W\", \"mm\"),\n      stock_removal_mm: positiveNumberQuestion(\"stock_removal_mm\", \"Stock removal\", \"mm\"),\n      pocket_l_mm: positiveNumberQuestion(\"pocket_l_mm\", \"Pocket length\", \"mm\"),\n      pocket_w_mm: positiveNumberQuestion(\"pocket_w_mm\", \"Pocket width\", \"mm\"),\n      pocket_d_mm: positiveNumberQuestion(\"pocket_d_mm\", \"Pocket depth\", \"mm\"),\n      pocket_min_opening_mm: positiveNumberQuestion(\"pocket_min_opening_mm\", \"Pocket minimum opening\", \"mm\"),\n      copy_min_detail_mm: positiveNumberQuestion(\"copy_min_detail_mm\", \"Smallest detail / radius\", \"mm\"),\n      copy_target_cusp_mm: positiveNumberQuestion(\"copy_target_cusp_mm\", \"Target cusp / scallop\", \"mm\", { required: false, expertOnly: true }),\n      tool_reach_limit: positiveNumberQuestion(\"tool_reach_limit\", \"Tool reach limit\", \"mm\"),\n      wall_height_mm: positiveNumberQuestion(\"wall_height_mm\", \"Wall height\", \"mm\"),\n      max_corner_radius_mm: positiveNumberQuestion(\"max_corner_radius_mm\", \"Max corner radius\", \"mm\"),\n      max_tool_diameter_mm: positiveNumberQuestion(\"max_tool_diameter_mm\", \"Max tool diameter\", \"mm\", { required: false, expertOnly: true }),\n      shoulder_reach_mm: positiveNumberQuestion(\"shoulder_reach_mm\", \"Shoulder reach\", \"mm\", { required: false, expertOnly: true }),\n      slot_reach_mm: positiveNumberQuestion(\"slot_reach_mm\", \"Slot reach\", \"mm\", { required: false, expertOnly: true }),\n      trochoidal_reach_mm: positiveNumberQuestion(\"trochoidal_reach_mm\", \"Required reach\", \"mm\", { required: false, expertOnly: true }),\n      high_feed_ap_mm: positiveNumberQuestion(\"high_feed_ap_mm\", \"High-feed axial depth\", \"mm\"),\n      high_feed_reach_mm: positiveNumberQuestion(\"high_feed_reach_mm\", \"Required reach\", \"mm\", { required: false, expertOnly: true }),\n      plunging_reach_mm: positiveNumberQuestion(\"plunging_reach_mm\", \"Required plunge reach\", \"mm\", { required: false, expertOnly: true }),\n      helical_ramp_angle_deg: positiveNumberQuestion(\"helical_ramp_angle_deg\", \"Helical ramp angle\", \"deg\", { required: false, expertOnly: true }),\n      target_top_dia_or_depth: positiveNumberQuestion(\"target_top_dia_or_depth\", \"Target top diameter or depth\", \"mm\"),\n      ramp_angle_request: positiveNumberQuestion(\"ramp_angle_request\", \"Ramp angle request\", \"deg\"),\n      countersink_angle: positiveNumberQuestion(\"countersink_angle\", \"Countersink angle\", \"deg\"),\n      thread_designation: textQuestion(\"thread_designation\", \"Thread designation\"),\n      profile_zone_dims: textQuestion(\"profile_zone_dims\", \"Profile zone dimensions\"),\n      od_diameter_range: textQuestion(\"od_diameter_range\", \"OD diameter range\"),\n      turning_length_or_overhang: textQuestion(\"turning_length_or_overhang\", \"Turning length or overhang\"),\n      workpiece_diameter_mm: positiveNumberQuestion(\"workpiece_diameter_mm\", \"Workpiece diameter\", \"mm\"),\n      ap_mm: positiveNumberQuestion(\"ap_mm\", \"Depth of cut ap\", \"mm\"),\n      min_profile_radius_mm: positiveNumberQuestion(\"min_profile_radius_mm\", \"Minimum profile radius\", \"mm\"),\n      nose_radius_limit: positiveNumberQuestion(\"nose_radius_limit\", \"Max nose radius\", \"mm\", { required: false, expertOnly: true }),\n      profile_angle_deg: positiveNumberQuestion(\"profile_angle_deg\", \"Profile angle\", \"deg\", { required: false, expertOnly: true }),\n      target_roughness: positiveNumberQuestion(\"target_roughness\", \"Target roughness\", \"um\", { required: false, expertOnly: true }),\n      condition_stage: tokenQuestion(\"condition_stage\", \"Condition stage\", [{ value: \"roughing\", label: \"Roughing\" }, { value: \"semi-finishing\", label: \"Semi-finishing\" }, { value: \"finishing\", label: \"Finishing\" }]),\n      goal_stage: tokenQuestion(\"goal_stage\", \"Goal stage\", [{ value: \"roughing\", label: \"Roughing\" }, { value: \"semi-finishing\", label: \"Semi-finishing\" }, { value: \"finishing\", label: \"Finishing\" }]),\n      turn_mode: tokenQuestion(\"turn_mode\", \"Turning mode\", [{ value: \"external\", label: \"External turning\" }, { value: \"internal\", label: \"Internal turning\" }], { type: \"chips\" }),\n      operation_phase: tokenQuestion(\"operation_phase\", \"Operation phase\", [{ value: \"roughing\", label: \"Roughing\" }, { value: \"semi-finishing\", label: \"Medium / semi-finishing\" }, { value: \"finishing\", label: \"Finishing\" }], { type: \"chips\" }),\n      material_refinement: tokenQuestion(\"material_refinement\", \"Material refinement\", [\n        { value: \"standard\", label: \"Standard\" },\n        { value: \"tough_long_chipping\", label: \"Tough / long-chipping\" },\n        { value: \"sticky_bue\", label: \"Sticky / built-up edge\" },\n        { value: \"short_chipping\", label: \"Short-chipping\" },\n        { value: \"work_hardening\", label: \"Work-hardening\" },\n        { value: \"hard\", label: \"Hard\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { type: \"chips\" }),\n      surface_vs_productivity: tokenQuestion(\"surface_vs_productivity\", \"Surface vs productivity\", [\n        { value: \"surface\", label: \"Surface quality\" },\n        { value: \"balanced\", label: \"Balanced\" },\n        { value: \"productivity\", label: \"Productivity\" },\n      ], { type: \"chips\" }),\n      slender_or_thinwall: tokenQuestion(\"slender_or_thinwall\", \"Slender / thin-wall condition\", [\n        { value: \"no\", label: \"No\" },\n        { value: \"light\", label: \"Slightly slender / thin-wall\" },\n        { value: \"strong\", label: \"Strongly slender / thin-wall\" },\n      ], { type: \"chips\" }),\n      turning_shoulder_access: tokenQuestion(\"turning_shoulder_access\", \"Shoulder / contour access\", [\n        { value: \"free\", label: \"Free\" },\n        { value: \"near_shoulder\", label: \"Near shoulder\" },\n        { value: \"tight_contour\", label: \"Tight contour\" },\n        { value: \"forced_form\", label: \"Forced form / tight profile\" },\n      ], { type: \"chips\" }),\n      profile_mode: tokenQuestion(\"profile_mode\", \"Profile mode\", [\n        { value: \"external_profile\", label: \"External profile\" },\n        { value: \"internal_profile\", label: \"Internal profile\" },\n      ], { type: \"chips\" }),\n      profile_steepness: tokenQuestion(\"profile_steepness\", \"Profile steepness\", [\n        { value: \"shallow\", label: \"Shallow\" },\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"steep\", label: \"Steep\" },\n        { value: \"undercut\", label: \"Undercut / back-cut\" },\n      ], { type: \"chips\" }),\n      slender_or_confined: tokenQuestion(\"slender_or_confined\", \"Slender / confined condition\", [\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"thin_wall\", label: \"Thin-wall\" },\n        { value: \"small_internal_space\", label: \"Small internal space\" },\n        { value: \"unstable\", label: \"Unstable / weak setup\" },\n      ], { type: \"chips\" }),\n      coolant_class: tokenQuestion(\"coolant_class\", \"Coolant class\", [\n        { value: \"dry\", label: \"Dry\" },\n        { value: \"external\", label: \"External coolant\" },\n        { value: \"internal\", label: \"Internal coolant\" },\n        { value: \"high_pressure\", label: \"High-pressure coolant\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, type: \"chips\" }),\n      bore_type: tokenQuestion(\"bore_type\", \"Bore type\", [\n        { value: \"through_bore\", label: \"Through bore\" },\n        { value: \"blind_bore\", label: \"Blind bore\" },\n      ], { type: \"chips\" }),\n      stability_class: tokenQuestion(\"stability_class\", \"Stability class\", [\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"critical\", label: \"Critical\" },\n        { value: \"very_critical\", label: \"Very critical\" },\n      ], { type: \"chips\" }),\n      damped_bar_allowed: tokenQuestion(\"damped_bar_allowed\", \"Damped bar allowed\", [\n        { value: \"yes\", label: \"Yes\" },\n        { value: \"no\", label: \"No\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true, type: \"chips\" }),\n      face_rigidity_class: tokenQuestion(\"face_rigidity_class\", \"Face rigidity / radial-force sensitivity\", [\n        { value: \"normal\", label: \"Normal / rigid face\" },\n        { value: \"lightly_unstable\", label: \"Lightly unstable\" },\n        { value: \"strongly_unstable\", label: \"Strongly unstable / thin face\" },\n      ], { type: \"chips\" }),\n      center_finish_required: tokenQuestion(\"center_finish_required\", \"Finish quality through center\", [\n        { value: \"functional_to_center\", label: \"Functional to center\" },\n        { value: \"clean_to_center\", label: \"Clean through center\" },\n        { value: \"center_uncritical\", label: \"Center uncritical\" },\n      ], { type: \"chips\" }),\n      special_face_mode: tokenQuestion(\"special_face_mode\", \"Face-turning mode\", [\n        { value: \"standard\", label: \"Standard\" },\n        { value: \"confined\", label: \"Confined / access-limited\" },\n        { value: \"bidirectional\", label: \"Bidirectional / forward-reverse\" },\n        { value: \"special_tool\", label: \"Special tool / setup\" },\n      ], { required: false, type: \"chips\" }),\n      wiper_allowed: tokenQuestion(\"wiper_allowed\", \"Wiper allowed\", [\n        { value: \"yes\", label: \"Yes\" },\n        { value: \"no\", label: \"No\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true, type: \"chips\" }),\n      overhang_class: tokenQuestion(\"overhang_class\", \"Overhang class\", [\n        { value: \"short\", label: \"Short\" },\n        { value: \"medium\", label: \"Medium\" },\n        { value: \"long\", label: \"Long\" },\n        { value: \"critical\", label: \"Critical\" },\n      ], { required: false, expertOnly: true, type: \"chips\" }),\n      tool_family_preference: tokenQuestion(\"tool_family_preference\", \"Tool family preference\", [\n        { value: \"either\", label: \"Either\" },\n        { value: \"iso_holder\", label: \"ISO holder\" },\n        { value: \"copy_turn_system\", label: \"Copy-turn system\" },\n        { value: \"groove_turn_system\", label: \"Groove-turn system\" },\n      ], { required: false, type: \"chips\" }),\n      special_material_route: tokenQuestion(\"special_material_route\", \"Special material route\", [\n        { value: \"auto\", label: \"Auto\" },\n        { value: \"carbide_default\", label: \"Carbide\" },\n        { value: \"cermet_possible\", label: \"Cermet\" },\n        { value: \"cbn_pcbn_route\", label: \"CBN / PcBN\" },\n        { value: \"pcd_route\", label: \"PCD / PKD\" },\n      ], { required: false, expertOnly: true, type: \"chips\" }),\n      tool_set_up_quality: tokenQuestion(\"tool_set_up_quality\", \"Center height / setup quality\", [\n        { value: \"controlled\", label: \"Controlled\" },\n        { value: \"uncertain\", label: \"Uncertain\" },\n      ], { required: false, expertOnly: true, type: \"chips\" }),\n      minimum_shoulder_access: tokenQuestion(\"minimum_shoulder_access\", \"Shoulder / access condition\", [\n        { value: \"straight_bore\", label: \"Straight bore\" },\n        { value: \"shoulder\", label: \"Shoulder inside bore\" },\n        { value: \"tight_shoulder\", label: \"Tight shoulder / limited access\" },\n      ], { required: false, expertOnly: true, type: \"chips\" }),\n      exit_condition: tokenQuestion(\"exit_condition\", \"Exit condition\", [{ value: \"clear_exit\", label: \"Clear exit\" }, { value: \"interrupted_exit\", label: \"Interrupted exit\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      entry_condition: tokenQuestion(\"entry_condition\", \"Entry condition\", [{ value: \"flat\", label: \"Flat\" }, { value: \"angled\", label: \"Angled\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      hole_passability: tokenQuestion(\"hole_passability\", \"Hole passability\", [{ value: \"solid\", label: \"Solid / whole material\" }, { value: \"interrupted\", label: \"Interrupted / cross-hole\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      chip_evac_condition: tokenQuestion(\"chip_evac_condition\", \"Chip evacuation\", [{ value: \"good\", label: \"Good\" }, { value: \"limited\", label: \"Limited\" }, { value: \"poor\", label: \"Poor\" }], { type: \"chips\" }),\n      hole_depth_class: tokenQuestion(\"hole_depth_class\", \"Hole depth class\", [{ value: \"3xD\", label: \"3xD\" }, { value: \"5xD\", label: \"5xD\" }, { value: \"8xD\", label: \"8xD\" }, { value: \"10xD\", label: \"10xD\" }, { value: \"12xD\", label: \"12xD\" }]),\n      blind_bottom_type: tokenQuestion(\"blind_bottom_type\", \"Blind bottom type\", [{ value: \"flat\", label: \"Flat\" }, { value: \"conical\", label: \"Conical\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      coolant_capability: tokenQuestion(\"coolant_capability\", \"Coolant capability\", [{ value: \"through\", label: \"Through coolant\" }, { value: \"external\", label: \"External coolant\" }, { value: \"dry\", label: \"Dry\" }, { value: \"unknown\", label: \"Unknown\" }]),\n      through_coolant: tokenQuestion(\"through_coolant\", \"Through coolant\", [{ value: \"yes\", label: \"Yes\" }, { value: \"no\", label: \"No\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      hole_tolerance: tokenQuestion(\"hole_tolerance\", \"Hole tolerance\", [{ value: \"general\", label: \"General\" }, { value: \"medium\", label: \"Medium\" }, { value: \"tight\", label: \"Tight / H7\" }]),\n      pre_hole_status: tokenQuestion(\"pre_hole_status\", \"Pre-hole status\", [{ value: \"rough\", label: \"Rough drilled\" }, { value: \"semi\", label: \"Semi-finished\" }, { value: \"to_size\", label: \"Near size\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      blind_through: tokenQuestion(\"blind_through\", \"Blind or through\", [{ value: \"blind\", label: \"Blind\" }, { value: \"through\", label: \"Through\" }], { type: \"chips\" }),\n      countersink_purpose: tokenQuestion(\"countersink_purpose\", \"Countersink purpose\", [{ value: \"screw_seat\", label: \"Screw seating\" }, { value: \"chamfer_break\", label: \"Edge break\" }, { value: \"deburr\", label: \"Deburring\" }, { value: \"prep\", label: \"Prep for next op\" }], { type: \"chips\" }),\n      workpiece_condition: tokenQuestion(\"workpiece_condition\", \"Workpiece condition\", [{ value: \"stable\", label: \"Stable\" }, { value: \"interrupted\", label: \"Interrupted\" }, { value: \"thin_wall\", label: \"Thin wall\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      core_hole_status: tokenQuestion(\"core_hole_status\", \"Core hole status\", [{ value: \"to_spec\", label: \"To spec\" }, { value: \"unknown\", label: \"Unknown\" }, { value: \"missing\", label: \"Missing\" }], { type: \"chips\" }),\n      sync_tapping_capability: tokenQuestion(\"sync_tapping_capability\", \"Sync tapping capability\", [{ value: \"yes\", label: \"Yes\" }, { value: \"no\", label: \"No\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      lubrication_quality: tokenQuestion(\"lubrication_quality\", \"Lubrication quality\", [{ value: \"good\", label: \"Good\" }, { value: \"medium\", label: \"Medium\" }, { value: \"poor\", label: \"Poor\" }], { type: \"chips\" }),\n      fit_class_important: tokenQuestion(\"fit_class_important\", \"Fit class important\", [{ value: \"yes\", label: \"Yes\" }, { value: \"no\", label: \"No\" }], { type: \"chips\" }),\n      thread_tolerance: textQuestion(\"thread_tolerance\", \"Thread tolerance\", { required: false }),\n      sealing_relevant: tokenQuestion(\"sealing_relevant\", \"Sealing relevant\", [{ value: \"yes\", label: \"Yes\" }, { value: \"no\", label: \"No\" }], { type: \"chips\" }),\n      runout_condition: tokenQuestion(\"runout_condition\", \"Runout condition\", [{ value: \"good\", label: \"Good\" }, { value: \"limited\", label: \"Limited\" }, { value: \"poor\", label: \"Poor\" }], { type: \"chips\" }),\n      machine_torque_capability: tokenQuestion(\"machine_torque_capability\", \"Machine torque capability\", [{ value: \"low\", label: \"Low\" }, { value: \"medium\", label: \"Medium\" }, { value: \"high\", label: \"High\" }]),\n      interpolation_capability: tokenQuestion(\"interpolation_capability\", \"Interpolation capability\", [{ value: \"yes\", label: \"Yes\" }, { value: \"no\", label: \"No\" }], { type: \"chips\" }),\n      cam_capability: tokenQuestion(\"cam_capability\", \"CAM capability\", [{ value: \"basic\", label: \"Basic\" }, { value: \"advanced\", label: \"Advanced\" }, { value: \"none\", label: \"None\" }]),\n      reason_for_thread_milling: tokenQuestion(\"reason_for_thread_milling\", \"Reason for thread milling\", [{ value: \"quality\", label: \"Quality\" }, { value: \"flexibility\", label: \"Flexibility\" }, { value: \"tap_failure_recovery\", label: \"Tap failure recovery\" }], { type: \"chips\" }),\n      tolerance_level: tokenQuestion(\"tolerance_level\", \"Tolerance level\", [{ value: \"general\", label: \"General\" }, { value: \"tight\", label: \"Tight\" }, { value: \"high_precision\", label: \"High precision\" }]),\n      entry_strategy: tokenQuestion(\"entry_strategy\", \"Entry strategy\", [{ value: \"direct\", label: \"Direct\" }, { value: \"ramp\", label: \"Ramp\" }, { value: \"helical\", label: \"Helical\" }, { value: \"pre_drilled\", label: \"Pre-drilled\" }]),\n      internal_external: tokenQuestion(\"internal_external\", \"Internal or external\", [{ value: \"internal\", label: \"Internal\" }, { value: \"external\", label: \"External\" }], { type: \"chips\" }),\n      profile_complexity: tokenQuestion(\"profile_complexity\", \"Profile complexity\", [{ value: \"simple\", label: \"Simple\" }, { value: \"medium\", label: \"Medium\" }, { value: \"complex\", label: \"Complex\" }]),\n      cut_interruption: tokenQuestion(\"cut_interruption\", \"Cut interruption\", [{ value: \"none\", label: \"None\" }, { value: \"light\", label: \"Light\" }, { value: \"heavy\", label: \"Heavy\" }], { type: \"chips\" }),\n      overhang_condition: tokenQuestion(\"overhang_condition\", \"Overhang condition\", [{ value: \"short\", label: \"Short\" }, { value: \"medium\", label: \"Medium\" }, { value: \"long\", label: \"Long\" }]),\n      surface_target: tokenQuestion(\"surface_target\", \"Surface target\", [{ value: \"general\", label: \"General\" }, { value: \"good\", label: \"Good\" }, { value: \"fine\", label: \"Fine\" }]),\n      groove_operation_type: tokenQuestion(\"groove_operation_type\", \"Grooving operation\", [{ value: \"parting\", label: \"Parting\" }, { value: \"od_groove\", label: \"OD groove\" }, { value: \"id_groove\", label: \"ID groove\" }, { value: \"face_groove\", label: \"Face groove\" }], { type: \"chips\" }),\n      clamping_stability: tokenQuestion(\"clamping_stability\", \"Clamping stability\", [{ value: \"strong\", label: \"Strong\" }, { value: \"medium\", label: \"Medium\" }, { value: \"weak\", label: \"Weak\" }], { type: \"chips\" }),\n      material_condition_class: tokenQuestion(\"material_condition_class\", \"Material condition\", [{ value: \"standard\", label: \"Standard\" }, { value: \"tough_long_chipping\", label: \"Tough / long-chipping\" }, { value: \"sticky_bue\", label: \"Sticky / built-up edge\" }, { value: \"work_hardening\", label: \"Work-hardening\" }, { value: \"hard_abrasive\", label: \"Hard / abrasive\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      pilot_spot_status: tokenQuestion(\"pilot_spot_status\", \"Spot / pilot status\", [{ value: \"none\", label: \"None\" }, { value: \"spot_only\", label: \"Spot only\" }, { value: \"pilot_hole\", label: \"Pilot hole present\" }, { value: \"unknown\", label: \"Unknown\" }], { required: false, type: \"chips\" }),\n      face_geometry_type: tokenQuestion(\"face_geometry_type\", \"Face geometry type\", [{ value: \"flat\", label: \"Flat\" }, { value: \"stepped\", label: \"Stepped\" }, { value: \"profiled\", label: \"Profiled\" }]),\n      face_surface_flatness_req: tokenQuestion(\"face_surface_flatness_req\", \"Flatness requirement\", [{ value: \"general\", label: \"General\" }, { value: \"tight\", label: \"Tight\" }]),\n      face_sidewall_proximity: tokenQuestion(\"face_sidewall_proximity\", \"Sidewall / clamp proximity\", [\n        { value: \"clear\", label: \"Clear\" },\n        { value: \"near_sidewall\", label: \"Near sidewall\" },\n        { value: \"near_clamps\", label: \"Near clamps\" },\n        { value: \"near_wall_and_clamps\", label: \"Near wall and clamps\" },\n      ], { type: \"chips\" }),\n      face_axial_weakness_class: tokenQuestion(\"face_axial_weakness_class\", \"Axial weakness\", [\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"somewhat_weak\", label: \"Somewhat weak\" },\n        { value: \"thin_axially_weak\", label: \"Thin / axially weak\" },\n      ], { type: \"chips\" }),\n      face_area_access_class: tokenQuestion(\"face_area_access_class\", \"Area access\", [\n        { value: \"open_large_surface\", label: \"Open large surface\" },\n        { value: \"normal_surface\", label: \"Normal surface\" },\n        { value: \"small_confined_area\", label: \"Small / confined area\" },\n      ], { type: \"chips\" }),\n      face_surface_finish_target: tokenQuestion(\"face_surface_finish_target\", \"Surface finish target\", [\n        { value: \"general\", label: \"General\" },\n        { value: \"good\", label: \"Good\" },\n        { value: \"fine\", label: \"Fine\" },\n        { value: \"wiper_critical\", label: \"Wiper-critical\" },\n      ], { required: false, expertOnly: true }),\n      face_tool_concept_preference: tokenQuestion(\"face_tool_concept_preference\", \"Tool concept\", [\n        { value: \"either\", label: \"Either\" },\n        { value: \"indexable_only\", label: \"Indexable only\" },\n        { value: \"small_head_or_modular\", label: \"Small head / modular\" },\n        { value: \"solid_like_small_head_only\", label: \"Solid-like small head only\" },\n      ], { required: false, expertOnly: true }),\n      face_pitch_preference: tokenQuestion(\"face_pitch_preference\", \"Pitch / stability preference\", [\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"coarse\", label: \"Coarse pitch\" },\n        { value: \"close_pitch\", label: \"Close pitch\" },\n        { value: \"differential_pitch\", label: \"Differential pitch\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true }),\n      face_variable_allowance_class: tokenQuestion(\"face_variable_allowance_class\", \"Allowance variation\", [\n        { value: \"uniform\", label: \"Uniform\" },\n        { value: \"moderate\", label: \"Moderate\" },\n        { value: \"variable_casting_allowance\", label: \"Variable casting allowance\" },\n      ], { required: false, expertOnly: true }),\n      copy_operation_phase: tokenQuestion(\"copy_operation_phase\", \"Operation phase\", [\n        { value: \"roughing_semiroughing\", label: \"Roughing / semi-roughing\" },\n        { value: \"semi_finishing\", label: \"Semi-finishing\" },\n        { value: \"finishing_superfinishing\", label: \"Finishing / super-finishing\" },\n      ]),\n      copy_surface_character: tokenQuestion(\"copy_surface_character\", \"Surface character\", [\n        { value: \"steep_walls\", label: \"Steep walls\" },\n        { value: \"shallow_freeform\", label: \"Shallow freeform\" },\n        { value: \"floor_transition_radii\", label: \"Floor / transition radii\" },\n        { value: \"mixed_3d_form\", label: \"Mixed 3D form\" },\n      ]),\n      copy_tilt_capability: tokenQuestion(\"copy_tilt_capability\", \"Tilt / 5-axis availability\", [\n        { value: \"none\", label: \"No tilt\" },\n        { value: \"limited_tilt\", label: \"3+2 / limited tilt\" },\n        { value: \"continuous_tilt\", label: \"Continuous 5-axis tilt\" },\n      ], { type: \"chips\" }),\n      copy_surface_quality_target: tokenQuestion(\"copy_surface_quality_target\", \"Surface quality target\", [\n        { value: \"functional\", label: \"Functional\" },\n        { value: \"polishable\", label: \"Polishable\" },\n        { value: \"finish_critical\", label: \"Finish-critical\" },\n      ]),\n      copy_stock_consistency_class: tokenQuestion(\"copy_stock_consistency_class\", \"Stock consistency\", [\n        { value: \"good\", label: \"Good / constant\" },\n        { value: \"acceptable\", label: \"Acceptable\" },\n        { value: \"poor\", label: \"Poor / uneven\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true }),\n      copy_toolpath_strategy: tokenQuestion(\"copy_toolpath_strategy\", \"Toolpath strategy\", [\n        { value: \"traditional_copy\", label: \"Traditional copy\" },\n        { value: \"acceptable_copy\", label: \"Acceptable copy\" },\n        { value: \"contouring\", label: \"Contouring\" },\n        { value: \"waterline\", label: \"Waterline / Z-constant\" },\n        { value: \"helical_contouring\", label: \"Helical contouring\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true }),\n      copy_tool_concept_preference: tokenQuestion(\"copy_tool_concept_preference\", \"Tool concept\", [\n        { value: \"either\", label: \"Either\" },\n        { value: \"round_insert_only\", label: \"Round insert only\" },\n        { value: \"indexable_ball_only\", label: \"Indexable ball only\" },\n        { value: \"exchangeable_ball_only\", label: \"Exchangeable ball only\" },\n        { value: \"solid_ball_only\", label: \"Solid ball only\" },\n        { value: \"barrel_or_segment_allowed\", label: \"Barrel / segment allowed\" },\n      ], { required: false, expertOnly: true }),\n      slot_type: tokenQuestion(\"slot_type\", \"Slot type\", [{ value: \"full_slot\", label: \"Full slot\" }, { value: \"partial_slot\", label: \"Partial slot\" }, { value: \"open_slot\", label: \"Open slot\" }]),\n      slot_start_state: tokenQuestion(\"slot_start_state\", \"Slot start state\", [{ value: \"from_solid\", label: \"From solid\" }, { value: \"existing_channel\", label: \"Existing channel\" }, { value: \"finish_pass_only\", label: \"Finish pass only\" }], { type: \"chips\" }),\n      slot_quality_target: tokenQuestion(\"slot_quality_target\", \"Slot quality target\", [{ value: \"rough_slot\", label: \"Rough slot\" }, { value: \"semi_finish\", label: \"Semi-finish\" }, { value: \"finish_critical\", label: \"Finish-critical\" }, { value: \"keyway_fit\", label: \"Keyway / tight width\" }], { required: false, expertOnly: true }),\n      pocket_topology_class: tokenQuestion(\"pocket_topology_class\", \"Pocket topology\", [\n        { value: \"open_pocket\", label: \"Open pocket\" },\n        { value: \"semi_closed_pocket\", label: \"Semi-closed pocket\" },\n        { value: \"closed_pocket\", label: \"Closed pocket\" },\n        { value: \"closed_angles\", label: \"Closed angles / tight corners\" },\n      ], { type: \"chips\" }),\n      pocket_start_condition: tokenQuestion(\"pocket_start_condition\", \"Start condition\", [\n        { value: \"from_solid\", label: \"From solid\" },\n        { value: \"existing_opening\", label: \"Existing opening\" },\n        { value: \"pre_machined\", label: \"Pre-machined area\" },\n      ], { type: \"chips\" }),\n      pocket_finish_strategy: tokenQuestion(\"pocket_finish_strategy\", \"Pocket process target\", [\n        { value: \"roughing_only\", label: \"Roughing only\" },\n        { value: \"rough_plus_finish\", label: \"Rough + finish\" },\n        { value: \"final_geometry_critical\", label: \"Final wall / floor critical\" },\n      ], { type: \"chips\" }),\n      pocket_stability_class: tokenQuestion(\"pocket_stability_class\", \"Pocket stability / wall sensitivity\", [\n        { value: \"stable\", label: \"Stable\" },\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"deep_cavity\", label: \"Deep cavity\" },\n        { value: \"thin_wall\", label: \"Thin wall\" },\n        { value: \"chatter_sensitive\", label: \"Chatter-sensitive\" },\n      ], { type: \"chips\" }),\n      pocket_tool_concept_preference: tokenQuestion(\"pocket_tool_concept_preference\", \"Tool concept\", [\n        { value: \"either\", label: \"Either\" },\n        { value: \"solid_or_exchangeable\", label: \"Solid / exchangeable\" },\n        { value: \"solid_carbide_only\", label: \"Solid carbide only\" },\n        { value: \"exchangeable_head_only\", label: \"Exchangeable head only\" },\n        { value: \"indexable_only\", label: \"Indexable only\" },\n      ], { required: false, expertOnly: true }),\n      pocket_opening_method: tokenQuestion(\"pocket_opening_method\", \"Allowed opening method\", [\n        { value: \"any\", label: \"Any\" },\n        { value: \"drilling\", label: \"Drilling\" },\n        { value: \"linear_ramping\", label: \"Linear ramping\" },\n        { value: \"circular_ramping\", label: \"Circular ramping\" },\n        { value: \"plunge\", label: \"Plunge\" },\n      ], { required: false, expertOnly: true }),\n      trochoidal_feature_type: tokenQuestion(\"trochoidal_feature_type\", \"Trochoidal feature type\", [\n        { value: \"slot_groove\", label: \"Slot / groove\" },\n        { value: \"pocket\", label: \"Pocket\" },\n        { value: \"confined_cavity\", label: \"Confined cavity\" },\n        { value: \"inner_contour\", label: \"Tight inner contour\" },\n      ]),\n      trochoidal_start_condition: tokenQuestion(\"trochoidal_start_condition\", \"Start condition\", [\n        { value: \"from_solid\", label: \"From solid\" },\n        { value: \"existing_opening\", label: \"Existing opening\" },\n        { value: \"start_hole\", label: \"Start hole\" },\n        { value: \"pre_machined\", label: \"Pre-machined area\" },\n      ], { type: \"chips\" }),\n      trochoidal_dynamic_capability: tokenQuestion(\"trochoidal_dynamic_capability\", \"Trochoidal CAM / control capability\", [\n        { value: \"confirmed\", label: \"Yes\" },\n        { value: \"likely\", label: \"Probably\" },\n        { value: \"absent\", label: \"No\" },\n        { value: \"unknown\", label: \"Unsure\" },\n      ], { type: \"chips\" }),\n      trochoidal_stability_class: tokenQuestion(\"trochoidal_stability_class\", \"Stability / wall sensitivity\", [\n        { value: \"stable\", label: \"Stable\" },\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"thin_wall\", label: \"Thin-wall / flexible\" },\n        { value: \"chatter_sensitive\", label: \"Reach / chatter critical\" },\n      ], { type: \"chips\" }),\n      trochoidal_finish_strategy: tokenQuestion(\"trochoidal_finish_strategy\", \"Process target\", [\n        { value: \"roughing_only\", label: \"Roughing only\" },\n        { value: \"rough_plus_finish\", label: \"Rough + finish\" },\n        { value: \"final_geometry_critical\", label: \"Final wall critical\" },\n      ], { type: \"chips\" }),\n      trochoidal_coolant_support: tokenQuestion(\"trochoidal_coolant_support\", \"Coolant / chip evacuation support\", [\n        { value: \"internal\", label: \"Internal coolant\" },\n        { value: \"external\", label: \"External coolant\" },\n        { value: \"air\", label: \"Air blast\" },\n        { value: \"dry\", label: \"Dry\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ]),\n      trochoidal_tool_concept_preference: tokenQuestion(\"trochoidal_tool_concept_preference\", \"Tool concept\", [\n        { value: \"either\", label: \"Either\" },\n        { value: \"solid_or_exchangeable\", label: \"Solid / exchangeable\" },\n        { value: \"solid_carbide_only\", label: \"Solid carbide only\" },\n        { value: \"exchangeable_head_only\", label: \"Exchangeable head only\" },\n        { value: \"indexable_only\", label: \"Indexable only\" },\n      ], { required: false, expertOnly: true }),\n      trochoidal_opening_method: tokenQuestion(\"trochoidal_opening_method\", \"Allowed opening method\", [\n        { value: \"any\", label: \"Any\" },\n        { value: \"start_hole_plus_ramp\", label: \"Start hole + ramp\" },\n        { value: \"linear_ramp\", label: \"Linear ramp\" },\n        { value: \"circular_ramp\", label: \"Circular ramp\" },\n        { value: \"plunge\", label: \"Plunge\" },\n      ], { required: false, expertOnly: true }),\n      trochoidal_machine_torque_class: tokenQuestion(\"trochoidal_machine_torque_class\", \"Machine power / torque\", [\n        { value: \"high\", label: \"No issue\" },\n        { value: \"medium\", label: \"Some limit\" },\n        { value: \"low\", label: \"Clearly limited\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true }),\n      helical_start_condition: tokenQuestion(\"helical_start_condition\", \"Start condition\", [\n        { value: \"from_solid\", label: \"From solid\" },\n        { value: \"existing_hole\", label: \"Existing hole\" },\n        { value: \"existing_opening\", label: \"Existing opening\" },\n      ], { type: \"chips\" }),\n      helical_finish_strategy: tokenQuestion(\"helical_finish_strategy\", \"Process target\", [\n        { value: \"opening_only\", label: \"Opening / roughing only\" },\n        { value: \"rough_plus_finish\", label: \"Rough + finish\" },\n        { value: \"final_geometry\", label: \"Final size / quality\" },\n      ], { type: \"chips\" }),\n      helical_capability_class: tokenQuestion(\"helical_capability_class\", \"Helical interpolation capability\", [\n        { value: \"confirmed\", label: \"Confirmed\" },\n        { value: \"likely\", label: \"Likely\" },\n        { value: \"absent\", label: \"Absent\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { type: \"chips\" }),\n      helical_coolant_support: tokenQuestion(\"helical_coolant_support\", \"Coolant / chip evacuation support\", [\n        { value: \"air\", label: \"Air blast\" },\n        { value: \"external\", label: \"External coolant\" },\n        { value: \"internal\", label: \"Internal coolant\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ]),\n      helical_tool_concept_preference: tokenQuestion(\"helical_tool_concept_preference\", \"Tool concept\", [\n        { value: \"either\", label: \"Either\" },\n        { value: \"solid_or_exchangeable\", label: \"Solid / exchangeable\" },\n        { value: \"solid_carbide_only\", label: \"Solid carbide only\" },\n        { value: \"exchangeable_head_only\", label: \"Exchangeable head only\" },\n        { value: \"indexable_only\", label: \"Indexable only\" },\n      ], { required: false, expertOnly: true }),\n      helical_tolerance_target: tokenQuestion(\"helical_tolerance_target\", \"Hole quality target\", [\n        { value: \"opening_only\", label: \"Opening only\" },\n        { value: \"general\", label: \"General quality\" },\n        { value: \"tight\", label: \"Tight size / finish\" },\n      ], { required: false, expertOnly: true }),\n      helical_machine_limit_class: tokenQuestion(\"helical_machine_limit_class\", \"Machine power / rigidity\", [\n        { value: \"high_power\", label: \"High power / rigid\" },\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"low_power\", label: \"Low power\" },\n        { value: \"low_rigidity\", label: \"Low rigidity\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true }),\n      high_feed_geometry_class: tokenQuestion(\"high_feed_geometry_class\", \"Primary geometry\", [\n        { value: \"face_milling\", label: \"Face milling\" },\n        { value: \"open_contour\", label: \"Open contour / freeform\" },\n        { value: \"pocket_roughing\", label: \"Pocket roughing\" },\n        { value: \"corner_semi_finish\", label: \"Corner semi-finish\" },\n        { value: \"plunge_related_roughing\", label: \"Plunge-related roughing\" },\n      ]),\n      high_feed_shoulder_proximity: tokenQuestion(\"high_feed_shoulder_proximity\", \"90-degree wall proximity\", [\n        { value: \"clear_of_90\", label: \"Clear of 90-degree wall\" },\n        { value: \"near_wall\", label: \"Near wall\" },\n        { value: \"direct_true_90\", label: \"Direct true-90 shoulder\" },\n      ], { type: \"chips\" }),\n      high_feed_stability_class: tokenQuestion(\"high_feed_stability_class\", \"Stability / overhang\", [\n        { value: \"stable\", label: \"Stable\" },\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"long_overhang\", label: \"Long overhang\" },\n        { value: \"poor_stability\", label: \"Poor stability\" },\n      ], { type: \"chips\" }),\n      high_feed_finish_strategy: tokenQuestion(\"high_feed_finish_strategy\", \"Process target\", [\n        { value: \"roughing_only\", label: \"Roughing only\" },\n        { value: \"rough_plus_semi_finish\", label: \"Rough + semi-finish\" },\n        { value: \"finish_critical\", label: \"Finish-critical wall\" },\n      ], { type: \"chips\" }),\n      high_feed_access_class: tokenQuestion(\"high_feed_access_class\", \"Access / openness\", [\n        { value: \"open_access\", label: \"Open access\" },\n        { value: \"moderately_confined\", label: \"Moderately confined\" },\n        { value: \"reach_critical\", label: \"Reach-critical / deep\" },\n      ], { type: \"chips\" }),\n      high_feed_tool_concept_preference: tokenQuestion(\"high_feed_tool_concept_preference\", \"Tool concept\", [\n        { value: \"either\", label: \"Either\" },\n        { value: \"indexable_only\", label: \"Indexable only\" },\n        { value: \"solid_or_exchangeable\", label: \"Solid / exchangeable\" },\n        { value: \"solid_carbide_only\", label: \"Solid carbide only\" },\n        { value: \"exchangeable_head_only\", label: \"Exchangeable head only\" },\n      ], { required: false, expertOnly: true }),\n      high_feed_cam_side_milling_capability: tokenQuestion(\"high_feed_cam_side_milling_capability\", \"CAM-supported high-feed side milling\", [\n        { value: \"confirmed\", label: \"Confirmed\" },\n        { value: \"likely\", label: \"Likely\" },\n        { value: \"absent\", label: \"Absent\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true, type: \"chips\" }),\n      high_feed_axial_force_sensitivity: tokenQuestion(\"high_feed_axial_force_sensitivity\", \"Axial-force sensitivity\", [\n        { value: \"low\", label: \"Low\" },\n        { value: \"medium\", label: \"Medium\" },\n        { value: \"high\", label: \"High\" },\n      ], { required: false, expertOnly: true, type: \"chips\" }),\n      plunging_feature_type: tokenQuestion(\"plunging_feature_type\", \"Plunging feature type\", [\n        { value: \"deep_cavity\", label: \"Deep cavity / pocket\" },\n        { value: \"corner_rest_material\", label: \"Corner rest material\" },\n        { value: \"inner_contour\", label: \"Inner contour\" },\n        { value: \"axial_opening\", label: \"Axial opening / roughing\" },\n      ]),\n      plunging_starting_hole_status: tokenQuestion(\"plunging_starting_hole_status\", \"Starting hole / opening\", [\n        { value: \"yes\", label: \"Existing hole / opening\" },\n        { value: \"no\", label: \"No\" },\n        { value: \"unsure\", label: \"Unsure\" },\n      ], { type: \"chips\" }),\n      plunging_stability_class: tokenQuestion(\"plunging_stability_class\", \"Stability / machine limit\", [\n        { value: \"stable\", label: \"Stable\" },\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"long_overhang\", label: \"Long overhang\" },\n        { value: \"poor_stability\", label: \"Poor stability\" },\n        { value: \"low_power\", label: \"Low power / torque\" },\n      ], { type: \"chips\" }),\n      plunging_finish_strategy: tokenQuestion(\"plunging_finish_strategy\", \"Process target\", [\n        { value: \"roughing_only\", label: \"Roughing only\" },\n        { value: \"rough_plus_finish\", label: \"Rough + finish\" },\n        { value: \"final_contour_critical\", label: \"Final contour critical\" },\n      ], { type: \"chips\" }),\n      plunging_coolant_support: tokenQuestion(\"plunging_coolant_support\", \"Coolant / chip evacuation support\", [\n        { value: \"internal\", label: \"Internal coolant\" },\n        { value: \"external\", label: \"External coolant\" },\n        { value: \"air\", label: \"Air blast\" },\n        { value: \"dry\", label: \"Dry\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ]),\n      plunging_tool_concept_preference: tokenQuestion(\"plunging_tool_concept_preference\", \"Tool concept\", [\n        { value: \"either\", label: \"Either\" },\n        { value: \"solid_or_exchangeable\", label: \"Solid / exchangeable\" },\n        { value: \"solid_carbide_only\", label: \"Solid carbide only\" },\n        { value: \"plunge_cutter_only\", label: \"Dedicated plunge cutter only\" },\n        { value: \"indexable_only\", label: \"Indexable only\" },\n      ], { required: false, expertOnly: true }),\n      plunging_opening_method: tokenQuestion(\"plunging_opening_method\", \"Allowed opening method\", [\n        { value: \"any\", label: \"Any\" },\n        { value: \"drilling\", label: \"Drilling\" },\n        { value: \"existing_hole\", label: \"Existing hole\" },\n        { value: \"ramp_alternative\", label: \"Ramp alternative\" },\n        { value: \"plunge_only\", label: \"Plunge only\" },\n      ], { required: false, expertOnly: true }),\n      plunging_machine_limit_class: tokenQuestion(\"plunging_machine_limit_class\", \"Machine power / torque\", [\n        { value: \"high_power\", label: \"No issue\" },\n        { value: \"normal\", label: \"Normal\" },\n        { value: \"low_power\", label: \"Low power\" },\n        { value: \"low_torque\", label: \"Low torque\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true }),\n      plunging_bottom_contact_critical: tokenQuestion(\"plunging_bottom_contact_critical\", \"Bottom contact critical\", [\n        { value: \"no\", label: \"No\" },\n        { value: \"yes\", label: \"Yes\" },\n        { value: \"unknown\", label: \"Unknown\" },\n      ], { required: false, expertOnly: true }),\n      shoulder_access: tokenQuestion(\"shoulder_access\", \"Shoulder access\", [{ value: \"good\", label: \"Good\" }, { value: \"limited\", label: \"Limited\" }, { value: \"poor\", label: \"Poor\" }]),\n      shoulder_90_required: tokenQuestion(\"shoulder_90_required\", \"True 90 required\", [{ value: \"yes\", label: \"Yes\" }, { value: \"no\", label: \"No\" }], { type: \"chips\" }),\n      engagement_style: tokenQuestion(\"engagement_style\", \"Engagement style\", [{ value: \"light\", label: \"Light\" }, { value: \"balanced\", label: \"Balanced\" }, { value: \"heavy\", label: \"Heavy\" }]),\n      pocket_type: tokenQuestion(\"pocket_type\", \"Pocket type\", [{ value: \"closed\", label: \"Closed\" }, { value: \"open\", label: \"Open\" }, { value: \"semi_open\", label: \"Semi-open\" }]),\n      corner_radius_need: tokenQuestion(\"corner_radius_need\", \"Corner radius need\", [{ value: \"sharp\", label: \"Sharp\" }, { value: \"small_radius\", label: \"Small radius\" }, { value: \"large_radius\", label: \"Large radius\" }]),\n      tool_concept_preference: tokenQuestion(\"tool_concept_preference\", \"Tool concept\", [{ value: \"either\", label: \"Either\" }, { value: \"solid_carbide_only\", label: \"Solid carbide only\" }, { value: \"indexable_only\", label: \"Indexable only\" }, { value: \"unknown\", label: \"Unknown\" }], { required: false, expertOnly: true }),\n      hfm_intent: tokenQuestion(\"hfm_intent\", \"High-feed intent\", [{ value: \"yes\", label: \"Yes\" }, { value: \"no\", label: \"No\" }, { value: \"unknown\", label: \"Unknown\" }], { type: \"chips\" }),\n      hfm_application_type: tokenQuestion(\"hfm_application_type\", \"HFM application type\", [{ value: \"roughing\", label: \"Roughing\" }, { value: \"semi_finishing\", label: \"Semi-finishing\" }, { value: \"facing\", label: \"Facing\" }]),\n      surface_vs_fidelity_goal: tokenQuestion(\"surface_vs_fidelity_goal\", \"Surface vs fidelity\", [{ value: \"surface\", label: \"Surface quality\" }, { value: \"balanced\", label: \"Balanced\" }, { value: \"fidelity\", label: \"Geometric fidelity\" }], { type: \"chips\" }),\n      contour_fidelity: tokenQuestion(\"contour_fidelity\", \"Contour fidelity\", [{ value: \"general\", label: \"General\" }, { value: \"high\", label: \"High\" }]),\n      priority: tokenQuestion(\"priority\", \"Priority\", [{ value: \"safety\", label: \"Safety\" }, { value: \"balanced\", label: \"Balanced\" }, { value: \"productivity\", label: \"Productivity\" }], { required: false, type: \"chips\" }),\n      current_issue: textQuestion(\"current_issue\", \"Current issue\", { required: false }),\n      setup_stability: tokenQuestion(\"setup_stability\", \"Setup stability\", [{ value: \"strong\", label: \"Strong\" }, { value: \"medium\", label: \"Medium\" }, { value: \"weak\", label: \"Weak\" }], { required: false, type: \"chips\" }),\n    });\n    \n    function buildQuestionsFromIds(questionIds) {\n      return questionIds.map(function mapQuestionId(questionId) {\n        var question = QUESTION_LIBRARY[questionId];\n        if (!question) {\n          throw new Error(\"Question definition missing for \" + questionId);\n        }\n        return question;\n      });\n    }\n    \n    exports.buildQuestionsFromIds = buildQuestionsFromIds;\n    exports.QUESTION_LIBRARY = QUESTION_LIBRARY;\n  },\n  \"processes/_shared/stub-process.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { createQuestionDef, createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, explanation, featureSummary, fitKpis, geometryFit, heroRecommendation, holeSummary, machineFeasibility, recipeStartValues, riskNotes, setupNotes, threadIdentity, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildQuestionsFromIds, QUESTION_LIBRARY } = __bundle.require(\"processes/_shared/question-library.js\");\n    var { getProcessSpec } = __bundle.require(\"processes/_shared/process-specs.js\");\n    var { parseThreadDesignation } = __bundle.require(\"family-toolkits/threading-tools.js\");\n    var PROCESS_QUESTION_OVERRIDES = Object.create(null);\n    \n    var LITE_REQUIRED_QUESTION_IDS_BY_PROCESS = Object.freeze({\n      drilling_through: Object.freeze([\"feature_diameter_mm\", \"feature_depth_mm\"]),\n      drilling_blind: Object.freeze([\"feature_diameter_mm\", \"feature_depth_mm\", \"blind_bottom_type\"]),\n      deep_hole_drilling: Object.freeze([\"feature_diameter_mm\", \"feature_depth_mm\", \"through_coolant\"]),\n      reaming: Object.freeze([\"feature_diameter_mm\", \"pre_hole_diameter\", \"pre_hole_status\"]),\n      countersinking: Object.freeze([\"countersink_angle\", \"pre_hole_diameter\", \"target_top_dia_or_depth\"]),\n      chamfering: Object.freeze([\"feature_diameter_mm\", \"entry_condition\", \"workpiece_condition\"]),\n      tapping_blind: Object.freeze([\"thread_standard_choice\", \"thread_nominal_size\", \"thread_length_mm\", \"bottom_clearance_class\", \"sync_tapping_capability\", \"core_hole_status\"]),\n      tapping_through: Object.freeze([\"thread_standard_choice\", \"thread_nominal_size\", \"thread_length_mm\", \"sync_tapping_capability\", \"exit_condition\", \"core_hole_status\"]),\n      forming_blind: Object.freeze([\"thread_standard_choice\", \"thread_nominal_size\", \"material_formability_class\", \"thread_length_mm\", \"bottom_reserve_class\", \"sync_tapping_capability\", \"core_hole_status\"]),\n      forming_through: Object.freeze([\"thread_standard_choice\", \"thread_nominal_size\", \"material_formability_class\", \"thread_length_mm\", \"sync_tapping_capability\", \"core_hole_status\", \"entry_exit_sensitivity\"]),\n      thread_milling: Object.freeze([\"thread_designation\", \"thread_depth_mm\", \"blind_through\", \"core_hole_status\", \"interpolation_capability\", \"cam_capability\"]),\n      profile_turning: Object.freeze([\"profile_mode\", \"workpiece_diameter_mm\", \"ap_mm\", \"min_profile_radius_mm\"]),\n      boring: Object.freeze([\"bore_type\", \"bore_diameter_mm\", \"bore_length_mm\"]),\n      grooving: Object.freeze([\"groove_operation_type\", \"internal_external\", \"feature_width_mm\", \"groove_depth_mm\"]),\n      diameter_turning: Object.freeze([\"turn_mode\", \"workpiece_diameter_mm\", \"ap_mm\"]),\n      face_turning: Object.freeze([\"workpiece_diameter_mm\", \"ap_mm\", \"face_rigidity_class\"]),\n      slotting: Object.freeze([\"feature_width_mm\", \"feature_depth_mm\", \"slot_type\", \"slot_start_state\", \"corner_radius_need\"]),\n      shoulder_milling: Object.freeze([\"wall_height_mm\", \"feature_width_mm\", \"shoulder_90_required\", \"corner_radius_need\", \"shoulder_access\"]),\n      face_milling: Object.freeze([\"face_size_l_mm\", \"face_size_w_mm\", \"stock_removal_mm\"]),\n      pocket_milling: Object.freeze([\"pocket_topology_class\", \"pocket_min_opening_mm\", \"pocket_d_mm\", \"max_corner_radius_mm\"]),\n      trochoidal_milling: Object.freeze([\"trochoidal_feature_type\", \"feature_width_mm\", \"feature_depth_mm\", \"trochoidal_dynamic_capability\"]),\n      ramping_helical_interpolation: Object.freeze([\"feature_diameter_mm\", \"feature_depth_mm\", \"helical_capability_class\"]),\n      high_feed_milling: Object.freeze([\"high_feed_geometry_class\", \"high_feed_ap_mm\"]),\n      copy_milling: Object.freeze([\"copy_surface_character\", \"copy_min_detail_mm\", \"feature_depth_mm\"]),\n      plunging: Object.freeze([\"plunging_feature_type\", \"feature_width_mm\", \"feature_depth_mm\", \"plunging_starting_hole_status\"]),\n    });\n    \n    var LITE_CONDITIONAL_REQUIRED_QUESTION_IDS_BY_PROCESS = Object.freeze({\n      tapping_blind: Object.freeze([\"actual_predrill_diameter_mm\"]),\n      tapping_through: Object.freeze([\"actual_predrill_diameter_mm\"]),\n      forming_blind: Object.freeze([\"actual_predrill_diameter_mm\"]),\n      forming_through: Object.freeze([\"actual_predrill_diameter_mm\"]),\n      slotting: Object.freeze([\"max_corner_radius_mm\"]),\n      shoulder_milling: Object.freeze([\"max_corner_radius_mm\"]),\n    });\n    \n    function uniqueStrings(values) {\n      var seen = Object.create(null);\n      return (values || []).reduce(function collect(output, value) {\n        var key = String(value || \"\");\n        if (!key || seen[key]) return output;\n        seen[key] = true;\n        output.push(key);\n        return output;\n      }, []);\n    }\n    \n    function toLookup(values) {\n      return uniqueStrings(values).reduce(function assign(lookup, value) {\n        lookup[value] = true;\n        return lookup;\n      }, Object.create(null));\n    }\n    \n    function getLiteQuestionMinimumIds(processId) {\n      var requiredIds = LITE_REQUIRED_QUESTION_IDS_BY_PROCESS[processId];\n      var conditionalIds = LITE_CONDITIONAL_REQUIRED_QUESTION_IDS_BY_PROCESS[processId] || [];\n      if (!Array.isArray(requiredIds)) return [];\n      return uniqueStrings([].concat(requiredIds, conditionalIds));\n    }\n    \n    function applyLiteQuestionMinimum(processId, questions) {\n      return (questions || []).slice();\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function hasValue(value) {\n      return value != null && value !== \"\" && (!Array.isArray(value) || value.length > 0);\n    }\n    \n    function getAnswer(ctx, key) {\n      if (ctx && ctx.answers && Object.prototype.hasOwnProperty.call(ctx.answers, key)) {\n        return ctx.answers[key];\n      }\n      if (ctx && ctx.derived && Object.prototype.hasOwnProperty.call(ctx.derived, key)) {\n        return ctx.derived[key];\n      }\n      return null;\n    }\n    \n    function getPrimaryToolkit(spec, toolkits) {\n      return toolkits && toolkits[spec.toolkits[0]];\n    }\n    \n    function getTargetDiameter(ctx) {\n      return toNullableNumber(\n        getAnswer(ctx, \"feature_diameter_mm\") ||\n        getAnswer(ctx, \"bore_diameter_mm\") ||\n        getAnswer(ctx, \"pre_hole_diameter\") ||\n        getAnswer(ctx, \"core_hole_dia\")\n      );\n    }\n    \n    function getTargetDepth(ctx) {\n      return toNullableNumber(\n        getAnswer(ctx, \"feature_depth_mm\") ||\n        getAnswer(ctx, \"thread_depth_mm\") ||\n        getAnswer(ctx, \"thread_length_mm\") ||\n        getAnswer(ctx, \"bore_depth_mm\") ||\n        getAnswer(ctx, \"pocket_d_mm\")\n      );\n    }\n    \n    function buildRequiredIssues(processId, ctx) {\n      return buildProcessQuestions(processId).reduce(function collect(issues, question) {\n        var visible = question.visibleWhen ? Boolean(question.visibleWhen(ctx)) : true;\n        if (!visible || question.type === \"display\" || !question.required) {\n          return issues;\n        }\n        if (!hasValue(getAnswer(ctx, question.id))) {\n          issues.push({\n            field: question.id,\n            message: question.label + \" is required.\",\n            severity: \"error\",\n            code: \"required\",\n          });\n        }\n        return issues;\n      }, []);\n    }\n    \n    function getReasonList(parts, recipeSource) {\n      var reasons = [];\n      if ((parts.process || 0) > 0.5) reasons.push(\"Process classification matches.\");\n      if ((parts.material || 0) > 0.5) reasons.push(\"Material match is available.\");\n      if ((parts.diameter || 0) > 0.5) reasons.push(\"Geometry fits the requested size.\");\n      if ((parts.reach || 0) > 0.5) reasons.push(\"Reach covers the requested depth.\");\n      if (recipeSource && recipeSource !== \"none\") reasons.push(\"Recipe data is available.\");\n      return reasons.slice(0, 5);\n    }\n    \n    function buildFeatureItems(processId, ctx, top) {\n      var spec = getProcessSpec(processId);\n      var items = [];\n      if (spec.family === \"drilling\") {\n        return items;\n      }\n      if (hasValue(getAnswer(ctx, \"feature_width_mm\"))) {\n        items.push({ key: \"feature_width_mm\", label: \"Width\", value: String(getAnswer(ctx, \"feature_width_mm\")) + \" mm\" });\n      }\n      if (hasValue(getAnswer(ctx, \"feature_depth_mm\"))) {\n        items.push({ key: \"feature_depth_mm\", label: \"Depth\", value: String(getAnswer(ctx, \"feature_depth_mm\")) + \" mm\" });\n      }\n      if (hasValue(getAnswer(ctx, \"bore_diameter_mm\"))) {\n        items.push({ key: \"bore_diameter_mm\", label: \"Bore diameter\", value: String(getAnswer(ctx, \"bore_diameter_mm\")) + \" mm\" });\n      }\n      if (hasValue(getAnswer(ctx, \"bore_depth_mm\"))) {\n        items.push({ key: \"bore_depth_mm\", label: \"Bore depth\", value: String(getAnswer(ctx, \"bore_depth_mm\")) + \" mm\" });\n      }\n      if (hasValue(getAnswer(ctx, \"goal_stage\"))) {\n        items.push({ key: \"goal_stage\", label: \"Goal stage\", value: String(getAnswer(ctx, \"goal_stage\")) });\n      }\n      if (items.length === 0 && top && top.candidate.common.diameterMm != null) {\n        items.push({ key: \"tool_diameter\", label: \"Tool diameter\", value: String(top.candidate.common.diameterMm) + \" mm\" });\n      }\n      return items;\n    }\n    \n    function buildGeometryItems(ctx, top) {\n      var items = [];\n      if (hasValue(getAnswer(ctx, \"feature_diameter_mm\")) && top && top.candidate.common.diameterMm != null) {\n        items.push({\n          key: \"diameter\",\n          label: \"Diameter\",\n          actual: String(top.candidate.common.diameterMm) + \" mm\",\n          target: String(getAnswer(ctx, \"feature_diameter_mm\")) + \" mm\",\n          result: Math.abs(top.candidate.common.diameterMm - Number(getAnswer(ctx, \"feature_diameter_mm\"))) <= 0.01 ? \"fit\" : \"near\",\n        });\n      }\n      if (hasValue(getAnswer(ctx, \"feature_width_mm\")) && top && top.candidate.common.diameterMm != null) {\n        items.push({\n          key: \"width_vs_diameter\",\n          label: \"Width / tool diameter\",\n          actual: String(top.candidate.common.diameterMm) + \" mm\",\n          target: String(getAnswer(ctx, \"feature_width_mm\")) + \" mm\",\n          result: top.candidate.common.diameterMm <= Number(getAnswer(ctx, \"feature_width_mm\")) ? \"fit\" : \"mismatch\",\n        });\n      }\n      if (hasValue(getAnswer(ctx, \"bore_diameter_mm\")) && top && top.candidate.common.diameterMm != null) {\n        items.push({\n          key: \"bore_access\",\n          label: \"Bore access\",\n          actual: String(top.candidate.common.diameterMm) + \" mm\",\n          target: String(getAnswer(ctx, \"bore_diameter_mm\")) + \" mm\",\n          result: top.candidate.common.diameterMm <= Number(getAnswer(ctx, \"bore_diameter_mm\")) ? \"fit\" : \"mismatch\",\n        });\n      }\n      return items;\n    }\n    \n    function buildMachineChecks(ctx, top) {\n      var checks = [];\n      if (hasValue(getAnswer(ctx, \"coolant_capability\"))) {\n        checks.push({\n          key: \"coolant\",\n          label: \"Coolant\",\n          result: top && top.candidate.common.coolantTsc && getAnswer(ctx, \"coolant_capability\") === \"through\" ? \"pass\" : \"unknown\",\n          note: top && top.candidate.common.coolantTsc ? \"Tool supports through coolant.\" : null,\n        });\n      }\n      if (hasValue(getAnswer(ctx, \"sync_tapping_capability\"))) {\n        checks.push({\n          key: \"sync\",\n          label: \"Sync tapping\",\n          result: getAnswer(ctx, \"sync_tapping_capability\") === \"yes\" ? \"pass\" : \"fail\",\n          note: getAnswer(ctx, \"sync_tapping_capability\") === \"yes\" ? null : \"Synchronous tapping is required.\",\n        });\n      }\n      if (hasValue(getAnswer(ctx, \"machine_torque_capability\"))) {\n        checks.push({\n          key: \"torque\",\n          label: \"Machine torque\",\n          result: getAnswer(ctx, \"machine_torque_capability\") === \"low\" ? \"limited\" : \"pass\",\n          note: null,\n        });\n      }\n      if (hasValue(getAnswer(ctx, \"cam_capability\"))) {\n        checks.push({\n          key: \"cam\",\n          label: \"CAM capability\",\n          result: getAnswer(ctx, \"cam_capability\") === \"none\" ? \"fail\" : \"pass\",\n          note: null,\n        });\n      }\n      return checks;\n    }\n    \n    function buildSetupItems(ctx) {\n      var items = [];\n      if (hasValue(getAnswer(ctx, \"setup_stability\"))) {\n        items.push({ area: \"stability\", message: \"Setup stability: \" + getAnswer(ctx, \"setup_stability\") });\n      }\n      if (hasValue(getAnswer(ctx, \"chip_evac_condition\"))) {\n        items.push({ area: \"evacuation\", message: \"Chip evacuation: \" + getAnswer(ctx, \"chip_evac_condition\") });\n      }\n      if (hasValue(getAnswer(ctx, \"overhang_condition\"))) {\n        items.push({ area: \"access\", message: \"Overhang condition: \" + getAnswer(ctx, \"overhang_condition\") });\n      }\n      return items;\n    }\n    \n    function buildRiskItems(processId, ctx, top) {\n      var items = [];\n      if (top && top.score.parts && top.score.parts.riskPenalty > 0.25) {\n        items.push({ severity: \"warning\", title: \"Risk\", message: \"Setup or coolant risk reduces the confidence of this match.\" });\n      }\n      if (processId === \"slotting\" && hasValue(getAnswer(ctx, \"feature_width_mm\")) && top && top.candidate.common.diameterMm > Number(getAnswer(ctx, \"feature_width_mm\"))) {\n        items.push({ severity: \"critical\", title: \"Width mismatch\", message: \"Tool diameter exceeds slot width.\" });\n      }\n      if (processId === \"tapping_blind\" && getAnswer(ctx, \"sync_tapping_capability\") !== \"yes\") {\n        items.push({ severity: \"critical\", title: \"Sync missing\", message: \"Blind-hole tapping requires synchronous tapping capability.\" });\n      }\n      return items;\n    }\n    \n    function buildFitItems(top) {\n      var parts = top.score.parts || {};\n      return [\n        { key: \"score\", label: \"Fit score\", value: top.score.total.toFixed(2), status: top.score.total >= 2.5 ? \"good\" : \"ok\" },\n        { key: \"process\", label: \"Process fit\", value: (parts.process || 0).toFixed(2), status: (parts.process || 0) >= 0.75 ? \"good\" : \"ok\" },\n        { key: \"material\", label: \"Material fit\", value: (parts.material || 0).toFixed(2), status: (parts.material || 0) >= 0.75 ? \"good\" : \"ok\" },\n        { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.75 ? \"good\" : \"ok\" },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      return recipeStartValues({\n        source: top.score.recipeConfidence || \"none\",\n        values: [\n          { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: top.recipe && top.recipe.fz.min, typ: top.recipe && top.recipe.fz.typ, max: top.recipe && top.recipe.fz.max, unit: \"mm\" },\n          { key: \"fn\", label: \"fn\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n          { key: \"ap\", label: \"ap\", min: top.recipe && top.recipe.ap.min, typ: top.recipe && top.recipe.ap.typ, max: top.recipe && top.recipe.ap.max, unit: \"mm\" },\n          { key: \"ae\", label: \"ae\", min: top.recipe && top.recipe.ae.min, typ: top.recipe && top.recipe.ae.typ, max: top.recipe && top.recipe.ae.max, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: top.recipe && top.recipe.aePct.min, typ: top.recipe && top.recipe.aePct.typ, max: top.recipe && top.recipe.aePct.max, unit: \"%\" },\n        ].filter(function hasRecipeValue(item) {\n          return item.min != null || item.typ != null || item.max != null;\n        }),\n      });\n    }\n    \n    function createHero(top) {\n      return heroRecommendation({\n        variantId: top.candidate.ids.variantId,\n        productTitle: top.candidate.catalog.productTitle,\n        variantTitle: top.candidate.catalog.variantTitle,\n        sku: top.candidate.ids.sku,\n        imageUrl: top.candidate.catalog.imageUrl,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 5),\n      });\n    }\n    \n    function addBlockIfAllowed(blocks, allowedBlockTypes, blockType, builder) {\n      var block;\n      if (allowedBlockTypes.indexOf(blockType) < 0) return;\n      block = builder();\n      if (!block) return;\n      if (Array.isArray(block.data && block.data.items) && block.data.items.length === 0) return;\n      if (Array.isArray(block.data && block.data.checks) && block.data.checks.length === 0) return;\n      if (Array.isArray(block.data && block.data.notes) && block.data.notes.length === 0) return;\n      if (Array.isArray(block.data && block.data.values) && block.data.values.length === 0) return;\n      blocks.push(block);\n    }\n    \n    function toOutcome(top) {\n      return top.score.total >= 2.5 ? \"match\" : \"limited_match\";\n    }\n    \n    function buildProcessQuestions(processId) {\n      var overrideQuestions = PROCESS_QUESTION_OVERRIDES[processId];\n      var questions;\n      if (Array.isArray(overrideQuestions) && overrideQuestions.length > 0) {\n        return applyLiteQuestionMinimum(processId, overrideQuestions);\n      }\n      var spec = getProcessSpec(processId);\n      questions = buildQuestionsFromIds(spec.questionIds);\n      return applyLiteQuestionMinimum(processId, questions);\n    }\n    \n    function deriveByProcessSpec(processId, ctx, toolkits) {\n      var spec = getProcessSpec(processId);\n      var primaryToolkit = getPrimaryToolkit(spec, toolkits) || { deriveFamilyValues: function empty() { return {}; } };\n      var derived = Object.assign({}, primaryToolkit.deriveFamilyValues(ctx) || {});\n      var featureDiameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var featureDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var featureWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var boreDiameter = toNullableNumber(getAnswer(ctx, \"bore_diameter_mm\"));\n      var boreDepth = toNullableNumber(getAnswer(ctx, \"bore_depth_mm\"));\n      var exactOverhang = toNullableNumber(getAnswer(ctx, \"exact_overhang_mm\"));\n      var threadInfo = parseThreadDesignation(getAnswer(ctx, \"thread_designation\"));\n    \n      if (threadInfo) {\n        derived.thread_standard = threadInfo.threadStandard;\n        derived.thread_size = threadInfo.threadSize;\n        derived.pitch = threadInfo.pitch;\n        derived.pipe_flag = threadInfo.pipeFlag;\n      }\n      if (featureDiameter != null && featureDepth != null && featureDiameter > 0) {\n        derived.hole_depth_ratio = featureDepth / featureDiameter;\n        derived.reach_ratio = featureDepth / featureDiameter;\n      }\n      if (featureDepth != null && featureWidth != null && featureWidth > 0) {\n        derived.slot_depth_ratio = featureDepth / featureWidth;\n      }\n      if (featureWidth != null && featureDiameter != null && featureWidth > 0) {\n        derived.tool_dia_vs_slot = featureDiameter / featureWidth;\n        derived.ae_pct = Math.round((featureDiameter / featureWidth) * 100);\n      }\n      if (boreDiameter != null && boreDepth != null && boreDiameter > 0) {\n        derived.bore_slenderness = boreDepth / boreDiameter;\n      }\n      if (exactOverhang != null && boreDiameter != null && boreDiameter > 0) {\n        derived.overhang_ratio = exactOverhang / boreDiameter;\n      }\n      if (getAnswer(ctx, \"through_coolant\") === \"yes\") {\n        derived.coolant_mode = \"through\";\n      } else if (getAnswer(ctx, \"coolant_capability\")) {\n        derived.coolant_mode = getAnswer(ctx, \"coolant_capability\");\n      }\n      return derived;\n    }\n    \n    function validateByProcessSpec(processId, ctx) {\n      var spec = getProcessSpec(processId);\n      var issues = buildRequiredIssues(processId, ctx);\n      if (spec.family === \"threading\" && hasValue(getAnswer(ctx, \"thread_designation\")) && !parseThreadDesignation(getAnswer(ctx, \"thread_designation\"))) {\n        issues.push({\n          field: \"thread_designation\",\n          message: \"Thread designation could not be parsed into the canonical threading identity.\",\n          severity: \"error\",\n          code: \"thread_designation_invalid\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilterByProcessSpec(processId, pool) {\n      var spec = getProcessSpec(processId);\n      return (pool || []).filter(function matchesProcess(candidate) {\n        return candidate.classification.processIds.indexOf(processId) >= 0 ||\n          candidate.classification.domainFamilies.indexOf(spec.family) >= 0;\n      });\n    }\n    \n    function scoreByProcessSpec(processId, pool, ctx, kernel, toolkits) {\n      var spec = getProcessSpec(processId);\n      var primaryToolkit = getPrimaryToolkit(spec, toolkits);\n      var targetDiameter = getTargetDiameter(ctx);\n      var targetDepth = getTargetDepth(ctx);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var hardFilterIssues = [];\n        var errorIssue;\n        var parts;\n        var recipeResult;\n        var recipeRow;\n        var total;\n        var confidenceMap;\n        var confidence;\n        var metrics;\n    \n        if (primaryToolkit && typeof primaryToolkit.familyHardFilters === \"function\") {\n          hardFilterIssues = primaryToolkit.familyHardFilters(candidate, ctx) || [];\n        }\n        if (spec.family !== \"threading\" && candidate.stage === \"detail\" && candidate.rows[spec.family].length === 0) {\n          hardFilterIssues.push({\n            field: \"rows\",\n            message: \"No family rows available for this process.\",\n            severity: \"error\",\n          });\n        }\n        errorIssue = hardFilterIssues.find(function findError(issue) {\n          return issue.severity === \"error\";\n        });\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          machine: kernel.machineWindow(candidate, ctx),\n        };\n        if (targetDiameter != null) {\n          parts.diameter = kernel.diameterFit(candidate, targetDiameter);\n        }\n        if (targetDepth != null) {\n          parts.reach = kernel.reachFit(candidate, targetDepth);\n        }\n        if (primaryToolkit && typeof primaryToolkit.familyScoreParts === \"function\") {\n          Object.assign(parts, primaryToolkit.familyScoreParts(candidate, ctx) || {});\n        }\n        parts.riskPenalty = -(kernel.risk(candidate, ctx) || 0);\n    \n        recipeResult = primaryToolkit && typeof primaryToolkit.resolveRecipe === \"function\"\n          ? primaryToolkit.resolveRecipe(candidate, ctx)\n          : { source: \"none\", recipe: null };\n        recipeRow = recipeResult && recipeResult.row ? recipeResult.row : null;\n        total = sumParts(parts);\n        confidenceMap = { exact: 0.95, near: 0.8, estimated: 0.65, none: 0.45 };\n        confidence = confidenceMap[recipeResult.source] || 0.45;\n        if (errorIssue) {\n          total = 0;\n          confidence = 0;\n        }\n    \n        metrics = primaryToolkit && typeof primaryToolkit.getSharedMetrics === \"function\"\n          ? primaryToolkit.getSharedMetrics(candidate, ctx)\n          : {};\n        metrics.targetDiameter = targetDiameter;\n        metrics.targetDepth = targetDepth;\n        if (recipeResult && recipeResult.debug) {\n          Object.assign(metrics, recipeResult.debug);\n        }\n        if (recipeRow && recipeRow.constraints) {\n          metrics.rowConditionStage = recipeRow.constraints.conditionStage || null;\n          metrics.rowCoolantMode = recipeRow.constraints.coolantMode || null;\n        }\n        if (recipeRow && recipeRow.familyData) {\n          metrics.rowRecipeKind = recipeRow.familyData.recipeRowKind || null;\n        }\n    \n        return createScoredCandidate(candidate, {\n          eligible: !errorIssue && total > 0,\n          hardRejectReason: errorIssue ? errorIssue.message : null,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: getReasonList(parts, recipeResult.source),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    function buildResultViewBySpec(processId, scored, ctx) {\n      var spec = getProcessSpec(processId);\n      var allowedBlockTypes = []\n        .concat(spec.resultBlocks.required || [])\n        .concat(spec.resultBlocks.conditional || [])\n        .concat(spec.resultBlocks.optional || []);\n      var top = scored[0];\n      var blocks = [createHero(top)];\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"thread_identity\", function buildThread() {\n        return threadIdentity({\n          standard: toNullableString(getAnswer(ctx, \"thread_standard\")),\n          size: toNullableString(getAnswer(ctx, \"thread_size\")),\n          pitch: toNullableString(getAnswer(ctx, \"pitch\")),\n          tolerance: toNullableString(getAnswer(ctx, \"thread_tolerance\")),\n          blindThrough: toNullableString(getAnswer(ctx, \"blind_through\")),\n        });\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"hole_summary\", function buildHole() {\n        return holeSummary({\n          diameterMm: getTargetDiameter(ctx),\n          depthMm: getTargetDepth(ctx),\n          depthRatio: toNullableNumber(getAnswer(ctx, \"hole_depth_ratio\")),\n          entryCondition: toNullableString(getAnswer(ctx, \"entry_condition\")),\n          exitCondition: toNullableString(getAnswer(ctx, \"exit_condition\")),\n          blindThrough: toNullableString(getAnswer(ctx, \"blind_through\")),\n        });\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"feature_summary\", function buildFeature() {\n        return featureSummary(buildFeatureItems(processId, ctx, top));\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"geometry_fit\", function buildGeometry() {\n        return geometryFit(buildGeometryItems(ctx, top));\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"fit_kpis\", function buildKpis() {\n        return fitKpis(buildFitItems(top));\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"recipe_start_values\", function buildRecipe() {\n        return buildRecipeBlock(top);\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"machine_feasibility\", function buildMachine() {\n        return machineFeasibility(buildMachineChecks(ctx, top));\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"setup_notes\", function buildSetup() {\n        return setupNotes(buildSetupItems(ctx));\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"risk_notes\", function buildRisk() {\n        return riskNotes(buildRiskItems(processId, ctx, top));\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"warning\", function buildWarn() {\n        if (top.score.hardRejectReason) {\n          return warning(\"warning\", top.score.hardRejectReason);\n        }\n        return null;\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"alternatives\", function buildAlternatives() {\n        return alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n          return {\n            variantId: item.candidate.ids.variantId,\n            label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n            score: item.score.total,\n            reason: item.score.reasons[0] || \"Alternative option\",\n            suitable: item.score.eligible === true,\n            productTitle: item.candidate.catalog.productTitle,\n            systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n              ? item.candidate.attachments.systemContext.bodyVariantId\n              : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n            imageUrl: item.candidate.catalog.imageUrl,\n            productUrl: item.candidate.catalog.url,\n            available: item.candidate.commerce.available,\n            priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n            ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          };\n        }));\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"explanation\", function buildExplanation() {\n        return explanation([\n          \"This result is based on canonical V1 scoring.\",\n          \"The process module owns the business logic while the renderer stays block-driven.\",\n        ]);\n      });\n    \n      addBlockIfAllowed(blocks, allowedBlockTypes, \"commerce_cta\", function buildCommerce() {\n        return commerceCta({\n          productUrl: top.candidate.catalog.url,\n          available: top.candidate.commerce.available,\n          priceLabel: top.candidate.commerce.priceCents != null ? String(top.candidate.commerce.priceCents / 100) : null,\n          ctaLabel: top.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        });\n      });\n    \n      return createResultViewModel({\n        processId: processId,\n        outcome: toOutcome(top),\n        summary: \"Top result for \" + processId,\n        heroVariantId: top.candidate.ids.variantId,\n        blocks: blocks,\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: top.candidate.catalog.url || top.candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust answers\", targetId: null },\n        ],\n      });\n    }\n    \n    function createStubProcessModule(processId, handlers) {\n      var spec = getProcessSpec(processId);\n      var modules = handlers || {};\n      var questionDefs = modules.getQuestions ? applyLiteQuestionMinimum(processId, modules.getQuestions()) : null;\n      if (Array.isArray(questionDefs) && questionDefs.length > 0) {\n        PROCESS_QUESTION_OVERRIDES[processId] = questionDefs.slice();\n      }\n      return {\n        id: processId,\n        family: spec.family,\n        toolkits: spec.toolkits.slice(),\n        getQuestions: function getQuestions(ctx) {\n          if (modules.getQuestions) {\n            return applyLiteQuestionMinimum(processId, modules.getQuestions(ctx));\n          }\n          return buildProcessQuestions(processId);\n        },\n        derive: modules.derive || function derive(ctx, toolkits) { return deriveByProcessSpec(processId, ctx, toolkits); },\n        validate: modules.validate || function validate(ctx) { return validateByProcessSpec(processId, ctx); },\n        prefilter: modules.prefilter || function prefilter(pool) { return prefilterByProcessSpec(processId, pool); },\n        score: modules.score || function score(pool, ctx, kernel, toolkits) { return scoreByProcessSpec(processId, pool, ctx, kernel, toolkits); },\n        buildResultView: modules.buildResultView || function buildResultView(scored, ctx) { return buildResultViewBySpec(processId, scored, ctx); },\n      };\n    }\n    \n    function createProcessFixtureSummary(processId) {\n      return {\n        processId: processId,\n        questions: getProcessSpec(processId).questionIds.slice(),\n        expectedBlocks: getProcessSpec(processId).resultBlocks,\n      };\n    }\n    \n    function getQuestionDefinition(questionId) {\n      return QUESTION_LIBRARY[questionId];\n    }\n    \n    exports.getLiteQuestionMinimumIds = getLiteQuestionMinimumIds;\n    exports.getAnswer = getAnswer;\n    exports.getTargetDiameter = getTargetDiameter;\n    exports.getTargetDepth = getTargetDepth;\n    exports.buildProcessQuestions = buildProcessQuestions;\n    exports.deriveByProcessSpec = deriveByProcessSpec;\n    exports.validateByProcessSpec = validateByProcessSpec;\n    exports.prefilterByProcessSpec = prefilterByProcessSpec;\n    exports.scoreByProcessSpec = scoreByProcessSpec;\n    exports.buildResultViewBySpec = buildResultViewBySpec;\n    exports.createStubProcessModule = createStubProcessModule;\n    exports.createProcessFixtureSummary = createProcessFixtureSummary;\n    exports.getQuestionDefinition = getQuestionDefinition;\n  },\n  \"processes/boring/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/boring/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/boring/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/boring/presenter.js\");\n    exports.default = createStubProcessModule(\"boring\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/boring/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, recipeStartValues, riskNotes, setupNotes } = __bundle.require(\"core/result-blocks.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.checks)) return data.checks.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        return true;\n      });\n    }\n    \n    function titleCase(value) {\n      return String(value || \"\")\n        .split(/[_\\s-]+/)\n        .filter(Boolean)\n        .map(function mapPart(part) {\n          return part.charAt(0).toUpperCase() + part.slice(1);\n        })\n        .join(\" \");\n    }\n    \n    function formatNumber(value, digits) {\n      return value == null ? \"n/a\" : Number(value).toFixed(digits == null ? 2 : digits);\n    }\n    \n    function formatMm(value, digits) {\n      return value == null ? \"n/a\" : formatNumber(value, digits == null ? 2 : digits) + \" mm\";\n    }\n    \n    function formatUm(value, digits) {\n      return value == null ? \"n/a\" : formatNumber(value, digits == null ? 1 : digits) + \" um\";\n    }\n    \n    function statusFromRisk(riskClass) {\n      return riskClass === \"low\" ? \"good\" : riskClass === \"medium\" ? \"ok\" : \"weak\";\n    }\n    \n    function buildFeatureItems(metrics) {\n      return [\n        { key: \"bore_type\", label: \"Bore type\", value: titleCase(metrics.requestedBoreType) },\n        { key: \"phase\", label: \"Operation phase\", value: titleCase(metrics.requestedOperationPhase) },\n        { key: \"bore_diameter\", label: \"Bore diameter\", value: formatMm(metrics.requestedBoreDiameterMm) },\n        { key: \"bore_length\", label: \"Bore length\", value: formatMm(metrics.requestedBoreLengthMm) },\n        { key: \"stability\", label: \"Stability class\", value: titleCase(metrics.requestedStabilityClass) },\n        { key: \"surface\", label: \"Surface vs productivity\", value: titleCase(metrics.requestedSurfacePriority) },\n      ];\n    }\n    \n    function buildGeometryItems(metrics) {\n      var items = [\n        {\n          key: \"bar_to_bore\",\n          label: \"Bar to bore ratio\",\n          actual: metrics.barToBoreRatio != null ? formatNumber(metrics.barToBoreRatio, 2) : \"n/a\",\n          target: \"As large as possible with chip space\",\n          result: metrics.barToBoreRatio != null && metrics.barToBoreRatio >= 0.55 && metrics.barToBoreRatio < 0.95 ? \"fit\" : \"near\",\n        },\n        {\n          key: \"shape\",\n          label: \"Insert shape / shoulder need\",\n          actual: metrics.candidateShapeCode ? String(metrics.candidateShapeCode) : \"n/a\",\n          target: titleCase(metrics.insertShapeNeed),\n          result: metrics.shapeFitScore >= 0.85 ? \"fit\" : metrics.shapeFitScore >= 0.6 ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"nose_radius\",\n          label: \"Nose radius\",\n          actual: formatMm(metrics.noseRadiusMm, 2),\n          target: metrics.requestedTargetRoughnessUm != null ? formatUm(metrics.requestedTargetRoughnessUm, 1) : titleCase(metrics.requestedSurfacePriority),\n          result: metrics.finishFeasibility === \"strong\" ? \"fit\" : \"near\",\n        },\n      ];\n    \n      if (metrics.theoreticalRoughnessUm != null || metrics.requestedTargetRoughnessUm != null) {\n        items.push({\n          key: \"roughness\",\n          label: \"Theoretical roughness\",\n          actual: formatUm(metrics.theoreticalRoughnessUm, 1),\n          target: metrics.requestedTargetRoughnessUm != null ? formatUm(metrics.requestedTargetRoughnessUm, 1) : \"not specified\",\n          result: metrics.requestedTargetRoughnessUm == null || metrics.theoreticalRoughnessUm <= metrics.requestedTargetRoughnessUm ? \"fit\" : \"near\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"score\", label: \"Fit score\", value: formatNumber(top.score.total, 2), status: top.score.total >= 6 ? \"good\" : \"ok\" },\n        { key: \"rigidity\", label: \"Rigidity risk\", value: titleCase(metrics.rigidityRiskClass), status: statusFromRisk(metrics.rigidityRiskClass) },\n        { key: \"chip\", label: \"Chip evacuation\", value: titleCase(metrics.chipEvacuationRisk), status: metrics.chipEvacuationRisk === \"low\" ? \"good\" : metrics.chipEvacuationRisk === \"medium\" ? \"ok\" : \"weak\" },\n        { key: \"damped_bar\", label: \"Damped bar need\", value: titleCase(metrics.dampedBarNeed), status: metrics.dampedBarNeed === \"no\" ? \"good\" : metrics.requestedDampedBarAllowed === \"yes\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatNumber(top.score.confidence, 2), status: top.score.confidence >= 0.78 ? \"good\" : \"ok\" },\n      ];\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n        { key: \"f\", label: \"f\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n        { key: \"ap\", label: \"ap\", min: top.recipe && top.recipe.ap.min, typ: top.recipe && top.recipe.ap.typ, max: top.recipe && top.recipe.ap.max, unit: \"mm\" },\n        { key: \"n\", label: \"n\", min: null, typ: metrics.rpmTyp, max: null, unit: \"rpm\" },\n        { key: \"vf\", label: \"vf\", min: null, typ: metrics.feedSpeedMmMin, max: null, unit: \"mm/min\" },\n        { key: \"Q\", label: \"Q\", min: null, typ: metrics.mrrCm3Min, max: null, unit: \"cm3/min\" },\n        { key: \"Rth\", label: \"Rth\", min: null, typ: metrics.theoreticalRoughnessUm, max: null, unit: \"um\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildMachineChecks(candidate, metrics) {\n      var checks = [];\n    \n      if (metrics.requestedCoolantClass) {\n        checks.push({\n          key: \"coolant\",\n          label: \"Coolant support\",\n          result: metrics.coolingSupportClass === \"strong\" || metrics.coolingSupportClass === \"adequate\"\n            ? \"pass\"\n            : metrics.coolingSupportClass === \"limited\"\n              ? \"limited\"\n              : \"fail\",\n          note: metrics.requestedCoolantClass === \"internal\" || metrics.requestedCoolantClass === \"high_pressure\"\n            ? (candidate.common.coolantTsc ? \"Tool supports through-coolant delivery.\" : \"Machine asks for through coolant but the candidate does not expose it.\")\n            : null,\n        });\n      }\n    \n      checks.push({\n        key: \"ld\",\n        label: \"L/D window\",\n        result: metrics.rigidityRiskClass === \"low\" || metrics.rigidityRiskClass === \"medium\" ? \"pass\" : \"limited\",\n        note: metrics.lOverDRatio != null\n          ? \"Current L/D ratio is \" + formatNumber(metrics.lOverDRatio, 2) + \".\"\n          : \"No explicit bar diameter was provided, so L/D is estimated through the overall setup.\",\n      });\n    \n      if (metrics.dampedBarNeed !== \"no\") {\n        checks.push({\n          key: \"damped_bar\",\n          label: \"Damped bar route\",\n          result: metrics.requestedDampedBarAllowed === \"yes\" ? \"pass\" : metrics.requestedDampedBarAllowed === \"unknown\" ? \"limited\" : \"fail\",\n          note: \"Current boring-bar routing suggests \" + titleCase(metrics.dampedBarNeed) + \".\",\n        });\n      }\n    \n      return checks;\n    }\n    \n    function buildSetupItems(metrics) {\n      var items = [\n        { area: \"stability\", message: \"Rigidity risk is \" + titleCase(metrics.rigidityRiskClass) + \" with \" + titleCase(metrics.requestedOverhangClass) + \" overhang.\" },\n        { area: \"forces\", message: \"Preferred geometry bias: \" + titleCase(metrics.positiveNegativeBias) + \".\" },\n        { area: \"access\", message: \"Insert shape need: \" + titleCase(metrics.insertShapeNeed) + \" for \" + titleCase(metrics.requestedMinimumShoulderAccess) + \".\" },\n        { area: \"special\", message: \"Special material route: \" + titleCase(metrics.specialMaterialRoute) + \".\" },\n      ];\n    \n      if (metrics.requestedBoreType === \"blind_bore\") {\n        items.push({ area: \"blind_bore\", message: \"Blind-hole strategy need: \" + titleCase(metrics.blindHoleStrategyNeed) + \".\" });\n      }\n      if (metrics.requestedWiperAllowed && metrics.requestedWiperAllowed !== \"unknown\") {\n        items.push({ area: \"surface\", message: \"Wiper suitability: \" + titleCase(metrics.wiperSuitabilityClass) + \".\" });\n      }\n    \n      return items;\n    }\n    \n    function buildRiskItems(metrics) {\n      var items = [];\n    \n      if (metrics.rigidityRiskClass === \"high\" || metrics.rigidityRiskClass === \"critical\") {\n        items.push({\n          severity: metrics.rigidityRiskClass === \"critical\" ? \"critical\" : \"warning\",\n          title: \"Rigidity\",\n          message: \"Long overhang and low boring-bar stiffness are the main internal-turning risks in this case.\",\n        });\n      }\n      if (metrics.chipEvacuationRisk === \"high\" || metrics.chipEvacuationRisk === \"critical\") {\n        items.push({\n          severity: metrics.chipEvacuationRisk === \"critical\" ? \"critical\" : \"warning\",\n          title: \"Chip evacuation\",\n          message: \"Chip evacuation is risky for this bore geometry; blind-hole or tight bar-to-bore conditions need extra care.\",\n        });\n      }\n      if (metrics.requestedBoreType === \"blind_bore\" && metrics.blindHoleStrategyNeed !== \"no\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Blind-bore strategy\",\n          message: \"In blind bores, adapt the machining sequence to prevent chip trapping at the back wall.\",\n        });\n      }\n      if (metrics.requestedWiperAllowed === \"yes\" && (metrics.wiperSuitabilityClass === \"weak\" || metrics.wiperSuitabilityClass === \"avoid\")) {\n        items.push({\n          severity: \"warning\",\n          title: \"Wiper limitation\",\n          message: \"Wiper geometry is not a default inside bores with long overhang or marginal rigidity.\",\n        });\n      }\n      if (metrics.finishFeasibility === \"weak\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Finish conflict\",\n          message: \"The requested internal finish needs a smaller feed, a more stable bar or better chip-control conditions.\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildResultView(scored) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var metrics = top.metrics || {};\n    \n      return createResultViewModel({\n        processId: \"boring\",\n        outcome: top.score.total >= 6 ? \"match\" : \"limited_match\",\n        summary: \"Best boring result based on rigidity, chip evacuation, internal-force control and surface/process balance.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 4),\n          }),\n          featureSummary(buildFeatureItems(metrics)),\n          geometryFit(buildGeometryItems(metrics)),\n          fitKpis(buildFitItems(top)),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: buildRecipeValues(top),\n          }),\n          machineFeasibility(buildMachineChecks(candidate, metrics)),\n          riskNotes(buildRiskItems(metrics)),\n          setupNotes(buildSetupItems(metrics)),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative boring option\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust boring inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/boring/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"boring\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/boring/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function getOperationPhase(ctx) {\n      return toNullableString(getAnswer(ctx, \"operation_phase\") || getAnswer(ctx, \"goal_stage\")) || \"semi-finishing\";\n    }\n    \n    function getBoreType(ctx) {\n      return toNullableString(getAnswer(ctx, \"bore_type\")) || \"through_bore\";\n    }\n    \n    function getMaterialRefinement(ctx) {\n      return toNullableString(getAnswer(ctx, \"material_refinement\") || getAnswer(ctx, \"material_condition_class\")) || \"standard\";\n    }\n    \n    function getSurfacePriority(ctx) {\n      return toNullableString(getAnswer(ctx, \"surface_vs_productivity\")) || \"balanced\";\n    }\n    \n    function getCoolantClass(ctx) {\n      return toNullableString(getAnswer(ctx, \"coolant_class\")) || \"unknown\";\n    }\n    \n    function getStabilityClass(ctx) {\n      return toNullableString(getAnswer(ctx, \"stability_class\")) || \"normal\";\n    }\n    \n    function getDampedBarAllowed(ctx) {\n      return toNullableString(getAnswer(ctx, \"damped_bar_allowed\")) || \"unknown\";\n    }\n    \n    function getMinimumShoulderAccess(ctx) {\n      return toNullableString(getAnswer(ctx, \"minimum_shoulder_access\")) || \"straight_bore\";\n    }\n    \n    function getOverhangClass(ctx) {\n      return toNullableString(getAnswer(ctx, \"overhang_class\") || getAnswer(ctx, \"overhang_condition\")) || \"short\";\n    }\n    \n    function getIsoGroup(ctx) {\n      return toNullableString(ctx && ctx.material && ctx.material.isoGroup) || null;\n    }\n    \n    function stageFitScore(requestedStage, row) {\n      var rowStage = row && row.constraints ? toNullableString(row.constraints.conditionStage) : null;\n      if (!rowStage || !requestedStage) return 0.75;\n      if (rowStage === requestedStage) return 1;\n      if ((rowStage === \"roughing\" && requestedStage === \"semi-finishing\") || (rowStage === \"semi-finishing\" && requestedStage === \"roughing\")) {\n        return 0.72;\n      }\n      if ((rowStage === \"finishing\" && requestedStage === \"semi-finishing\") || (rowStage === \"semi-finishing\" && requestedStage === \"finishing\")) {\n        return 0.82;\n      }\n      return 0.38;\n    }\n    \n    function selectBestRow(rows, requestedStage) {\n      var exact = (rows || []).find(function findExact(row) {\n        return row && row.constraints && row.constraints.conditionStage === requestedStage;\n      });\n      return exact || (rows || [])[0] || null;\n    }\n    \n    function getCandidatePolarity(candidate) {\n      var clearanceCode = toNullableString(candidate && candidate.turning && candidate.turning.turnClearanceCode);\n      if (!clearanceCode) return \"unknown\";\n      return clearanceCode.toUpperCase() === \"N\" ? \"negative\" : \"positive\";\n    }\n    \n    function getBarDiameterMm(ctx, candidate) {\n      return toNullableNumber(getAnswer(ctx, \"bar_diameter_mm\"))\n        || toNullableNumber(candidate && candidate.common && candidate.common.diameterMm)\n        || null;\n    }\n    \n    function classifyRigidityRisk(boreDiameterMm, boreLengthMm, barDiameterMm, stabilityClass, overhangClass, boreType) {\n      var risk = 0;\n      var lOverD = barDiameterMm != null && barDiameterMm > 0 ? boreLengthMm / barDiameterMm : null;\n    \n      risk += { normal: 0.2, critical: 1.3, very_critical: 2.4 }[stabilityClass] || 0.8;\n      risk += { short: 0, medium: 0.7, long: 1.6, critical: 2.5 }[overhangClass] || 0.6;\n      if (boreType === \"blind_bore\") risk += 0.35;\n    \n      if (lOverD != null) {\n        if (lOverD >= 10) risk += 2.2;\n        else if (lOverD >= 8) risk += 1.6;\n        else if (lOverD >= 5) risk += 1;\n        else if (lOverD >= 3) risk += 0.45;\n      } else if (boreDiameterMm != null && boreLengthMm != null && boreDiameterMm > 0) {\n        var boreRatio = boreLengthMm / boreDiameterMm;\n        if (boreRatio >= 8) risk += 1.7;\n        else if (boreRatio >= 5) risk += 1.1;\n        else if (boreRatio >= 3) risk += 0.5;\n      }\n    \n      if (risk >= 4.6) return \"critical\";\n      if (risk >= 3) return \"high\";\n      if (risk >= 1.5) return \"medium\";\n      return \"low\";\n    }\n    \n    function rigidityScore(rigidityRiskClass, candidatePolarity, boreDiameterMm, barDiameterMm) {\n      var score = { low: 1, medium: 0.78, high: 0.45, critical: 0.16 }[rigidityRiskClass] || 0.55;\n      if (candidatePolarity === \"positive\" && (rigidityRiskClass === \"medium\" || rigidityRiskClass === \"high\")) score += 0.08;\n      if (boreDiameterMm != null && barDiameterMm != null && boreDiameterMm > 0) {\n        var ratio = barDiameterMm / boreDiameterMm;\n        if (ratio >= 0.7 && ratio <= 0.9) score += 0.05;\n        if (ratio < 0.45) score -= 0.08;\n      }\n      return clamp(score, 0, 1);\n    }\n    \n    function classifyPositiveNegativeBias(boreDiameterMm, stabilityClass, interruption, phase, candidateShouldBeLight, isoGroup) {\n      var positiveNeed = 0;\n      var negativeNeed = 0;\n    \n      if (candidateShouldBeLight) positiveNeed += 2;\n      if (stabilityClass === \"critical\") positiveNeed += 1;\n      if (stabilityClass === \"very_critical\") positiveNeed += 2;\n      if (boreDiameterMm != null && boreDiameterMm <= 20) positiveNeed += 1;\n    \n      if (interruption === \"heavy\") negativeNeed += 2;\n      if (phase === \"roughing\") negativeNeed += 1;\n      if (isoGroup === \"K\") negativeNeed += 1;\n      if (boreDiameterMm != null && boreDiameterMm >= 40 && stabilityClass === \"normal\") negativeNeed += 0.6;\n    \n      if (positiveNeed >= negativeNeed + 1) return \"positive_preferred\";\n      if (negativeNeed >= positiveNeed + 1) return \"negative_preferred\";\n      return \"balanced\";\n    }\n    \n    function polarityFitScore(bias, candidatePolarity) {\n      if (bias === \"balanced\") return candidatePolarity === \"unknown\" ? 0.65 : 0.82;\n      if (candidatePolarity === \"unknown\") return 0.55;\n      if (bias === \"positive_preferred\") return candidatePolarity === \"positive\" ? 1 : 0.38;\n      return candidatePolarity === \"negative\" ? 1 : 0.38;\n    }\n    \n    function classifyInsertShapeNeed(minimumShoulderAccess, boreDiameterMm) {\n      if (minimumShoulderAccess === \"tight_shoulder\") return \"triangle_preferred\";\n      if (minimumShoulderAccess === \"shoulder\") return \"D55_preferred\";\n      if (boreDiameterMm != null && boreDiameterMm <= 18) return \"triangle_preferred\";\n      return \"wider_angle_possible\";\n    }\n    \n    function insertShapeScore(shapeCode, insertShapeNeed) {\n      var code = String(shapeCode || \"\").toUpperCase();\n      var triangleMap = { T: 1, D: 0.84, V: 0.78, C: 0.45, W: 0.4, S: 0.32, R: 0.18 };\n      var d55Map = { D: 1, T: 0.9, V: 0.86, C: 0.58, W: 0.48, S: 0.4, R: 0.18 };\n      var wideMap = { C: 0.95, W: 0.9, D: 0.8, T: 0.76, V: 0.62, S: 0.55, R: 0.24 };\n      var table = d55Map;\n    \n      if (insertShapeNeed === \"triangle_preferred\") table = triangleMap;\n      if (insertShapeNeed === \"wider_angle_possible\") table = wideMap;\n      return Object.prototype.hasOwnProperty.call(table, code) ? table[code] : 0.55;\n    }\n    \n    function classifyChipEvacuationRisk(boreType, materialRefinement, coolantClass, boreDiameterMm, barDiameterMm) {\n      var risk = 0;\n      var ratio = barDiameterMm != null && boreDiameterMm != null && boreDiameterMm > 0 ? barDiameterMm / boreDiameterMm : null;\n    \n      if (boreType === \"blind_bore\") risk += 1.4;\n      if (materialRefinement === \"tough_long_chipping\") risk += 1;\n      if (materialRefinement === \"sticky_bue\") risk += 1;\n      if (materialRefinement === \"work_hardening\") risk += 1;\n      if (coolantClass === \"dry\" || coolantClass === \"unknown\") risk += 0.8;\n      if (boreDiameterMm != null && boreDiameterMm <= 16) risk += 0.55;\n      if (ratio != null) {\n        if (ratio >= 0.88) risk += 1.1;\n        else if (ratio >= 0.8) risk += 0.7;\n        else if (ratio <= 0.45) risk += 0.2;\n      }\n    \n      if (risk >= 3.4) return \"critical\";\n      if (risk >= 2.3) return \"high\";\n      if (risk >= 1.1) return \"medium\";\n      return \"low\";\n    }\n    \n    function chipEvacuationScore(chipEvacuationRisk) {\n      return { low: 1, medium: 0.7, high: 0.4, critical: 0.14 }[chipEvacuationRisk] || 0.6;\n    }\n    \n    function classifyDampedBarNeed(lOverD, rigidityRiskClass, surfacePriority, materialRefinement, dampedBarAllowed) {\n      if (dampedBarAllowed === \"no\" && lOverD != null && lOverD >= 8) return \"strong\";\n      if (lOverD != null) {\n        if (lOverD >= 10) return dampedBarAllowed === \"yes\" ? \"mandatory_like\" : \"strong\";\n        if (lOverD >= 8) return \"strong\";\n        if (lOverD >= 5) return \"useful\";\n      }\n      if ((rigidityRiskClass === \"high\" || rigidityRiskClass === \"critical\") && (surfacePriority === \"surface\" || materialRefinement === \"work_hardening\")) {\n        return dampedBarAllowed === \"yes\" ? \"useful\" : \"strong\";\n      }\n      return \"no\";\n    }\n    \n    function dampedBarScore(dampedBarNeed, dampedBarAllowed) {\n      if (dampedBarNeed === \"no\") return 0.9;\n      if (dampedBarNeed === \"useful\") return dampedBarAllowed === \"yes\" ? 1 : dampedBarAllowed === \"unknown\" ? 0.68 : 0.42;\n      if (dampedBarNeed === \"strong\") return dampedBarAllowed === \"yes\" ? 0.96 : dampedBarAllowed === \"unknown\" ? 0.52 : 0.18;\n      return dampedBarAllowed === \"yes\" ? 0.92 : dampedBarAllowed === \"unknown\" ? 0.4 : 0.12;\n    }\n    \n    function classifyCoolingSupport(materialRefinement, coolantClass, hasThroughCoolant, isoGroup, boreType, chipEvacuationRisk) {\n      var demand = 0;\n      var supply = 0;\n    \n      if (isoGroup === \"M\" || isoGroup === \"S\" || isoGroup === \"N\") demand += 1;\n      if (materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") demand += 1;\n      if (boreType === \"blind_bore\") demand += 0.6;\n      if (chipEvacuationRisk === \"high\" || chipEvacuationRisk === \"critical\") demand += 0.7;\n    \n      supply += { dry: 0, external: 0.8, internal: 1.2, high_pressure: 1.5, unknown: 0.4 }[coolantClass] || 0.4;\n      if ((coolantClass === \"internal\" || coolantClass === \"high_pressure\") && hasThroughCoolant) supply += 0.3;\n      if ((coolantClass === \"internal\" || coolantClass === \"high_pressure\") && !hasThroughCoolant) supply -= 0.3;\n    \n      if (supply >= demand + 0.7) return \"strong\";\n      if (supply >= demand) return \"adequate\";\n      if (supply >= demand - 0.6) return \"limited\";\n      return \"weak\";\n    }\n    \n    function coolingScore(coolingSupportClass) {\n      return { strong: 1, adequate: 0.82, limited: 0.55, weak: 0.22 }[coolingSupportClass] || 0.6;\n    }\n    \n    function classifyWiperSuitability(surfacePriority, rigidityRiskClass, lOverD, boreDiameterMm, wiperAllowed) {\n      if (wiperAllowed === \"no\") return \"avoid\";\n      if (rigidityRiskClass === \"high\" || rigidityRiskClass === \"critical\") return \"weak\";\n      if (lOverD != null && lOverD >= 6) return \"weak\";\n      if (boreDiameterMm != null && boreDiameterMm <= 16) return \"weak\";\n      if (surfacePriority === \"surface\") return \"usable\";\n      return \"weak\";\n    }\n    \n    function computeTheoreticalRoughnessUm(fnTyp, noseRadiusMm) {\n      if (fnTyp == null || noseRadiusMm == null || noseRadiusMm <= 0) return null;\n      return fnTyp * fnTyp / (8 * noseRadiusMm) * 1000;\n    }\n    \n    function classifyFinishFeasibility(surfacePriority, rigidityRiskClass, chipEvacuationRisk, wiperSuitabilityClass, roughnessUm, targetRoughnessUm) {\n      var roughnessFit = roughnessUm == null || targetRoughnessUm == null ? \"unknown\" : (roughnessUm <= targetRoughnessUm ? \"good\" : (roughnessUm <= targetRoughnessUm * 1.35 ? \"near\" : \"poor\"));\n    \n      if (surfacePriority === \"productivity\") return \"weak\";\n      if (rigidityRiskClass === \"critical\") return \"weak\";\n      if (chipEvacuationRisk === \"critical\") return \"weak\";\n      if (roughnessFit === \"good\" && (rigidityRiskClass === \"low\" || rigidityRiskClass === \"medium\")) return \"strong\";\n      if (roughnessFit === \"poor\") return \"weak\";\n      if (wiperSuitabilityClass === \"avoid\" && targetRoughnessUm != null && targetRoughnessUm <= 3.2) return \"weak\";\n      return \"conditional\";\n    }\n    \n    function finishScore(finishFeasibility, surfacePriority) {\n      var base = { strong: 1, conditional: 0.68, weak: 0.3 }[finishFeasibility] || 0.55;\n      if (surfacePriority === \"surface\") return base;\n      if (surfacePriority === \"balanced\") return clamp(base + 0.05, 0, 1);\n      return clamp(base + 0.12, 0, 1);\n    }\n    \n    function classifyBlindHoleStrategyNeed(boreType, chipEvacuationRisk) {\n      if (boreType !== \"blind_bore\") return \"no\";\n      if (chipEvacuationRisk === \"critical\" || chipEvacuationRisk === \"high\") return \"strong\";\n      return \"useful\";\n    }\n    \n    function classifySpecialMaterialRoute(isoGroup, materialRefinement, phase, surfacePriority) {\n      if (isoGroup === \"H\" || materialRefinement === \"hard\") return \"cbn_pcbn_route\";\n      if (isoGroup === \"N\" && (surfacePriority === \"surface\" || phase === \"finishing\")) return \"pcd_route\";\n      if (phase === \"finishing\" && surfacePriority === \"surface\" && (isoGroup === \"P\" || isoGroup === \"M\" || isoGroup === \"K\")) return \"cermet_possible\";\n      return \"carbide_default\";\n    }\n    \n    function buildReasonList(metrics) {\n      return [\n        metrics.stageFitScore >= 0.85 ? \"Stage and recipe window line up with the requested boring phase.\" : \"The selected row is workable, but not ideal for the requested boring phase.\",\n        metrics.rigidityRiskClass === \"low\" || metrics.rigidityRiskClass === \"medium\"\n          ? \"Boring-bar rigidity stays within a controlled range.\"\n          : \"Rigidity is the main constraint for this internal-turning setup.\",\n        metrics.chipEvacuationRisk === \"low\" || metrics.chipEvacuationRisk === \"medium\"\n          ? \"Chip evacuation remains manageable for the requested bore.\"\n          : \"Chip evacuation is the main risk driver for this case.\",\n        metrics.positiveNegativeBias === \"positive_preferred\"\n          ? \"The process favors a lighter positive geometry to reduce bore-side force.\"\n          : \"The process can tolerate a more robust geometry window.\",\n        metrics.finishFeasibility === \"strong\"\n          ? \"Surface quality is credible with the current feed and nose-radius window.\"\n          : \"Surface quality depends strongly on bar rigidity and chip evacuation.\",\n      ].slice(0, 5);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"boring\", ctx, toolkits));\n      var boreDiameterMm = toNullableNumber(getAnswer(ctx, \"bore_diameter_mm\"));\n      var boreLengthMm = toNullableNumber(getAnswer(ctx, \"bore_length_mm\") || getAnswer(ctx, \"bore_depth_mm\"));\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var surfacePriority = getSurfacePriority(ctx);\n      var stabilityClass = getStabilityClass(ctx);\n      var overhangClass = getOverhangClass(ctx);\n      var boreType = getBoreType(ctx);\n      var barDiameterMm = toNullableNumber(getAnswer(ctx, \"bar_diameter_mm\"));\n      var lOverD = barDiameterMm != null && boreLengthMm != null && barDiameterMm > 0 ? boreLengthMm / barDiameterMm : null;\n    \n      derived.condition_stage = phase;\n      derived.material_refinement = materialRefinement;\n      derived.L_over_D_ratio = lOverD;\n      derived.bar_to_bore_ratio = barDiameterMm != null && boreDiameterMm != null && boreDiameterMm > 0 ? barDiameterMm / boreDiameterMm : null;\n      derived.rigidity_risk_class = classifyRigidityRisk(boreDiameterMm, boreLengthMm, barDiameterMm, stabilityClass, overhangClass, boreType);\n      derived.positive_negative_bias = classifyPositiveNegativeBias(boreDiameterMm, stabilityClass, toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\", phase, stabilityClass !== \"normal\", getIsoGroup(ctx));\n      derived.special_material_route = classifySpecialMaterialRoute(getIsoGroup(ctx), materialRefinement, phase, surfacePriority);\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"boring\", ctx);\n      var boreType = getBoreType(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var coolantClass = getCoolantClass(ctx);\n      var wiperAllowed = toNullableString(getAnswer(ctx, \"wiper_allowed\")) || \"unknown\";\n      var overhangClass = getOverhangClass(ctx);\n      var targetRoughnessUm = toNullableNumber(getAnswer(ctx, \"target_roughness\"));\n      var boreDiameterMm = toNullableNumber(getAnswer(ctx, \"bore_diameter_mm\"));\n      var boreLengthMm = toNullableNumber(getAnswer(ctx, \"bore_length_mm\") || getAnswer(ctx, \"bore_depth_mm\"));\n      var barDiameterMm = toNullableNumber(getAnswer(ctx, \"bar_diameter_mm\"));\n    \n      if ((materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") && (coolantClass === \"dry\" || coolantClass === \"unknown\")) {\n        issues.push({\n          field: \"coolant_class\",\n          message: \"Chip-critical internal turning cases benefit strongly from better coolant support.\",\n          severity: \"warning\",\n          code: \"boring_coolant_support\",\n        });\n      }\n      if (boreType === \"blind_bore\" && (coolantClass === \"dry\" || coolantClass === \"unknown\")) {\n        issues.push({\n          field: \"coolant_class\",\n          message: \"Blind-bore turning without clear coolant or chip strategy is risky.\",\n          severity: \"warning\",\n          code: \"boring_blind_chip_risk\",\n        });\n      }\n      if (wiperAllowed === \"yes\" && (overhangClass === \"long\" || overhangClass === \"critical\")) {\n        issues.push({\n          field: \"wiper_allowed\",\n          message: \"Wiper geometry is risky in internal turning with long overhang.\",\n          severity: \"warning\",\n          code: \"boring_wiper_overhang\",\n        });\n      }\n      if (targetRoughnessUm != null && targetRoughnessUm < 1 && getOperationPhase(ctx) !== \"finishing\") {\n        issues.push({\n          field: \"target_roughness\",\n          message: \"Sub-micron roughness targets usually require a finishing-focused boring strategy.\",\n          severity: \"warning\",\n          code: \"boring_roughness_phase_conflict\",\n        });\n      }\n      if (boreDiameterMm != null && boreLengthMm != null && barDiameterMm != null && barDiameterMm >= boreDiameterMm) {\n        issues.push({\n          field: \"bar_diameter_mm\",\n          message: \"Boring-bar diameter cannot exceed the target bore diameter.\",\n          severity: \"error\",\n          code: \"boring_bar_too_large\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"boring\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var turningTools = toolkits.turning;\n      var boreType = getBoreType(ctx);\n      var boreDiameterMm = toNullableNumber(getAnswer(ctx, \"bore_diameter_mm\"));\n      var boreLengthMm = toNullableNumber(getAnswer(ctx, \"bore_length_mm\") || getAnswer(ctx, \"bore_depth_mm\"));\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var surfacePriority = getSurfacePriority(ctx);\n      var coolantClass = getCoolantClass(ctx);\n      var stabilityClass = getStabilityClass(ctx);\n      var dampedBarAllowed = getDampedBarAllowed(ctx);\n      var wiperAllowed = toNullableString(getAnswer(ctx, \"wiper_allowed\")) || \"unknown\";\n      var targetRoughnessUm = toNullableNumber(getAnswer(ctx, \"target_roughness\"));\n      var minimumShoulderAccess = getMinimumShoulderAccess(ctx);\n      var overhangClass = getOverhangClass(ctx);\n      var isoGroup = getIsoGroup(ctx);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = turningTools.resolveRows(candidate, ctx);\n        var row = selectBestRow(rows, phase);\n        var recipeResult = turningTools.resolveRecipe(candidate, ctx);\n        var recipe = row && row.recipe ? row.recipe : recipeResult.recipe;\n        var recipeSource = recipeResult.source;\n        var insertIcMm = toNullableNumber(candidate.turning.turnSizeIcMm) || null;\n        var noseRadiusMm = toNullableNumber(candidate.turning.turnNoseRadiusMm);\n        var barDiameterMm = getBarDiameterMm(ctx, candidate);\n        var candidatePolarity = getCandidatePolarity(candidate);\n        var candidateShapeCode = toNullableString(candidate.turning.turnShapeCode) || \"?\";\n        var stageFit = stageFitScore(phase, row);\n        var lOverD = barDiameterMm != null && boreLengthMm != null && barDiameterMm > 0 ? boreLengthMm / barDiameterMm : null;\n        var barToBoreRatio = barDiameterMm != null && boreDiameterMm != null && boreDiameterMm > 0 ? barDiameterMm / boreDiameterMm : null;\n        var rigidityRiskClass = classifyRigidityRisk(boreDiameterMm, boreLengthMm, barDiameterMm, stabilityClass, overhangClass, boreType);\n        var rigidityFit = rigidityScore(rigidityRiskClass, candidatePolarity, boreDiameterMm, barDiameterMm);\n        var positiveNegativeBias = classifyPositiveNegativeBias(boreDiameterMm, stabilityClass, interruption, phase, rigidityRiskClass !== \"low\", isoGroup);\n        var polarityFit = polarityFitScore(positiveNegativeBias, candidatePolarity);\n        var insertShapeNeed = classifyInsertShapeNeed(minimumShoulderAccess, boreDiameterMm);\n        var shapeFit = insertShapeScore(candidateShapeCode, insertShapeNeed);\n        var chipEvacuationRisk = classifyChipEvacuationRisk(boreType, materialRefinement, coolantClass, boreDiameterMm, barDiameterMm);\n        var chipEvacuationFit = chipEvacuationScore(chipEvacuationRisk);\n        var dampedBarNeed = classifyDampedBarNeed(lOverD, rigidityRiskClass, surfacePriority, materialRefinement, dampedBarAllowed);\n        var dampedBarFit = dampedBarScore(dampedBarNeed, dampedBarAllowed);\n        var coolingSupportClass = classifyCoolingSupport(materialRefinement, coolantClass, Boolean(candidate.common.coolantTsc), isoGroup, boreType, chipEvacuationRisk);\n        var coolingFit = coolingScore(coolingSupportClass);\n        var wiperSuitabilityClass = classifyWiperSuitability(surfacePriority, rigidityRiskClass, lOverD, boreDiameterMm, wiperAllowed);\n        var recipeFnTyp = recipe && recipe.fn ? toNullableNumber(recipe.fn.typ) : null;\n        var recipeVcTyp = recipe && recipe.vc ? toNullableNumber(recipe.vc.typ) : null;\n        var theoreticalRoughnessUm = computeTheoreticalRoughnessUm(recipeFnTyp, noseRadiusMm);\n        var finishFeasibility = classifyFinishFeasibility(surfacePriority, rigidityRiskClass, chipEvacuationRisk, wiperSuitabilityClass, theoreticalRoughnessUm, targetRoughnessUm);\n        var finishFit = finishScore(finishFeasibility, surfacePriority);\n        var blindHoleStrategyNeed = classifyBlindHoleStrategyNeed(boreType, chipEvacuationRisk);\n        var specialMaterialRoute = classifySpecialMaterialRoute(isoGroup, materialRefinement, phase, surfacePriority);\n        var insertSizeFit = 0.72;\n        var rpmTyp = boreDiameterMm != null && boreDiameterMm > 0 && recipeVcTyp != null ? recipeVcTyp * 1000 / (Math.PI * boreDiameterMm) : null;\n        var feedSpeedMmMin = recipeFnTyp != null && rpmTyp != null ? recipeFnTyp * rpmTyp : null;\n        var mrrCm3Min = toNullableNumber(getAnswer(ctx, \"ap_mm\")) != null && recipeFnTyp != null && recipeVcTyp != null\n          ? toNullableNumber(getAnswer(ctx, \"ap_mm\")) * recipeFnTyp * recipeVcTyp\n          : null;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidenceBase;\n        var confidence;\n        var metrics;\n    \n        if (rows.length === 0 && candidate.stage === \"detail\") {\n          hardRejectReason = \"No turning row is available for boring.\";\n        }\n        if (!hardRejectReason && boreDiameterMm != null && insertIcMm != null && insertIcMm >= boreDiameterMm) {\n          hardRejectReason = \"Insert size exceeds the requested bore diameter.\";\n        }\n        if (!hardRejectReason && boreDiameterMm != null && barDiameterMm != null && barDiameterMm >= boreDiameterMm) {\n          hardRejectReason = \"Boring-bar diameter leaves no room inside the requested bore.\";\n        }\n    \n        if (barToBoreRatio != null) {\n          if (barToBoreRatio >= 0.7 && barToBoreRatio <= 0.9) insertSizeFit = 1;\n          else if (barToBoreRatio >= 0.55) insertSizeFit = 0.78;\n          else insertSizeFit = 0.58;\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          rowMatch: row ? 1 : 0,\n          stage: stageFit * 1.15,\n          insertSize: insertSizeFit,\n          rigidity: rigidityFit * 1.4,\n          polarity: polarityFit * 1.05,\n          shape: shapeFit * 0.9,\n          chipEvacuation: chipEvacuationFit * 1.3,\n          dampedBar: dampedBarFit * 1.05,\n          cooling: coolingFit * 0.9,\n          finish: finishFit * (surfacePriority === \"surface\" ? 1.15 : 0.85),\n          riskPenalty: -(kernel.risk(candidate, ctx) || 0),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidenceBase = { exact: 0.92, near: 0.8, estimated: 0.66, none: 0.48 }[recipeSource] || 0.48;\n        confidence = confidenceBase;\n        if (rigidityRiskClass === \"high\") confidence -= 0.12;\n        if (rigidityRiskClass === \"critical\") confidence -= 0.24;\n        if (chipEvacuationRisk === \"high\") confidence -= 0.08;\n        if (chipEvacuationRisk === \"critical\") confidence -= 0.16;\n        confidence = hardRejectReason ? 0 : clamp(confidence, 0.2, 0.98);\n    \n        metrics = Object.assign({}, turningTools.getSharedMetrics(candidate, ctx), {\n          requestedBoreType: boreType,\n          requestedBoreDiameterMm: boreDiameterMm,\n          requestedBoreLengthMm: boreLengthMm,\n          requestedOperationPhase: phase,\n          requestedMaterialRefinement: materialRefinement,\n          requestedCutInterruption: interruption,\n          requestedSurfacePriority: surfacePriority,\n          requestedCoolantClass: coolantClass,\n          requestedStabilityClass: stabilityClass,\n          requestedDampedBarAllowed: dampedBarAllowed,\n          requestedWiperAllowed: wiperAllowed,\n          requestedTargetRoughnessUm: targetRoughnessUm,\n          requestedMinimumShoulderAccess: minimumShoulderAccess,\n          requestedOverhangClass: overhangClass,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          insertIcMm: insertIcMm,\n          barDiameterMm: barDiameterMm,\n          barToBoreRatio: barToBoreRatio,\n          lOverDRatio: lOverD,\n          noseRadiusMm: noseRadiusMm,\n          candidatePolarity: candidatePolarity,\n          candidateShapeCode: candidateShapeCode,\n          rigidityRiskClass: rigidityRiskClass,\n          positiveNegativeBias: positiveNegativeBias,\n          insertShapeNeed: insertShapeNeed,\n          chipEvacuationRisk: chipEvacuationRisk,\n          dampedBarNeed: dampedBarNeed,\n          blindHoleStrategyNeed: blindHoleStrategyNeed,\n          coolingSupportClass: coolingSupportClass,\n          wiperSuitabilityClass: wiperSuitabilityClass,\n          finishFeasibility: finishFeasibility,\n          specialMaterialRoute: specialMaterialRoute,\n          theoreticalRoughnessUm: theoreticalRoughnessUm,\n          stageFitScore: stageFit,\n          polarityFitScore: polarityFit,\n          insertSizeFitScore: insertSizeFit,\n          shapeFitScore: shapeFit,\n          rpmTyp: rpmTyp,\n          feedSpeedMmMin: feedSpeedMmMin,\n          mrrCm3Min: mrrCm3Min,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeSource,\n          reasons: buildReasonList(metrics),\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/chamfering/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/chamfering/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/chamfering/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/chamfering/presenter.js\");\n    exports.default = createStubProcessModule(\"chamfering\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/chamfering/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, heroRecommendation, recipeStartValues, riskNotes } = __bundle.require(\"core/result-blocks.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        return true;\n      });\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var riskItems = [];\n    \n      if ((top.score.parts.access || 0) < 1) {\n        riskItems.push({ severity: \"warning\", title: \"Access\", message: \"Chamfer access is feasible but not relaxed for this edge condition.\" });\n      }\n      if (String(getAnswer(ctx, \"workpiece_condition\") || \"\") === \"thin_wall\") {\n        riskItems.push({ severity: \"warning\", title: \"Thin wall\", message: \"Thin-wall edges need light chamfer engagement and stable support.\" });\n      }\n    \n      return createResultViewModel({\n        processId: \"chamfering\",\n        outcome: top.score.total >= 4 ? \"match\" : \"limited_match\",\n        summary: \"Best chamfering result based on access, stage and workpiece stability.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 3),\n          }),\n          featureSummary([\n            { key: \"diameter\", label: \"Feature diameter\", value: String(getAnswer(ctx, \"feature_diameter_mm\") || \"not specified\") + \" mm\" },\n            { key: \"stage\", label: \"Condition stage\", value: String(getAnswer(ctx, \"condition_stage\") || \"not specified\") },\n            { key: \"entry\", label: \"Entry condition\", value: String(getAnswer(ctx, \"entry_condition\") || \"not specified\") },\n            { key: \"workpiece\", label: \"Workpiece condition\", value: String(getAnswer(ctx, \"workpiece_condition\") || \"not specified\") },\n          ]),\n          fitKpis([\n            { key: \"access\", label: \"Access fit\", value: (top.score.parts.access || 0).toFixed(2), status: (top.score.parts.access || 0) >= 1.1 ? \"good\" : \"ok\" },\n            { key: \"stage\", label: \"Stage fit\", value: (top.score.parts.stage || 0).toFixed(2), status: (top.score.parts.stage || 0) >= 0.8 ? \"good\" : \"ok\" },\n            { key: \"stability\", label: \"Stability\", value: (top.score.parts.stability || 0).toFixed(2), status: (top.score.parts.stability || 0) >= 0.75 ? \"good\" : \"weak\" },\n            { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.75 ? \"good\" : \"ok\" },\n          ]),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: [\n              { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n              { key: \"fn\", label: \"fn\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n            ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n          }),\n          riskNotes(riskItems),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative chamfering option\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust chamfer inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/chamfering/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"chamfering\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/chamfering/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function tokenScore(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"chamfering\", ctx, toolkits));\n      var workpieceCondition = getAnswer(ctx, \"workpiece_condition\");\n      var entryCondition = getAnswer(ctx, \"entry_condition\");\n    \n      derived.edge_case = workpieceCondition === \"thin_wall\"\n        ? \"thin_wall_edge\"\n        : workpieceCondition === \"interrupted\"\n          ? \"interrupted_edge\"\n          : \"standard_edge\";\n      derived.access_risk = workpieceCondition === \"thin_wall\" && entryCondition === \"angled\"\n        ? \"high\"\n        : workpieceCondition === \"interrupted\" || entryCondition === \"angled\"\n          ? \"medium\"\n          : \"low\";\n    \n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"chamfering\", ctx);\n      var conditionStage = getAnswer(ctx, \"condition_stage\");\n      var workpieceCondition = getAnswer(ctx, \"workpiece_condition\");\n    \n      if (conditionStage === \"roughing\" && workpieceCondition === \"thin_wall\") {\n        issues.push({\n          field: \"workpiece_condition\",\n          message: \"Thin-wall edges usually need a more controlled chamfering stage.\",\n          severity: \"warning\",\n          code: \"chamfering_thin_wall_warning\",\n        });\n      }\n    \n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"chamfering\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var drillingTools = toolkits.drilling;\n      var featureDiameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var conditionStage = getAnswer(ctx, \"condition_stage\");\n      var entryCondition = getAnswer(ctx, \"entry_condition\");\n      var workpieceCondition = getAnswer(ctx, \"workpiece_condition\");\n      var accessRisk = ctx.derived && ctx.derived.access_risk || \"medium\";\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = drillingTools.resolveRows(candidate, ctx);\n        var recipeResult = drillingTools.resolveRecipe(candidate, ctx);\n        var accessScore = accessRisk === \"low\" ? 1 : accessRisk === \"medium\" ? 0.65 : 0.25;\n        var stageFit = tokenScore(conditionStage, { roughing: 0.55, \"semi-finishing\": 0.8, finishing: 1 }, 0.7);\n        var chamferIntent = conditionStage === \"finishing\" ? 1 : conditionStage === \"semi-finishing\" ? 0.8 : 0.6;\n        var stabilityScore = tokenScore(workpieceCondition, { stable: 1, interrupted: 0.6, thin_wall: 0.35, unknown: 0.5 }, 0.5);\n        var diameterGate = featureDiameter != null && featureDiameter >= 3;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (!diameterGate) {\n          hardRejectReason = \"Feature diameter is too small for a stable chamfering recommendation.\";\n        }\n        if (!hardRejectReason && accessRisk === \"high\") {\n          hardRejectReason = \"Thin-wall angled entries are too collision-prone for this chamfering process.\";\n        }\n        if (!hardRejectReason && rows.length === 0) {\n          hardRejectReason = \"No drilling row is available for chamfering.\";\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          access: accessScore * 1.5,\n          stage: stageFit,\n          chamferIntent: chamferIntent,\n          stability: stabilityScore,\n          rowMatch: rows.length > 0 ? 1 : 0,\n          riskPenalty: -kernel.risk(candidate, ctx),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.9 : recipeResult.source === \"near\" ? 0.75 : 0.55;\n        if (hardRejectReason) confidence = 0;\n    \n        metrics = Object.assign({}, drillingTools.getSharedMetrics(candidate, ctx), {\n          featureDiameterMm: featureDiameter,\n          conditionStage: conditionStage,\n          entryCondition: entryCondition,\n          workpieceCondition: workpieceCondition,\n          accessRisk: accessRisk,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            accessScore >= 0.75 ? \"Access conditions support the requested chamfering path.\" : \"Access is possible but needs a conservative edge-break strategy.\",\n            stageFit >= 0.8 ? \"Stage selection matches the requested chamfering finish.\" : \"Stage fit is acceptable with tighter process control.\",\n            stabilityScore >= 0.75 ? \"Workpiece condition supports stable chamfering.\" : \"Workpiece condition is the main stability limit for this chamfer.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/copy-milling/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/copy-milling/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/copy-milling/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/copy-milling/presenter.js\");\n    exports.default = createStubProcessModule(\"copy_milling\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/copy-milling/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").replace(/-/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    function formatPriceLabel(priceCents) { return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(2); }\n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = String(item || \"\").replace(/\\s+/g, \" \").trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) { return item && item.score && item.score.eligible; }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative copy-milling option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        (metrics.centerContactRiskClass === \"high\" || metrics.centerContactRiskClass === \"critical\") ? { severity: \"warning\", title: \"Ball-nose center zone\", message: \"The current contact zone stays too close to the ball-nose center and needs tilt or a different finishing route.\" } : null,\n        metrics.steepWallRiskClass === \"high\" ? { severity: \"warning\", title: \"Steep-wall copying\", message: \"Steep walls amplify contact length and make traditional copy-style passes much less credible.\" } : null,\n        (metrics.toolpathQualityClass === \"traditional_copy\" || metrics.toolpathQualityClass === \"acceptable_copy\") ? { severity: \"warning\", title: \"Toolpath quality\", message: \"Traditional copy paths with many entries and exits are weaker than contouring or waterline-style strategies for this case.\" } : null,\n        metrics.stockConsistencyClass === \"poor\" ? { severity: \"warning\", title: \"Uneven stock\", message: \"The finish route is vulnerable because the previous operation is not leaving a constant stock condition.\" } : null,\n        metrics.barrelOpportunityClass === \"strong\" ? { severity: \"note\", title: \"Barrel opportunity\", message: \"A modern barrel or segment tool could reduce pass count and scallop height in this tilted finish case.\" } : null,\n      ].filter(Boolean).slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"reach\", label: \"Reach reserve\", result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"pass\" : \"fail\", note: \"Margin: \" + (formatDisplayNumber(metrics.reachMarginMm, 2) || \"n/a\") + \" mm.\" },\n        { key: \"apmx\", label: \"APMX reserve\", result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"pass\" : \"fail\", note: \"Margin: \" + (formatDisplayNumber(metrics.apmxMarginMm, 2) || \"n/a\") + \" mm.\" },\n        { key: \"tilt\", label: \"Tilt / point milling\", result: metrics.requestedTiltCapability === \"none\" ? \"limited\" : \"pass\", note: \"State: \" + (metrics.requestedTiltCapabilityLabel || \"Review\") + \".\" },\n        { key: \"toolpath\", label: \"Toolpath strategy\", result: metrics.toolpathQualityClass === \"traditional_copy\" ? \"limited\" : \"pass\", note: \"State: \" + (metrics.toolpathQualityLabel || \"Review\") + \".\" },\n      ];\n    }\n    \n    function buildFeatureItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"phase\", label: \"Operation phase\", value: metrics.requestedPhaseLabel || \"Review\" },\n        { key: \"surface\", label: \"Surface character\", value: metrics.requestedSurfaceCharacterLabel || \"Review\" },\n        { key: \"detail\", label: \"Smallest detail\", value: metrics.requestedMinDetailMm != null ? formatDisplayNumber(metrics.requestedMinDetailMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"depth\", label: \"Required depth\", value: metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"tilt\", label: \"Tilt capability\", value: metrics.requestedTiltCapabilityLabel || \"Review\" },\n        { key: \"quality\", label: \"Surface target\", value: metrics.requestedSurfaceQualityLabel || \"Review\" },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"detail\", label: \"Tool radius vs detail\", actual: metrics.candidateDetailRadiusMm != null ? formatDisplayNumber(metrics.candidateDetailRadiusMm, 2) + \" mm\" : null, target: metrics.requestedMinDetailMm != null ? formatDisplayNumber(metrics.requestedMinDetailMm, 2) + \" mm\" : null, result: metrics.detailFitClass === \"strong\" || metrics.detailFitClass === \"good\" ? \"fit\" : metrics.detailFitClass === \"conditional\" ? \"near\" : \"mismatch\" },\n        { key: \"reach\", label: \"Usable length vs depth\", actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null, target: metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm\" : null, result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\" },\n        { key: \"apmx\", label: \"APMX vs depth\", actual: metrics.candidateApmxMm != null ? formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm\" : null, target: metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm\" : null, result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"fit\" : \"mismatch\" },\n        { key: \"center\", label: \"Center-zone risk\", actual: metrics.centerContactRiskLabel || \"Review\", target: \"Avoid the tool center\", result: metrics.centerContactRiskClass === \"low\" ? \"fit\" : metrics.centerContactRiskClass === \"medium\" ? \"near\" : \"mismatch\" },\n      ];\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"copy_case\", label: \"Copy-milling case\", value: metrics.copySuitabilityLabel || \"Review\", status: metrics.copySuitabilityClass === \"strong_case\" ? \"good\" : metrics.copySuitabilityClass === \"valid_case\" ? \"ok\" : \"weak\" },\n        { key: \"detail\", label: \"Detail fit\", value: metrics.detailFitLabel || \"Review\", status: metrics.detailFitClass === \"strong\" || metrics.detailFitClass === \"good\" ? \"good\" : metrics.detailFitClass === \"conditional\" ? \"ok\" : \"weak\" },\n        { key: \"toolpath\", label: \"Toolpath\", value: metrics.toolpathQualityLabel || \"Review\", status: metrics.toolpathQualityClass === \"contouring\" || metrics.toolpathQualityClass === \"waterline\" || metrics.toolpathQualityClass === \"helical_contouring\" ? \"good\" : metrics.toolpathQualityClass === \"acceptable_copy\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatDisplayNumber(top.score.confidence, 2) || \"n/a\", status: top.score.confidence >= 0.82 ? \"good\" : top.score.confidence >= 0.65 ? \"ok\" : \"weak\" },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n      });\n      block.data.presentation = {\n        title: \"Start here\",\n        description: \"Copy milling needs more than vc and fz. Phase, toolpath quality, center-zone control and real effective diameter decide whether the release values stay credible.\",\n        rowBackedValues: [\n          { label: \"Phase\", value: metrics.requestedPhaseLabel || \"Review\", tone: \"text\" },\n          { label: \"Concept\", value: metrics.desiredConceptLabel || \"Review\", tone: \"text\" },\n          { label: \"Toolpath\", value: metrics.toolpathQualityLabel || \"Review\", tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"ap typ\", value: formatDisplayNumber(metrics.recipeApTyp, 2) || \"n/a\", unit: \"mm\" },\n          { label: \"ae typ\", value: formatDisplayNumber(metrics.estimatedAeMm, 2) || \"n/a\", unit: \"mm\" },\n        ],\n        machineValues: [\n          { label: \"D eff\", value: formatDisplayNumber(metrics.effectiveDiameterMm, 2) || \"n/a\", unit: \"mm\" },\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n          { label: \"Cusp\", value: formatDisplayNumber(metrics.cuspPredictionMm, 3) || \"n/a\", unit: \"mm\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n        ],\n        trustCard: {\n          title: \"3D-form credibility\",\n          tone: metrics.copySuitabilityClass === \"strong_case\" ? \"good\" : metrics.copySuitabilityClass === \"valid_case\" ? \"default\" : \"watch\",\n          badge: metrics.copySuitabilityLabel || \"Review\",\n          value: \"Effective diameter: \" + (metrics.effectiveDiameterLabel || \"Review\"),\n          note: \"Ball-nose copy milling should not be sold on nominal diameter alone. Effective cutting speed, tilt and toolpath quality all shift the real process window.\",\n          items: dedupeTextItems([\n            metrics.strategyWindowLabel ? \"Strategy window: \" + metrics.strategyWindowLabel + \".\" : null,\n            metrics.barrelOpportunityLabel && metrics.barrelOpportunityClass !== \"no\" ? \"Barrel opportunity: \" + metrics.barrelOpportunityLabel + \".\" : null,\n            metrics.superfinishSuitabilityLabel ? \"Superfinish route: \" + metrics.superfinishSuitabilityLabel + \".\" : null,\n          ]),\n        },\n      };\n      return block;\n    }\n    \n    function buildSetupBlock(top, riskItems) {\n      var metrics = top.metrics || {};\n      var block = setupNotes([\n        { area: \"concept\", message: \"Preferred concept: \" + (metrics.desiredConceptLabel || \"Review\") },\n        { area: \"toolpath\", message: \"Toolpath strategy: \" + (metrics.toolpathQualityLabel || \"Review\") },\n        { area: \"tilt\", message: \"Tilt capability: \" + (metrics.requestedTiltCapabilityLabel || \"Review\") },\n      ]);\n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Fit\",\n            highlight: \"This recommendation is driven mainly by the phase split, the smallest reachable form detail, the available reach, and whether the strategy can stay away from the ball-nose center.\",\n            items: dedupeTextItems([\n              metrics.phaseFitClass === \"strong\" || metrics.phaseFitClass === \"usable\" ? \"The tool family matches the requested copy-milling phase.\" : null,\n              metrics.detailFitClass === \"strong\" || metrics.detailFitClass === \"good\" ? \"The tool radius stays believable for the smallest stated 3D detail.\" : null,\n              metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"Usable length covers the requested reach.\" : null,\n            ]).slice(0, 3),\n          },\n          how: {\n            title: \"How to start\",\n            tone: \"default\",\n            badge: metrics.toolpathQualityLabel || \"Start\",\n            highlight: \"Treat the first release values as a process route, not just a spindle setting. Copy milling is only as good as the toolpath and the local contact zone.\",\n            items: dedupeTextItems([\n              \"Use the stated path style consistently instead of falling back to entry-heavy traditional copying.\",\n              metrics.pointMillingPossible ? \"Move the contact away from the tool center whenever the finish route allows tilt.\" : \"Without tilt, keep the center-zone risk visible and conservative.\",\n              metrics.cuspPredictionMm != null ? \"Use the estimated cusp as the first polishing and stepover sanity check.\" : \"Keep stepover conservative until the first surface comes back clean.\",\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: \"Copy milling gets fragile when steep walls, center contact, weak toolpaths and uneven stock stack up in the same route.\",\n            items: dedupeTextItems(riskItems.map(function mapRisk(item) { return item.title + \": \" + item.message; })).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"3D-form basis\",\n            tone: metrics.copySuitabilityClass === \"strong_case\" ? \"good\" : \"default\",\n            badge: metrics.copySuitabilityLabel || \"Review\",\n            value: \"The current case reads as \" + (metrics.requestedPhaseLabel || \"Review\") + \" on \" + (metrics.requestedSurfaceCharacterLabel || \"Review\") + \".\",\n            note: metrics.requestedSurfaceQualityLabel ? \"Surface target: \" + metrics.requestedSurfaceQualityLabel + \".\" : null,\n            items: dedupeTextItems([\n              metrics.desiredConceptLabel ? \"Preferred concept: \" + metrics.desiredConceptLabel + \".\" : null,\n              metrics.toolpathQualityLabel ? \"Toolpath: \" + metrics.toolpathQualityLabel + \".\" : null,\n              metrics.requestedStockConsistencyLabel ? \"Stock consistency: \" + metrics.requestedStockConsistencyLabel + \".\" : null,\n            ]),\n          },\n          {\n            title: \"Center zone and scallop\",\n            tone: metrics.centerContactRiskClass === \"high\" || metrics.centerContactRiskClass === \"critical\" ? \"watch\" : \"default\",\n            badge: metrics.centerContactRiskLabel || \"Review\",\n            value: \"Ball-nose work should be judged on the local contact zone and the effective cutting diameter, not just on nominal tool size.\",\n            note: metrics.effectiveDiameterMm != null ? \"Effective diameter: \" + formatDisplayNumber(metrics.effectiveDiameterMm, 2) + \" mm.\" : null,\n            items: dedupeTextItems([\n              metrics.cuspPredictionMm != null ? \"Estimated cusp: \" + formatDisplayNumber(metrics.cuspPredictionMm, 3) + \" mm.\" : null,\n              metrics.requestedTargetCuspMm != null ? \"Target cusp: \" + formatDisplayNumber(metrics.requestedTargetCuspMm, 3) + \" mm.\" : null,\n              metrics.requestedTiltCapabilityLabel ? \"Tilt: \" + metrics.requestedTiltCapabilityLabel + \".\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Center-cutting marks\",\n            tone: metrics.centerContactRiskClass === \"critical\" ? \"high\" : \"default\",\n            category: \"Surface quality\",\n            cause: \"If the ball-nose center remains in the contact patch, cutting speed collapses and the surface turns into rubbing rather than controlled cutting.\",\n            actions: dedupeTextItems([\n              \"Add tilt or move the toolpath so the center is no longer the dominant contact zone.\",\n              \"Reduce stepover first before increasing speed if the bottom or transition surface starts to smear.\",\n              \"Use a stronger finish concept than roughing-style radius or round-insert logic.\",\n            ]),\n          },\n          {\n            title: \"Steep-wall instability\",\n            tone: metrics.steepWallRiskClass === \"high\" ? \"watch\" : \"default\",\n            category: \"Wall contact\",\n            cause: \"Traditional copy paths on steep walls increase contact length, entry shocks and form error risk.\",\n            actions: dedupeTextItems([\n              \"Prefer contouring or waterline-style strategies over classic copy passes on steep walls.\",\n              \"Shorten the effective tool projection if the wall route starts to vibrate.\",\n              \"Keep finish stock constant before the final 3D pass.\",\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var riskItems;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"copy_milling\",\n          outcome: \"no_match\",\n          summary: \"No credible copy-milling result was found for the current 3D-form inputs.\",\n          heroVariantId: null,\n          blocks: [\n            warning({\n              message: top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current copy-milling combination is not credible yet.\",\n            }),\n            noMatchGuidance({\n              message: \"Review the phase split, the smallest 3D detail, the required reach and whether the toolpath can avoid the ball-nose center.\",\n              paragraphs: [\n                \"Finish-critical copy milling usually needs a cleaner ball-nose concept than roughing or round-insert logic.\",\n                \"Steep walls and traditional copy paths should not be combined casually.\",\n                \"If tilt is available, use it to move the cut away from the center zone.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust copy-milling inputs\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      riskItems = buildRiskItems(top);\n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best copy-milling fit for \" + (metrics.requestedMinDetailMm != null ? formatDisplayNumber(metrics.requestedMinDetailMm, 2) + \" mm detail\" : \"the stated 3D form\") + \" and \" + (metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm reach\" : \"the stated depth\") + \".\",\n        headerPills: [\n          { tone: metrics.copySuitabilityClass === \"strong_case\" ? \"good\" : metrics.copySuitabilityClass === \"valid_case\" ? \"default\" : \"watch\", text: \"Case: \" + (metrics.copySuitabilityLabel || \"Review\") },\n          { tone: metrics.toolConceptFitClass === \"strong\" ? \"good\" : metrics.toolConceptFitClass === \"usable\" ? \"default\" : \"watch\", text: \"Concept: \" + (metrics.desiredConceptLabel || \"Review\") },\n          { tone: metrics.centerContactRiskClass === \"low\" ? \"good\" : metrics.centerContactRiskClass === \"medium\" ? \"default\" : \"watch\", text: \"Center zone: \" + (metrics.centerContactRiskLabel || \"Review\") },\n          { tone: metrics.toolpathQualityClass === \"contouring\" || metrics.toolpathQualityClass === \"waterline\" || metrics.toolpathQualityClass === \"helical_contouring\" ? \"good\" : metrics.toolpathQualityClass === \"acceptable_copy\" ? \"default\" : \"watch\", text: \"Path: \" + (metrics.toolpathQualityLabel || \"Review\") },\n        ],\n      };\n    \n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine and strategy fit\",\n          tone: metrics.strategyWindowClass === \"strong\" ? \"good\" : \"default\",\n          badge: metrics.strategyWindowLabel || \"Review\",\n          value: \"Tilt: \" + (metrics.requestedTiltCapabilityLabel || \"Review\"),\n          note: \"Copy milling behaves like a process chain. Reach, tilt, effective diameter and the quality of the programmed path matter more than a single release number.\",\n          items: dedupeTextItems([\n            metrics.effectiveDiameterLabel ? \"Effective diameter: \" + metrics.effectiveDiameterLabel + \".\" : null,\n            metrics.requestedToolpathStrategyLabel ? \"Toolpath: \" + metrics.requestedToolpathStrategyLabel + \".\" : null,\n            metrics.requestedStockConsistencyLabel ? \"Stock consistency: \" + metrics.requestedStockConsistencyLabel + \".\" : null,\n          ]),\n        },\n      };\n    \n      return createResultViewModel({\n        processId: \"copy_milling\",\n        outcome: top.score.total >= 8 ? \"match\" : \"limited_match\",\n        summary: \"Best copy-milling result based on process phase, 3D-detail fit, center-zone control, reach reserve and the credibility of the stated toolpath strategy.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          buildMillingBundleRecommendation(candidate),\n          featureSummary(buildFeatureItems(top)),\n          geometryFit(buildGeometryItems(top)),\n          fitKpis(buildFitItems(top)),\n          recipeBlock,\n          machineBlock,\n          buildSetupBlock(top, riskItems),\n          riskNotes(riskItems),\n          alternatives(buildAlternativeItems(scored)),\n          commerceCta(Object.assign({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }, buildMillingCompositeCommerceData(candidate) || {})),\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust copy-milling inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/copy-milling/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"copy_milling\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/copy-milling/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) { return Math.max(min, Math.min(max, value)); }\n    function avg(values) {\n      var filtered = (values || []).filter(function keep(value) { return value != null && Number.isFinite(value); });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) { return total + value; }, 0) / filtered.length;\n    }\n    function sumParts(parts) { return Object.keys(parts || {}).reduce(function sum(total, key) { return total + (Number(parts[key]) || 0); }, 0); }\n    function scoreToken(value, map, fallback) { return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback); }\n    function label(value, map, fallback) { return map[value] || fallback || \"Review\"; }\n    \n    var PHASE_LABELS = { roughing_semiroughing: \"Roughing / semi-roughing\", semi_finishing: \"Semi-finishing\", finishing_superfinishing: \"Finishing / super-finishing\" };\n    var SURFACE_LABELS = { steep_walls: \"Steep walls\", shallow_freeform: \"Shallow freeform\", floor_transition_radii: \"Floor / transition radii\", mixed_3d_form: \"Mixed 3D form\" };\n    var TILT_LABELS = { none: \"No tilt\", limited_tilt: \"3+2 / limited tilt\", continuous_tilt: \"Continuous 5-axis tilt\" };\n    var QUALITY_LABELS = { functional: \"Functional\", polishable: \"Polishable\", finish_critical: \"Finish-critical\" };\n    var TOOLPATH_LABELS = { traditional_copy: \"Traditional copy\", acceptable_copy: \"Acceptable copy\", contouring: \"Contouring\", waterline: \"Waterline / Z-constant\", helical_contouring: \"Helical contouring\", unknown: \"Unknown\" };\n    var STOCK_LABELS = { good: \"Good / constant\", acceptable: \"Acceptable\", poor: \"Poor / uneven\", unknown: \"Unknown\" };\n    var CONCEPT_LABELS = { round_insert: \"Round insert\", indexable_ball: \"Indexable ball nose\", exchangeable_ball: \"Exchangeable ball nose\", solid_ball: \"Solid ball nose\", barrel_future_case: \"Barrel / segment\", uncertain: \"Review\", either: \"Either\" };\n    var FIT_LABELS = { strong: \"Strong\", good: \"Good\", conditional: \"Conditional\", poor: \"Poor\", unknown: \"Unknown\" };\n    var RISK_LABELS = { low: \"Low\", medium: \"Medium\", high: \"High\", critical: \"Critical\" };\n    var EFFECTIVE_LABELS = { nominal_ok: \"Nominal OK\", effective_diameter_mandatory: \"Use effective diameter\", critical_center_zone: \"Critical center zone\", unknown: \"Unknown\" };\n    var SUITABILITY_LABELS = { strong_case: \"Strong case\", valid_case: \"Valid case\", weak_case: \"Weak case\", not_credible: \"Not credible\" };\n    var SIMPLE_LABELS = { no: \"No\", possible: \"Possible\", strong: \"Strong\", usable: \"Usable\", limited: \"Limited\" };\n    \n    function normalizeConceptPreference(value) {\n      if (value === \"round_insert_only\") return \"round_insert\";\n      if (value === \"indexable_ball_only\") return \"indexable_ball\";\n      if (value === \"exchangeable_ball_only\") return \"exchangeable_ball\";\n      if (value === \"solid_ball_only\") return \"solid_ball\";\n      return \"either\";\n    }\n    \n    function isBallConcept(value) {\n      return value === \"indexable_ball\" || value === \"exchangeable_ball\" || value === \"solid_ball\";\n    }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var cornerRadius = toNullableNumber(candidate.milling && candidate.milling.cornerRadiusMm);\n      var helix = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neck = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var text = [candidate.catalog && candidate.catalog.productTitle, candidate.catalog && candidate.catalog.variantTitle, candidate.ids && candidate.ids.sku].join(\" \").toLowerCase();\n    \n      if (text.indexOf(\"barrel\") >= 0 || text.indexOf(\"segment\") >= 0 || text.indexOf(\"lens\") >= 0) return \"barrel_future_case\";\n      if ((text.indexOf(\"ball\") >= 0 || text.indexOf(\"ball nose\") >= 0 || text.indexOf(\"ballnose\") >= 0 || text.indexOf(\"sphere\") >= 0) && (text.indexOf(\"head\") >= 0 || text.indexOf(\"exchangeable\") >= 0 || text.indexOf(\"multi-master\") >= 0 || text.indexOf(\"multimaster\") >= 0)) return \"exchangeable_ball\";\n      if ((text.indexOf(\"ball\") >= 0 || text.indexOf(\"ball nose\") >= 0 || text.indexOf(\"ballnose\") >= 0 || text.indexOf(\"sphere\") >= 0) && (text.indexOf(\"indexable\") >= 0 || text.indexOf(\"cutter\") >= 0 || text.indexOf(\"body\") >= 0 || text.indexOf(\"mill\") >= 0)) return \"indexable_ball\";\n      if (text.indexOf(\"round insert\") >= 0 || text.indexOf(\"copy mill\") >= 0 || text.indexOf(\"round\") >= 0 || text.indexOf(\"radius\") >= 0) return \"round_insert\";\n      if (text.indexOf(\"solid\") >= 0 || text.indexOf(\"end mill\") >= 0 || text.indexOf(\"plura\") >= 0) return \"solid_ball\";\n      if (diameter != null && diameter <= 16 && helix != null && helix >= 25) return \"solid_ball\";\n      if (diameter != null && diameter >= 25 && (!neck || neck >= diameter * 0.8)) return \"round_insert\";\n      if (cornerRadius != null && diameter != null && Math.abs(cornerRadius - (diameter / 2)) <= 0.2) return diameter <= 20 ? \"solid_ball\" : \"indexable_ball\";\n      return \"uncertain\";\n    }\n    \n    function inferToolRadius(candidateConcept, diameter, cornerRadius) {\n      if (cornerRadius != null && cornerRadius > 0) return cornerRadius;\n      if (diameter == null) return null;\n      return diameter / 2;\n    }\n    \n    function deriveDesiredConcept(explicitConcept, phase, minDetail, requiredDepth, surfaceQuality, tiltClass) {\n      if (explicitConcept !== \"either\") return explicitConcept;\n      if (phase === \"roughing_semiroughing\") return \"round_insert\";\n      if (phase === \"semi_finishing\") {\n        if (minDetail != null && minDetail <= 2.5) return \"solid_ball\";\n        if (requiredDepth != null && requiredDepth > 35) return \"exchangeable_ball\";\n        if (surfaceQuality === \"polishable\" || surfaceQuality === \"finish_critical\") return tiltClass === \"continuous_tilt\" ? \"exchangeable_ball\" : \"solid_ball\";\n        return \"indexable_ball\";\n      }\n      return requiredDepth != null && requiredDepth > 35 && minDetail != null && minDetail >= 3.5 ? \"exchangeable_ball\" : \"solid_ball\";\n    }\n    \n    function conceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var target = explicitConcept !== \"either\" ? explicitConcept : desiredConcept;\n      var score = 0.24;\n      if (target === \"either\" || candidateConcept === \"uncertain\") score = 0.76;\n      else if (candidateConcept === target) score = 1;\n      else if (target === \"solid_ball\" && candidateConcept === \"exchangeable_ball\") score = 0.88;\n      else if (target === \"exchangeable_ball\" && candidateConcept === \"solid_ball\") score = 0.86;\n      else if (target === \"indexable_ball\" && (candidateConcept === \"exchangeable_ball\" || candidateConcept === \"solid_ball\")) score = 0.74;\n      else if (target === \"round_insert\" && candidateConcept === \"indexable_ball\") score = 0.68;\n      else if ((target === \"solid_ball\" || target === \"exchangeable_ball\") && candidateConcept === \"indexable_ball\") score = 0.62;\n      else if (target === \"round_insert\" && (candidateConcept === \"exchangeable_ball\" || candidateConcept === \"solid_ball\")) score = 0.44;\n      return { score: score, className: score >= 0.9 ? \"strong\" : score >= 0.72 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\" };\n    }\n    \n    function phaseFit(phase, candidateConcept, surfaceQuality, tiltClass) {\n      var score = 0.4;\n      if (phase === \"roughing_semiroughing\") score = scoreToken(candidateConcept, { round_insert: 1, indexable_ball: 0.68, exchangeable_ball: 0.52, solid_ball: 0.46, barrel_future_case: 0.24, uncertain: 0.4 }, 0.4);\n      else if (phase === \"semi_finishing\") score = scoreToken(candidateConcept, { round_insert: 0.62, indexable_ball: 0.88, exchangeable_ball: 0.94, solid_ball: 0.84, barrel_future_case: tiltClass === \"continuous_tilt\" ? 0.86 : 0.7, uncertain: 0.56 }, 0.56);\n      else score = scoreToken(candidateConcept, { round_insert: 0.18, indexable_ball: 0.68, exchangeable_ball: 0.92, solid_ball: 1, barrel_future_case: tiltClass === \"continuous_tilt\" ? 0.96 : 0.72, uncertain: 0.48 }, 0.48);\n      if (surfaceQuality !== \"functional\" && candidateConcept === \"round_insert\") score = clamp(score - 0.08, 0, 1);\n      return { score: score, className: score >= 0.9 ? \"strong\" : score >= 0.72 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\" };\n    }\n    \n    function detailFit(requiredDetail, candidateConcept, diameter, cornerRadius, phase, surfaceQuality) {\n      var toolRadius = inferToolRadius(candidateConcept, diameter, cornerRadius);\n      var ratio;\n      var score;\n      var className;\n      var hardFail = false;\n      if (requiredDetail == null) return { score: 0.5, className: \"unknown\", hardFail: false, toolRadius: toolRadius, label: label(\"unknown\", FIT_LABELS) };\n      if (toolRadius == null) return { score: 0.42, className: \"unknown\", hardFail: false, toolRadius: toolRadius, label: label(\"unknown\", FIT_LABELS) };\n      ratio = toolRadius / requiredDetail;\n      if (ratio <= 1) { score = 1; className = \"strong\"; }\n      else if (ratio <= 1.15) { score = 0.9; className = \"good\"; }\n      else if (ratio <= 1.35) { score = 0.68; className = \"conditional\"; }\n      else if (ratio <= 1.6) { score = 0.42; className = \"poor\"; hardFail = phase !== \"roughing_semiroughing\" || surfaceQuality !== \"functional\"; }\n      else { score = 0.12; className = \"poor\"; hardFail = true; }\n      return { score: score, className: className, hardFail: hardFail, toolRadius: toolRadius, label: label(className, FIT_LABELS) };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 8) return 1;\n      if (margin >= 4) return 0.9;\n      if (margin >= 1) return 0.76;\n      if (margin >= 0) return 0.62;\n      if (margin >= -1) return 0.18;\n      return 0;\n    }\n    \n    function materialSeverity(ctx, materialCondition) {\n      var materialCode = String(ctx && ctx.materialCode || \"\").toUpperCase();\n      var base = scoreToken(materialCode.charAt(0), { P: 0.24, M: 0.52, K: 0.18, N: 0.24, S: 0.76, H: 0.62 }, 0.3);\n      var score = clamp(base + scoreToken(materialCondition, { standard: 0, tough_long_chipping: 0.1, sticky_bue: 0.08, work_hardening: 0.18, hard_abrasive: 0.16, unknown: 0.06 }, 0.06), 0, 1);\n      return { score: score, className: score >= 0.74 ? \"severe\" : score >= 0.52 ? \"difficult\" : score >= 0.3 ? \"normal\" : \"easy\" };\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"copy_milling\", ctx, toolkits));\n      var featureDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var minDetail = toNullableNumber(getAnswer(ctx, \"copy_min_detail_mm\"));\n      var tilt = getAnswer(ctx, \"copy_tilt_capability\");\n      if (featureDepth != null && minDetail != null && minDetail > 0) derived.copy_depth_to_detail_ratio = featureDepth / minDetail;\n      derived.copy_point_milling_possible = tilt === \"limited_tilt\" || tilt === \"continuous_tilt\";\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"copy_milling\", ctx);\n      var phase = getAnswer(ctx, \"copy_operation_phase\");\n      var surfaceCharacter = getAnswer(ctx, \"copy_surface_character\");\n      var tilt = getAnswer(ctx, \"copy_tilt_capability\");\n      var quality = getAnswer(ctx, \"copy_surface_quality_target\");\n      var stock = getAnswer(ctx, \"copy_stock_consistency_class\");\n      var toolpath = getAnswer(ctx, \"copy_toolpath_strategy\");\n      if (phase === \"finishing_superfinishing\" && tilt === \"none\" && (surfaceCharacter === \"floor_transition_radii\" || surfaceCharacter === \"shallow_freeform\" || quality === \"finish_critical\")) issues.push({ field: \"copy_tilt_capability\", message: \"Ball-nose finishing without tilt keeps the tool center in play and should be reviewed carefully.\", severity: \"warning\", code: \"copy_center_zone_warning\" });\n      if (surfaceCharacter === \"steep_walls\" && toolpath === \"traditional_copy\") issues.push({ field: \"copy_toolpath_strategy\", message: \"Traditional copy paths along steep walls are risk-prone and should be replaced by contouring or waterline if possible.\", severity: \"warning\", code: \"copy_steep_wall_toolpath\" });\n      if ((quality === \"polishable\" || quality === \"finish_critical\") && stock === \"poor\") issues.push({ field: \"copy_stock_consistency_class\", message: \"Uneven stock from the previous operation will destabilize finish-critical copy milling.\", severity: \"warning\", code: \"copy_stock_consistency_warning\" });\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"copy_milling\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var phase = getAnswer(ctx, \"copy_operation_phase\");\n      var surfaceCharacter = getAnswer(ctx, \"copy_surface_character\");\n      var minDetail = toNullableNumber(getAnswer(ctx, \"copy_min_detail_mm\"));\n      var requiredDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var tiltValue = getAnswer(ctx, \"copy_tilt_capability\");\n      var surfaceQuality = getAnswer(ctx, \"copy_surface_quality_target\");\n      var priority = getAnswer(ctx, \"priority\");\n      var explicitConcept = normalizeConceptPreference(getAnswer(ctx, \"copy_tool_concept_preference\"));\n      var barrelAllowed = getAnswer(ctx, \"copy_tool_concept_preference\") === \"barrel_or_segment_allowed\";\n      var tiltScore = scoreToken(tiltValue, { none: 0.28, limited_tilt: 0.72, continuous_tilt: 1 }, 0.5);\n      var toolpathValue = getAnswer(ctx, \"copy_toolpath_strategy\");\n      var toolpathScore = scoreToken(toolpathValue, { traditional_copy: 0.28, acceptable_copy: 0.56, contouring: 0.9, waterline: 0.94, helical_contouring: 1, unknown: 0.62 }, 0.62);\n      var stockValue = getAnswer(ctx, \"copy_stock_consistency_class\");\n      var stockScore = scoreToken(stockValue, { good: 1, acceptable: 0.76, poor: 0.3, unknown: 0.56 }, 0.56);\n      var materialSeverityValue = materialSeverity(ctx, getAnswer(ctx, \"material_condition_class\"));\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var usableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var apmx = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var fluteCount = getCandidateFluteCount(candidate);\n        var cornerRadius = toNullableNumber(candidate.milling && candidate.milling.cornerRadiusMm);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var desiredConcept = deriveDesiredConcept(explicitConcept, phase, minDetail, requiredDepth, surfaceQuality, tiltValue);\n        var phaseSuitability = phaseFit(phase, candidateConcept, surfaceQuality, tiltValue);\n        var detail = detailFit(minDetail, candidateConcept, diameter, cornerRadius, phase, surfaceQuality);\n        var concept = conceptFit(candidateConcept, desiredConcept, explicitConcept);\n        var reachMargin = usableLength != null && requiredDepth != null ? usableLength - requiredDepth : null;\n        var apmxMargin = apmx != null && requiredDepth != null ? apmx - requiredDepth : null;\n        var centerRiskValue = clamp((isBallConcept(candidateConcept) ? 0.14 : 0.02) + scoreToken(phase, { roughing_semiroughing: 0.06, semi_finishing: 0.14, finishing_superfinishing: 0.22 }, 0.1) + scoreToken(surfaceQuality, { functional: 0, polishable: 0.1, finish_critical: 0.18 }, 0.08) + scoreToken(surfaceCharacter, { steep_walls: 0.08, shallow_freeform: 0.24, floor_transition_radii: 0.32, mixed_3d_form: 0.18 }, 0.12) + scoreToken(tiltValue, { none: 0.28, limited_tilt: 0.12, continuous_tilt: -0.08 }, 0.1), 0, 1);\n        var centerRiskClass = centerRiskValue >= 0.8 ? \"critical\" : centerRiskValue >= 0.58 ? \"high\" : centerRiskValue >= 0.34 ? \"medium\" : \"low\";\n        var steepWallRiskValue = clamp((surfaceCharacter === \"steep_walls\" ? 0.48 : surfaceCharacter === \"mixed_3d_form\" ? 0.22 : 0.08) + scoreToken(toolpathValue, { traditional_copy: 0.32, acceptable_copy: 0.16, contouring: -0.08, waterline: -0.06, helical_contouring: -0.1, unknown: 0.06 }, 0.06) + ((requiredDepth != null && diameter != null && diameter > 0 && (requiredDepth / diameter) >= 3) ? 0.16 : (requiredDepth != null && diameter != null && diameter > 0 && (requiredDepth / diameter) >= 2) ? 0.08 : 0), 0, 1);\n        var steepWallRiskClass = steepWallRiskValue >= 0.62 ? \"high\" : steepWallRiskValue >= 0.34 ? \"medium\" : \"low\";\n        var pathInstabilityValue = clamp(scoreToken(toolpathValue, { traditional_copy: 0.56, acceptable_copy: 0.34, contouring: 0.1, waterline: 0.08, helical_contouring: 0.06, unknown: 0.18 }, 0.18) + scoreToken(stockValue, { good: 0, acceptable: 0.1, poor: 0.22, unknown: 0.08 }, 0.08) + scoreToken(steepWallRiskClass, { low: 0, medium: 0.08, high: 0.16 }, 0.04), 0, 1);\n        var pathInstabilityClass = pathInstabilityValue >= 0.64 ? \"high\" : pathInstabilityValue >= 0.34 ? \"medium\" : \"low\";\n        var localAp = toNullableNumber(recipeResult.recipe && recipeResult.recipe.ap && recipeResult.recipe.ap.typ) || toNullableNumber(recipeResult.recipe && recipeResult.recipe.ap && recipeResult.recipe.ap.max) || null;\n        var toolRadius = detail.toolRadius;\n        var effectiveDiameterMm = diameter;\n        var effectiveDiameterClass = \"nominal_ok\";\n        var aePctTyp = toNullableNumber(recipeResult.recipe && recipeResult.recipe.aePct && recipeResult.recipe.aePct.typ);\n        var cuspPredictionMm = null;\n        var estimatedAeMm = diameter != null && aePctTyp != null ? diameter * (aePctTyp / 100) : null;\n        var cuspPredictionClass = \"unknown\";\n        var barrelOpportunityClass = \"no\";\n        var strategyWindowScore;\n        var strategyWindowClass;\n        var superfinishScore;\n        var superfinishClass;\n        var surfaceFitScore;\n        var surfaceFitClass;\n        var suitabilityScore;\n        var suitabilityClass;\n        var vcTyp = toNullableNumber(recipeResult.recipe && recipeResult.recipe.vc && recipeResult.recipe.vc.typ);\n        var fzTyp = toNullableNumber(recipeResult.recipe && recipeResult.recipe.fz && recipeResult.recipe.fz.typ);\n        var rpm;\n        var feed;\n        var mrr;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (isBallConcept(candidateConcept) && diameter != null) {\n          localAp = localAp != null ? clamp(localAp, 0.1, Math.max(diameter - 0.05, 0.1)) : Math.max(diameter * 0.08, 0.2);\n          effectiveDiameterMm = 2 * Math.sqrt(Math.max(localAp * Math.max(diameter - localAp, 0), 0));\n          if (tiltValue === \"limited_tilt\") effectiveDiameterMm = Math.max(effectiveDiameterMm, diameter * 0.45);\n          if (tiltValue === \"continuous_tilt\") effectiveDiameterMm = Math.max(effectiveDiameterMm, diameter * 0.65);\n          effectiveDiameterClass = tiltValue === \"none\" && (surfaceCharacter === \"floor_transition_radii\" || surfaceCharacter === \"shallow_freeform\") ? \"critical_center_zone\" : \"effective_diameter_mandatory\";\n        }\n        if ((isBallConcept(candidateConcept) || candidateConcept === \"barrel_future_case\") && toolRadius != null && estimatedAeMm != null && (estimatedAeMm / 2) <= toolRadius) {\n          cuspPredictionMm = toolRadius - Math.sqrt(Math.max((toolRadius * toolRadius) - Math.pow(estimatedAeMm / 2, 2), 0));\n          cuspPredictionClass = cuspPredictionMm <= 0.02 ? \"good\" : cuspPredictionMm <= 0.05 ? \"usable\" : \"coarse\";\n          if (toNullableNumber(getAnswer(ctx, \"copy_target_cusp_mm\")) != null) cuspPredictionClass = cuspPredictionMm <= Number(getAnswer(ctx, \"copy_target_cusp_mm\")) ? \"good\" : cuspPredictionMm <= Number(getAnswer(ctx, \"copy_target_cusp_mm\")) * 1.35 ? \"near\" : \"over\";\n        }\n        if (barrelAllowed && phase === \"finishing_superfinishing\" && tiltValue === \"continuous_tilt\" && (surfaceQuality === \"polishable\" || surfaceQuality === \"finish_critical\") && minDetail != null && minDetail >= 3 && surfaceCharacter !== \"steep_walls\") barrelOpportunityClass = \"strong\";\n        else if (barrelAllowed && (phase === \"semi_finishing\" || phase === \"finishing_superfinishing\") && (tiltValue === \"limited_tilt\" || tiltValue === \"continuous_tilt\") && minDetail != null && minDetail >= 4) barrelOpportunityClass = \"possible\";\n    \n        strategyWindowScore = avg([tiltScore, toolpathScore, stockScore, clamp(1 - centerRiskValue * 0.9, 0, 1), clamp(1 - pathInstabilityValue, 0, 1)]);\n        strategyWindowClass = strategyWindowScore >= 0.82 ? \"strong\" : strategyWindowScore >= 0.62 ? \"usable\" : \"limited\";\n        superfinishScore = clamp((phase === \"finishing_superfinishing\" ? 0.3 : 0) + (surfaceQuality === \"polishable\" ? 0.16 : surfaceQuality === \"finish_critical\" ? 0.24 : 0) + (tiltValue === \"limited_tilt\" ? 0.12 : tiltValue === \"continuous_tilt\" ? 0.24 : 0) + ((candidateConcept === \"solid_ball\" || candidateConcept === \"exchangeable_ball\") ? 0.16 : 0) + (fluteCount != null && fluteCount <= 2 ? 0.08 : 0), 0, 1);\n        superfinishClass = superfinishScore >= 0.76 ? \"strong\" : superfinishScore >= 0.5 ? \"possible\" : \"no\";\n        surfaceFitScore = surfaceQuality === \"functional\"\n          ? scoreToken(candidateConcept, { round_insert: 0.9, indexable_ball: 0.88, exchangeable_ball: 0.84, solid_ball: 0.82, barrel_future_case: 0.8, uncertain: 0.64 }, 0.64)\n          : surfaceQuality === \"polishable\"\n            ? scoreToken(candidateConcept, { round_insert: 0.34, indexable_ball: 0.66, exchangeable_ball: 0.88, solid_ball: 0.94, barrel_future_case: 1, uncertain: 0.54 }, 0.54)\n            : scoreToken(candidateConcept, { round_insert: 0.16, indexable_ball: 0.48, exchangeable_ball: 0.84, solid_ball: 0.98, barrel_future_case: 1, uncertain: 0.42 }, 0.42);\n        if (phase === \"roughing_semiroughing\" && surfaceQuality !== \"functional\") surfaceFitScore = clamp(surfaceFitScore - 0.18, 0, 1);\n        if (cuspPredictionClass === \"over\") surfaceFitScore = clamp(surfaceFitScore - 0.18, 0, 1);\n        if (cuspPredictionClass === \"near\") surfaceFitScore = clamp(surfaceFitScore - 0.08, 0, 1);\n        surfaceFitClass = surfaceFitScore >= 0.9 ? \"strong\" : surfaceFitScore >= 0.7 ? \"usable\" : surfaceFitScore >= 0.45 ? \"conditional\" : \"poor\";\n        suitabilityScore = clamp(0.08 + phaseSuitability.score * 0.16 + detail.score * 0.18 + marginScore(reachMargin) * 0.1 + marginScore(apmxMargin) * 0.08 + concept.score * 0.12 + clamp(1 - centerRiskValue * 0.9, 0, 1) * 0.12 + toolpathScore * 0.12 + stockScore * 0.08 + surfaceFitScore * 0.1 + strategyWindowScore * 0.08 - pathInstabilityValue * 0.08 - steepWallRiskValue * 0.06, 0, 1);\n        suitabilityClass = suitabilityScore >= 0.8 ? \"strong_case\" : suitabilityScore >= 0.62 ? \"valid_case\" : suitabilityScore >= 0.42 ? \"weak_case\" : \"not_credible\";\n        rpm = effectiveDiameterMm != null && effectiveDiameterMm > 0 && vcTyp != null ? (1000 * vcTyp) / (Math.PI * effectiveDiameterMm) : null;\n        feed = rpm != null && fzTyp != null && fluteCount != null ? rpm * fzTyp * fluteCount : null;\n        mrr = localAp != null && estimatedAeMm != null && feed != null ? (localAp * estimatedAeMm * feed) / 1000 : null;\n    \n        if (rows.length === 0) hardRejectReason = \"No milling row is available for copy milling.\";\n        if (!hardRejectReason && detail.hardFail) hardRejectReason = \"Tool detail radius is not credible for the smallest stated 3D-form detail.\";\n        if (!hardRejectReason && reachMargin != null && reachMargin < 0) hardRejectReason = \"Usable length does not cover the requested copy-milling depth.\";\n        if (!hardRejectReason && apmxMargin != null && apmxMargin < 0) hardRejectReason = \"APMX does not cover the requested copy-milling depth.\";\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.05,\n          process: kernel.processFit(candidate, ctx) * 1.1,\n          phase: phaseSuitability.score * 1.4,\n          detail: detail.score * 1.85,\n          reach: marginScore(reachMargin) * 1.05,\n          apmx: marginScore(apmxMargin) * 0.95,\n          toolConcept: concept.score * 1.2,\n          centerZone: clamp(1 - centerRiskValue * 0.9, 0, 1) * 1.3,\n          steepWall: clamp(1 - steepWallRiskValue * 0.86, 0, 1) * 0.95,\n          toolpath: toolpathScore * 1.2,\n          stock: stockScore * 0.85,\n          surfaceQuality: surfaceFitScore * 1.05,\n          strategy: strategyWindowScore * 1.05,\n          priorityBias: clamp(scoreToken(priority, { safety: 0.18, balanced: 0.12, productivity: 0.16 }, 0.12) + (priority === \"productivity\" && (toolpathValue === \"contouring\" || toolpathValue === \"waterline\" || toolpathValue === \"helical_contouring\") ? 0.06 : 0) + (priority === \"productivity\" && barrelOpportunityClass === \"strong\" ? 0.04 : 0) + (priority === \"safety\" && phase === \"finishing_superfinishing\" ? 0.05 : 0), 0, 0.28),\n          riskPenalty: -(pathInstabilityValue * 0.42 + centerRiskValue * 0.18 + steepWallRiskValue * 0.12),\n        };\n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.94 : recipeResult.source === \"near\" ? 0.82 : recipeResult.source === \"estimated\" ? 0.68 : 0.5;\n        confidence = clamp(confidence - pathInstabilityValue * 0.1 + strategyWindowScore * 0.04, 0, 1);\n        if (hardRejectReason) confidence = 0;\n    \n        metrics = Object.assign({}, millingTools.getSharedMetrics(candidate, ctx), {\n          requestedPhase: phase,\n          requestedPhaseLabel: label(phase, PHASE_LABELS, \"Review\"),\n          requestedSurfaceCharacter: surfaceCharacter,\n          requestedSurfaceCharacterLabel: label(surfaceCharacter, SURFACE_LABELS, \"Review\"),\n          requestedMinDetailMm: minDetail,\n          requestedDepthMm: requiredDepth,\n          requestedTiltCapability: tiltValue,\n          requestedTiltCapabilityLabel: label(tiltValue, TILT_LABELS, \"Review\"),\n          requestedSurfaceQuality: surfaceQuality,\n          requestedSurfaceQualityLabel: label(surfaceQuality, QUALITY_LABELS, \"Review\"),\n          requestedToolpathStrategy: toolpathValue,\n          requestedToolpathStrategyLabel: label(toolpathValue, TOOLPATH_LABELS, \"Review\"),\n          requestedStockConsistencyClass: stockValue || \"unknown\",\n          requestedStockConsistencyLabel: label(stockValue || \"unknown\", STOCK_LABELS, \"Review\"),\n          requestedTargetCuspMm: toNullableNumber(getAnswer(ctx, \"copy_target_cusp_mm\")),\n          candidateConcept: candidateConcept,\n          candidateConceptLabel: label(candidateConcept, CONCEPT_LABELS, \"Review\"),\n          candidateDiameterMm: diameter,\n          candidateUsableLengthMm: usableLength,\n          candidateApmxMm: apmx,\n          candidateFluteCount: fluteCount,\n          candidateDetailRadiusMm: toolRadius,\n          desiredConcept: desiredConcept,\n          desiredConceptLabel: label(desiredConcept, CONCEPT_LABELS, \"Review\"),\n          toolConceptFitClass: concept.className,\n          phaseFitClass: phaseSuitability.className,\n          detailFitClass: detail.className,\n          detailFitLabel: detail.label,\n          reachMarginMm: reachMargin,\n          apmxMarginMm: apmxMargin,\n          pointMillingPossible: tiltValue === \"limited_tilt\" || tiltValue === \"continuous_tilt\",\n          centerContactRiskClass: centerRiskClass,\n          centerContactRiskLabel: label(centerRiskClass, RISK_LABELS),\n          steepWallRiskClass: steepWallRiskClass,\n          steepWallRiskLabel: label(steepWallRiskClass, RISK_LABELS),\n          toolpathQualityClass: toolpathValue || \"unknown\",\n          toolpathQualityLabel: label(toolpathValue || \"unknown\", TOOLPATH_LABELS, \"Review\"),\n          stockConsistencyClass: stockValue || \"unknown\",\n          stockConsistencyLabel: label(stockValue || \"unknown\", STOCK_LABELS, \"Review\"),\n          materialSeverityClass: materialSeverityValue.className,\n          effectiveDiameterClass: effectiveDiameterClass,\n          effectiveDiameterLabel: label(effectiveDiameterClass, EFFECTIVE_LABELS),\n          nominalDiameterMm: diameter,\n          effectiveDiameterMm: effectiveDiameterMm,\n          localApMm: localAp,\n          cuspPredictionMm: cuspPredictionMm,\n          cuspPredictionClass: cuspPredictionClass,\n          estimatedAeMm: estimatedAeMm,\n          barrelOpportunityClass: barrelOpportunityClass,\n          barrelOpportunityLabel: label(barrelOpportunityClass, SIMPLE_LABELS),\n          pathInstabilityClass: pathInstabilityClass,\n          pathInstabilityLabel: label(pathInstabilityClass, RISK_LABELS),\n          strategyWindowClass: strategyWindowClass,\n          strategyWindowLabel: label(strategyWindowClass, SIMPLE_LABELS),\n          superfinishSuitabilityClass: superfinishClass,\n          superfinishSuitabilityLabel: label(superfinishClass, SIMPLE_LABELS),\n          copySuitabilityClass: suitabilityClass,\n          copySuitabilityLabel: label(suitabilityClass, SUITABILITY_LABELS),\n          recipeVcMin: toNullableNumber(recipeResult.recipe && recipeResult.recipe.vc && recipeResult.recipe.vc.min),\n          recipeVcTyp: vcTyp,\n          recipeVcMax: toNullableNumber(recipeResult.recipe && recipeResult.recipe.vc && recipeResult.recipe.vc.max),\n          recipeFzMin: toNullableNumber(recipeResult.recipe && recipeResult.recipe.fz && recipeResult.recipe.fz.min),\n          recipeFzTyp: fzTyp,\n          recipeFzMax: toNullableNumber(recipeResult.recipe && recipeResult.recipe.fz && recipeResult.recipe.fz.max),\n          recipeApMin: toNullableNumber(recipeResult.recipe && recipeResult.recipe.ap && recipeResult.recipe.ap.min),\n          recipeApTyp: localAp,\n          recipeApMax: toNullableNumber(recipeResult.recipe && recipeResult.recipe.ap && recipeResult.recipe.ap.max),\n          recipeAePctMin: toNullableNumber(recipeResult.recipe && recipeResult.recipe.aePct && recipeResult.recipe.aePct.min),\n          recipeAePctTyp: aePctTyp,\n          recipeAePctMax: toNullableNumber(recipeResult.recipe && recipeResult.recipe.aePct && recipeResult.recipe.aePct.max),\n          rpmTyp: rpm,\n          feedTypMmMin: feed,\n          mrrTyp: mrr,\n          selectedRecipeSource: recipeResult.source,\n          selectedRecipeRow: recipeResult.debug && recipeResult.debug.selectedRecipeRow,\n          selectedVcRow: recipeResult.debug && recipeResult.debug.selectedVcRow,\n          selectedFzRow: recipeResult.debug && recipeResult.debug.selectedFzRow,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            phaseSuitability.score >= 0.82 ? \"The tool concept lines up well with the requested copy-milling phase.\" : \"The tool concept stays workable for the stated copy-milling phase.\",\n            detail.score >= 0.82 ? \"The tool radius suits the smallest stated form detail.\" : \"The form detail fit is close and should be reviewed against the smallest radius.\",\n            centerRiskClass === \"low\" || centerRiskClass === \"medium\" ? \"The center-zone risk stays manageable for the stated tilt and surface character.\" : \"Center-zone risk needs attention because the cut comes close to the ball-nose center.\",\n            toolpathValue === \"contouring\" || toolpathValue === \"waterline\" || toolpathValue === \"helical_contouring\" ? \"The stated toolpath strategy supports a calmer 3D-form process than traditional copying.\" : \"The toolpath remains possible, but it does not offer the strongest modern contouring behavior.\",\n            (stockValue || \"unknown\") === \"good\" || (stockValue || \"unknown\") === \"acceptable\" ? \"The stock state still supports a reasonably stable semi-finish or finish route.\" : \"Uneven remaining stock weakens the finish process and should be corrected upstream.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/countersinking/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/countersinking/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/countersinking/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/countersinking/presenter.js\");\n    exports.default = createStubProcessModule(\"countersinking\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/countersinking/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, heroRecommendation, recipeStartValues, riskNotes } = __bundle.require(\"core/result-blocks.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        return true;\n      });\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var riskItems = [];\n    \n      if (String(getAnswer(ctx, \"countersink_purpose\") || \"\") === \"deburr\") {\n        riskItems.push({ severity: \"warning\", title: \"Burr control\", message: \"Deburring countersinks should stay conservative to avoid oversizing the entry.\" });\n      }\n      if ((top.score.parts.geometry || 0) < 1) {\n        riskItems.push({ severity: \"warning\", title: \"Geometry fit\", message: \"Target countersink geometry is feasible but not fully relaxed for this candidate.\" });\n      }\n    \n      return createResultViewModel({\n        processId: \"countersinking\",\n        outcome: top.score.total >= 4 ? \"match\" : \"limited_match\",\n        summary: \"Best countersinking result based on angle, target geometry and intended purpose.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 3),\n          }),\n          featureSummary([\n            { key: \"purpose\", label: \"Purpose\", value: String(getAnswer(ctx, \"countersink_purpose\") || \"not specified\") },\n            { key: \"angle\", label: \"Countersink angle\", value: String(getAnswer(ctx, \"countersink_angle\") || \"not specified\") + \" deg\" },\n            { key: \"target\", label: \"Target top diameter / depth\", value: String(getAnswer(ctx, \"target_top_dia_or_depth\") || \"not specified\") + \" mm\" },\n          ]),\n          fitKpis([\n            { key: \"angle\", label: \"Angle fit\", value: (top.score.parts.angle || 0).toFixed(2), status: (top.score.parts.angle || 0) >= 0.8 ? \"good\" : \"ok\" },\n            { key: \"geometry\", label: \"Geometry fit\", value: (top.score.parts.geometry || 0).toFixed(2), status: (top.score.parts.geometry || 0) >= 1.1 ? \"good\" : \"ok\" },\n            { key: \"purpose\", label: \"Purpose fit\", value: (top.score.parts.purpose || 0).toFixed(2), status: (top.score.parts.purpose || 0) >= 0.8 ? \"good\" : \"ok\" },\n            { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.75 ? \"good\" : \"ok\" },\n          ]),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: [\n              { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n              { key: \"fn\", label: \"fn\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n            ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n          }),\n          riskNotes(riskItems),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative countersinking option\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust countersink inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/countersinking/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"countersinking\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/countersinking/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function angleFit(angle) {\n      if (angle == null) return 0.4;\n      if (angle === 90) return 1;\n      if (angle === 82 || angle === 100) return 0.85;\n      if (angle === 120) return 0.7;\n      return 0.2;\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"countersinking\", ctx, toolkits));\n      var angle = toNullableNumber(getAnswer(ctx, \"countersink_angle\"));\n      var target = toNullableNumber(getAnswer(ctx, \"target_top_dia_or_depth\"));\n    \n      derived.target_cs_geometry = angle != null && target != null ? String(angle) + \"deg@\" + String(target) + \"mm\" : null;\n      derived.purpose_class = getAnswer(ctx, \"countersink_purpose\");\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"countersinking\", ctx);\n      var angle = toNullableNumber(getAnswer(ctx, \"countersink_angle\"));\n      var preHole = toNullableNumber(getAnswer(ctx, \"pre_hole_diameter\"));\n      var target = toNullableNumber(getAnswer(ctx, \"target_top_dia_or_depth\"));\n    \n      if (angle != null && (angle < 60 || angle > 150)) {\n        issues.push({\n          field: \"countersink_angle\",\n          message: \"Countersink angle sits outside the supported V1 range.\",\n          severity: \"error\",\n          code: \"countersink_angle_range\",\n        });\n      }\n      if (preHole != null && target != null && target <= preHole) {\n        issues.push({\n          field: \"target_top_dia_or_depth\",\n          message: \"Target countersink geometry must exceed the pre-hole diameter.\",\n          severity: \"error\",\n          code: \"countersink_target_geometry\",\n        });\n      }\n    \n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"countersinking\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var drillingTools = toolkits.drilling;\n      var purpose = getAnswer(ctx, \"countersink_purpose\");\n      var angle = toNullableNumber(getAnswer(ctx, \"countersink_angle\"));\n      var preHole = toNullableNumber(getAnswer(ctx, \"pre_hole_diameter\"));\n      var target = toNullableNumber(getAnswer(ctx, \"target_top_dia_or_depth\"));\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = drillingTools.resolveRows(candidate, ctx);\n        var recipeResult = drillingTools.resolveRecipe(candidate, ctx);\n        var angleScore = angleFit(angle);\n        var geometryScore = target != null && preHole != null && target > preHole\n          ? Math.max(0.2, 1 - Math.abs((candidate.common.diameterMm || target) - target) / target)\n          : 0.2;\n        var purposeScore = purpose === \"screw_seat\"\n          ? (angle === 90 ? 1 : 0.65)\n          : purpose === \"deburr\"\n            ? 0.85\n            : 0.75;\n        var accessScore = target != null && candidate.common.diameterMm != null && candidate.common.diameterMm >= target ? 1 : 0.55;\n        var burrRisk = purpose === \"deburr\" ? 0.9 : purpose === \"screw_seat\" ? 0.75 : 0.65;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (rows.length === 0) {\n          hardRejectReason = \"No drilling row is available for countersinking.\";\n        }\n        if (!hardRejectReason && angleScore < 0.3) {\n          hardRejectReason = \"Countersink angle is outside the supported process window.\";\n        }\n        if (!hardRejectReason && (preHole == null || target == null || target <= preHole)) {\n          hardRejectReason = \"Target countersink geometry is not compatible with the stated pre-hole.\";\n        }\n        if (!hardRejectReason && accessScore < 0.6) {\n          hardRejectReason = \"Candidate diameter is too small for the requested countersink geometry.\";\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          angle: angleScore,\n          geometry: geometryScore * 1.5,\n          purpose: purposeScore,\n          burrRisk: burrRisk,\n          access: accessScore,\n          rowMatch: rows.length > 0 ? 1 : 0,\n          riskPenalty: -kernel.risk(candidate, ctx),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.9 : recipeResult.source === \"near\" ? 0.76 : 0.55;\n        if (hardRejectReason) confidence = 0;\n    \n        metrics = Object.assign({}, drillingTools.getSharedMetrics(candidate, ctx), {\n          countersinkPurpose: purpose,\n          countersinkAngle: angle,\n          preHoleDiameter: preHole,\n          targetTopDiameterOrDepth: target,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            angleScore >= 0.8 ? \"Countersink angle fits the requested use case well.\" : \"Countersink angle is workable with some compromise.\",\n            geometryScore >= 0.8 ? \"Target countersink geometry fits the candidate diameter window.\" : \"Target geometry is feasible but tight for this candidate.\",\n            purposeScore >= 0.8 ? \"The tool suits the requested countersink purpose.\" : \"Purpose fit is acceptable but not ideal.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/deep-hole-drilling/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/deep-hole-drilling/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/deep-hole-drilling/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/deep-hole-drilling/presenter.js\");\n    exports.default = createStubProcessModule(\"deep_hole_drilling\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/deep-hole-drilling/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, heroRecommendation, holeSummary, machineFeasibility, recipeStartValues, riskNotes } = __bundle.require(\"core/result-blocks.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        if (Array.isArray(data.checks)) return data.checks.length > 0;\n        return true;\n      });\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var riskItems = [];\n      var machineChecks = [];\n    \n      if (String(getAnswer(ctx, \"chip_evac_condition\") || \"\") === \"poor\") {\n        riskItems.push({ severity: \"warning\", title: \"Chip evacuation\", message: \"Poor chip evacuation sharply narrows the deep-hole stability window.\" });\n      }\n      if ((top.score.parts.pressure || 0) < 0.75) {\n        riskItems.push({ severity: \"warning\", title: \"Coolant pressure\", message: \"Coolant pressure is acceptable but not relaxed for this deep-hole class.\" });\n      }\n      if (ctx.derived && ctx.derived.deep_hole_flag) {\n        riskItems.push({ severity: \"warning\", title: \"Deep-hole class\", message: \"Deep-hole drilling needs strict coolant and evacuation control.\" });\n      }\n    \n      machineChecks.push({\n        key: \"tsc\",\n        label: \"Through coolant\",\n        result: getAnswer(ctx, \"through_coolant\") === \"yes\" && candidate.common.coolantTsc ? \"pass\" : \"fail\",\n        note: candidate.common.coolantTsc ? \"Tool supports through coolant.\" : \"Tool does not support through coolant.\",\n      });\n      machineChecks.push({\n        key: \"pressure\",\n        label: \"Coolant pressure\",\n        result: Number(getAnswer(ctx, \"machine_coolant_bar\")) >= 30 ? \"pass\" : Number(getAnswer(ctx, \"machine_coolant_bar\")) >= 20 ? \"limited\" : \"fail\",\n        note: getAnswer(ctx, \"machine_coolant_bar\") != null ? String(getAnswer(ctx, \"machine_coolant_bar\")) + \" bar\" : null,\n      });\n    \n      return createResultViewModel({\n        processId: \"deep_hole_drilling\",\n        outcome: top.score.total >= 4.5 ? \"match\" : \"limited_match\",\n        summary: \"Best deep-hole drilling match based on coolant support, pressure and deep-hole reach.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 3),\n          }),\n          holeSummary({\n            diameterMm: getAnswer(ctx, \"feature_diameter_mm\"),\n            depthMm: getAnswer(ctx, \"feature_depth_mm\"),\n            depthRatio: ctx.derived && ctx.derived.depth_ratio,\n            entryCondition: null,\n            exitCondition: null,\n            blindThrough: null,\n          }),\n          fitKpis([\n            { key: \"tsc\", label: \"TSC fit\", value: (top.score.parts.tsc || 0).toFixed(2), status: (top.score.parts.tsc || 0) >= 1.5 ? \"good\" : \"weak\" },\n            { key: \"pressure\", label: \"Pressure\", value: (top.score.parts.pressure || 0).toFixed(2), status: (top.score.parts.pressure || 0) >= 0.75 ? \"good\" : \"weak\" },\n            { key: \"reach\", label: \"Reach\", value: (top.score.parts.reach || 0).toFixed(2), status: (top.score.parts.reach || 0) >= 1 ? \"good\" : \"ok\" },\n            { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.75 ? \"good\" : \"ok\" },\n          ]),\n          machineFeasibility(machineChecks),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: [\n              { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n              { key: \"fn\", label: \"fn\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n            ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n          }),\n          riskNotes(riskItems),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative deep-hole drill\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust deep-hole inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/deep-hole-drilling/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"deep_hole_drilling\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/deep-hole-drilling/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function tokenScore(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function depthClassTarget(holeDepthClass) {\n      var map = { \"3xD\": 3, \"5xD\": 5, \"8xD\": 8, \"10xD\": 10, \"12xD\": 12 };\n      return map[holeDepthClass] || null;\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"deep_hole_drilling\", ctx, toolkits));\n      var diameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var pressure = toNullableNumber(getAnswer(ctx, \"machine_coolant_bar\"));\n      var ratio = diameter != null && depth != null && diameter > 0 ? depth / diameter : null;\n    \n      derived.depth_ratio = ratio;\n      derived.deep_hole_flag = ratio != null && ratio > 8;\n      derived.pressure_readiness = pressure == null\n        ? \"unknown\"\n        : pressure >= 30\n          ? \"strong\"\n          : pressure >= 20\n            ? \"adequate\"\n            : \"weak\";\n    \n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"deep_hole_drilling\", ctx);\n      var holeDepthClass = getAnswer(ctx, \"hole_depth_class\");\n      var throughCoolant = getAnswer(ctx, \"through_coolant\");\n      var pressure = toNullableNumber(getAnswer(ctx, \"machine_coolant_bar\"));\n    \n      if ((holeDepthClass === \"10xD\" || holeDepthClass === \"12xD\") && throughCoolant !== \"yes\") {\n        issues.push({\n          field: \"through_coolant\",\n          message: \"Very deep drilling should be paired with through coolant.\",\n          severity: \"warning\",\n          code: \"deep_hole_requires_tsc\",\n        });\n      }\n      if ((holeDepthClass === \"10xD\" || holeDepthClass === \"12xD\") && pressure != null && pressure < 25) {\n        issues.push({\n          field: \"machine_coolant_bar\",\n          message: \"Very deep drilling needs a stronger coolant pressure window.\",\n          severity: \"warning\",\n          code: \"deep_hole_pressure_warning\",\n        });\n      }\n    \n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"deep_hole_drilling\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var drillingTools = toolkits.drilling;\n      var diameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var throughCoolant = getAnswer(ctx, \"through_coolant\");\n      var holeDepthClass = getAnswer(ctx, \"hole_depth_class\");\n      var chipEvac = getAnswer(ctx, \"chip_evac_condition\");\n      var pressure = toNullableNumber(getAnswer(ctx, \"machine_coolant_bar\"));\n      var targetRatio = depthClassTarget(holeDepthClass);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = drillingTools.resolveRows(candidate, ctx);\n        var recipeResult = drillingTools.resolveRecipe(candidate, ctx);\n        var reachScore = depth != null ? kernel.reachFit(candidate, depth) : 0;\n        var depthRatio = diameter != null && depth != null && diameter > 0 ? depth / diameter : null;\n        var ratioFit = depthRatio != null && targetRatio != null ? Math.max(0.2, 1 - Math.abs(depthRatio - targetRatio) / targetRatio) : 0.55;\n        var pressureScore = pressure == null ? 0.4 : pressure >= 30 ? 1 : pressure >= 20 ? 0.75 : pressure >= 15 ? 0.45 : 0.2;\n        var tscScore = throughCoolant === \"yes\" && candidate.common.coolantTsc ? 1 : throughCoolant === \"yes\" ? 0 : candidate.common.coolantTsc ? 0.65 : 0.35;\n        var evacuationScore = tokenScore(chipEvac, { good: 1, limited: 0.65, poor: 0.25 }, 0.5);\n        var stabilityScore = tokenScore(holeDepthClass, { \"3xD\": 1, \"5xD\": 0.85, \"8xD\": 0.65, \"10xD\": 0.45, \"12xD\": 0.3 }, 0.55);\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (throughCoolant !== \"yes\") {\n          hardRejectReason = \"Deep-hole drilling requires through coolant in the V1 process contract.\";\n        }\n        if (!hardRejectReason && !candidate.common.coolantTsc) {\n          hardRejectReason = \"Candidate does not support through coolant for deep-hole drilling.\";\n        }\n        if (!hardRejectReason && pressure != null && pressure < 15) {\n          hardRejectReason = \"Coolant pressure is too low for a deep-hole drilling recommendation.\";\n        }\n        if (!hardRejectReason && depth != null && reachScore < 1) {\n          hardRejectReason = \"Usable length is shorter than the requested deep-hole depth.\";\n        }\n        if (!hardRejectReason && rows.length === 0) {\n          hardRejectReason = \"No drilling row is available for deep-hole drilling.\";\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          tsc: tscScore * 2,\n          pressure: pressureScore,\n          depthRatio: ratioFit,\n          reach: reachScore * 1.5,\n          evacuation: evacuationScore,\n          stability: stabilityScore,\n          rowMatch: rows.length > 0 ? 1 : 0,\n          machine: kernel.machineWindow(candidate, ctx),\n          riskPenalty: -kernel.risk(candidate, ctx),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.94 : recipeResult.source === \"near\" ? 0.8 : 0.55;\n        if (hardRejectReason) confidence = 0;\n    \n        metrics = Object.assign({}, drillingTools.getSharedMetrics(candidate, ctx), {\n          depthRatio: depthRatio,\n          holeDepthClass: holeDepthClass,\n          pressureBar: pressure,\n          pressureReadiness: ctx.derived && ctx.derived.pressure_readiness,\n          chipEvacCondition: chipEvac,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            tscScore >= 0.9 ? \"Through-coolant support matches the deep-hole strategy.\" : \"Coolant capability is the main limit for this deep-hole setup.\",\n            pressureScore >= 0.75 ? \"Coolant pressure supports chip evacuation at the requested depth.\" : \"Coolant pressure narrows the deep-hole process window.\",\n            reachScore >= 1 ? \"Reach covers the requested deep-hole depth.\" : \"Reach is too close to the requested deep-hole depth.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/diameter-turning/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/diameter-turning/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/diameter-turning/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/diameter-turning/presenter.js\");\n    exports.default = createStubProcessModule(\"diameter_turning\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/diameter-turning/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, recipeStartValues, riskNotes, setupNotes } = __bundle.require(\"core/result-blocks.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.checks)) return data.checks.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        return true;\n      });\n    }\n    \n    function titleCase(value) {\n      return String(value || \"\")\n        .split(/[_\\s-]+/)\n        .filter(Boolean)\n        .map(function mapPart(part) {\n          return part.charAt(0).toUpperCase() + part.slice(1);\n        })\n        .join(\" \");\n    }\n    \n    function formatNumber(value, digits) {\n      return value == null ? \"n/a\" : Number(value).toFixed(digits == null ? 2 : digits);\n    }\n    \n    function formatMm(value, digits) {\n      return value == null ? \"n/a\" : formatNumber(value, digits == null ? 2 : digits) + \" mm\";\n    }\n    \n    function formatUm(value, digits) {\n      return value == null ? \"n/a\" : formatNumber(value, digits == null ? 1 : digits) + \" um\";\n    }\n    \n    function formatStatusFromRisk(riskClass) {\n      return riskClass === \"low\" ? \"good\" : riskClass === \"medium\" ? \"ok\" : \"weak\";\n    }\n    \n    function buildFeatureItems(metrics) {\n      return [\n        { key: \"mode\", label: \"Turning mode\", value: titleCase(metrics.requestedTurnMode) },\n        { key: \"phase\", label: \"Operation phase\", value: titleCase(metrics.requestedOperationPhase) },\n        { key: \"diameter\", label: \"Workpiece diameter\", value: formatMm(metrics.requestedWorkpieceDiameterMm) },\n        { key: \"ap\", label: \"Depth of cut ap\", value: formatMm(metrics.requestedApMm) },\n        { key: \"interruption\", label: \"Cut interruption\", value: titleCase(metrics.requestedCutInterruption) },\n        { key: \"surface_priority\", label: \"Surface vs productivity\", value: titleCase(metrics.requestedSurfacePriority) },\n      ];\n    }\n    \n    function buildGeometryItems(metrics) {\n      var items = [\n        {\n          key: \"polarity\",\n          label: \"Geometry tendency\",\n          actual: titleCase(metrics.candidatePolarity),\n          target: titleCase(metrics.positiveNegativeBias),\n          result: metrics.polarityFitScore >= 0.85 ? \"fit\" : \"near\",\n        },\n        {\n          key: \"shape\",\n          label: \"Insert shape / access\",\n          actual: metrics.candidateShapeCode ? String(metrics.candidateShapeCode) : \"n/a\",\n          target: titleCase(metrics.requestedShoulderAccess),\n          result: metrics.accessFitScore >= 0.85 ? \"fit\" : metrics.accessFitScore >= 0.6 ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"nose_radius\",\n          label: \"Nose radius\",\n          actual: formatMm(metrics.noseRadiusMm, 2),\n          target: metrics.requestedNoseRadiusLimitMm != null ? \"<= \" + formatMm(metrics.requestedNoseRadiusLimitMm, 2) : titleCase(metrics.requestedSurfacePriority),\n          result: metrics.noseRadiusFitScore >= 0.85 ? \"fit\" : metrics.noseRadiusFitScore >= 0.6 ? \"near\" : \"mismatch\",\n        },\n      ];\n    \n      if (metrics.requestedTurnMode === \"internal\" && metrics.insertIcMm != null && metrics.requestedWorkpieceDiameterMm != null) {\n        items.unshift({\n          key: \"internal_size\",\n          label: \"Insert size vs bore\",\n          actual: formatMm(metrics.insertIcMm, 2),\n          target: formatMm(metrics.requestedWorkpieceDiameterMm, 2),\n          result: metrics.insertIcMm < metrics.requestedWorkpieceDiameterMm ? \"fit\" : \"mismatch\",\n        });\n      }\n    \n      if (metrics.theoreticalRoughnessUm != null || metrics.requestedTargetRoughnessUm != null) {\n        items.push({\n          key: \"roughness\",\n          label: \"Theoretical roughness\",\n          actual: formatUm(metrics.theoreticalRoughnessUm, 1),\n          target: metrics.requestedTargetRoughnessUm != null ? formatUm(metrics.requestedTargetRoughnessUm, 1) : \"not specified\",\n          result: metrics.requestedTargetRoughnessUm == null || metrics.theoreticalRoughnessUm <= metrics.requestedTargetRoughnessUm ? \"fit\" : \"near\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"score\", label: \"Fit score\", value: formatNumber(top.score.total, 2), status: top.score.total >= 6 ? \"good\" : \"ok\" },\n        { key: \"rigidity\", label: \"Rigidity risk\", value: titleCase(metrics.rigidityRiskClass), status: formatStatusFromRisk(metrics.rigidityRiskClass) },\n        { key: \"chip\", label: \"Chip control\", value: titleCase(metrics.chipControlRisk), status: metrics.chipControlRisk === \"low\" ? \"good\" : metrics.chipControlRisk === \"medium\" ? \"ok\" : \"weak\" },\n        { key: \"finish\", label: \"Finish feasibility\", value: titleCase(metrics.finishFeasibility), status: metrics.finishFeasibility === \"strong\" ? \"good\" : metrics.finishFeasibility === \"conditional\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatNumber(top.score.confidence, 2), status: top.score.confidence >= 0.78 ? \"good\" : \"ok\" },\n      ];\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n        { key: \"f\", label: \"f\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n        { key: \"ap\", label: \"ap\", min: top.recipe && top.recipe.ap.min, typ: top.recipe && top.recipe.ap.typ, max: top.recipe && top.recipe.ap.max, unit: \"mm\" },\n        { key: \"n\", label: \"n\", min: null, typ: metrics.rpmTyp, max: null, unit: \"rpm\" },\n        { key: \"vf\", label: \"vf\", min: null, typ: metrics.feedSpeedMmMin, max: null, unit: \"mm/min\" },\n        { key: \"Q\", label: \"Q\", min: null, typ: metrics.mrrCm3Min, max: null, unit: \"cm3/min\" },\n        { key: \"rth\", label: \"Rth\", min: null, typ: metrics.theoreticalRoughnessUm, max: null, unit: \"um\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildMachineChecks(candidate, metrics) {\n      var checks = [];\n    \n      if (metrics.requestedCoolantClass) {\n        checks.push({\n          key: \"coolant\",\n          label: \"Coolant support\",\n          result: metrics.coolingSupportClass === \"strong\" || metrics.coolingSupportClass === \"adequate\"\n            ? \"pass\"\n            : metrics.coolingSupportClass === \"limited\"\n              ? \"limited\"\n              : \"fail\",\n          note: metrics.requestedCoolantClass === \"internal\" || metrics.requestedCoolantClass === \"high_pressure\"\n            ? (candidate.common.coolantTsc ? \"Tool supports through coolant delivery.\" : \"Machine asks for through coolant but the candidate does not expose it.\")\n            : null,\n        });\n      }\n    \n      if (metrics.requestedTurnMode === \"internal\" && metrics.requestedOverhangClass) {\n        checks.push({\n          key: \"rigidity_window\",\n          label: \"Internal rigidity window\",\n          result: metrics.rigidityRiskClass === \"low\" || metrics.rigidityRiskClass === \"medium\" ? \"pass\" : \"limited\",\n          note: \"Overhang class \" + titleCase(metrics.requestedOverhangClass) + \" drives the current rigidity risk.\",\n        });\n      }\n    \n      return checks;\n    }\n    \n    function buildSetupItems(metrics) {\n      var items = [\n        { area: \"geometry\", message: \"Preferred geometry bias: \" + titleCase(metrics.positiveNegativeBias) + \".\" },\n        { area: \"access\", message: \"Insert shape \" + (metrics.candidateShapeCode || \"?\") + \" is being used against \" + titleCase(metrics.requestedShoulderAccess) + \" access.\" },\n        { area: \"stability\", message: \"Rigidity risk is currently \" + titleCase(metrics.rigidityRiskClass) + \" with \" + titleCase(metrics.requestedTurnMode) + \" turning.\" },\n        { area: \"special\", message: \"Cutting-material route: \" + titleCase(metrics.specialCuttingMaterialRoute) + \".\" },\n      ];\n    \n      if (metrics.requestedWiperAllowed && metrics.requestedWiperAllowed !== \"unknown\") {\n        items.push({ area: \"surface\", message: \"Wiper suitability: \" + titleCase(metrics.wiperSuitabilityClass) + \".\" });\n      }\n      if (metrics.requestedOverhangClass && metrics.requestedOverhangClass !== \"short\") {\n        items.push({ area: \"overhang\", message: \"Overhang class: \" + titleCase(metrics.requestedOverhangClass) + \".\" });\n      }\n      return items;\n    }\n    \n    function buildRiskItems(metrics) {\n      var items = [];\n    \n      if (metrics.rigidityRiskClass === \"high\" || metrics.rigidityRiskClass === \"critical\") {\n        items.push({\n          severity: metrics.rigidityRiskClass === \"critical\" ? \"critical\" : \"warning\",\n          title: \"Rigidity risk\",\n          message: \"Slenderness, overhang or nose-radius choice make this diameter-turning case vibration-sensitive.\",\n        });\n      }\n      if (metrics.chipControlRisk === \"high\" || metrics.chipControlRisk === \"critical\") {\n        items.push({\n          severity: metrics.chipControlRisk === \"critical\" ? \"critical\" : \"warning\",\n          title: \"Chip control\",\n          message: \"ap, feed and material behavior point to long-chip or chip-breaking risk.\",\n        });\n      }\n      if (metrics.finishFeasibility === \"weak\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Surface conflict\",\n          message: \"The requested surface bias needs a smaller feed, a different nose radius or a more stable setup.\",\n        });\n      }\n      if (metrics.requestedTurnMode === \"internal\" && metrics.insertIcMm != null && metrics.requestedWorkpieceDiameterMm != null && metrics.insertIcMm / metrics.requestedWorkpieceDiameterMm > 0.75) {\n        items.push({\n          severity: \"warning\",\n          title: \"Internal clearance\",\n          message: \"Insert size is close to the internal turning diameter and leaves little room for chip flow.\",\n        });\n      }\n      if (metrics.requestedWiperAllowed === \"yes\" && (metrics.wiperSuitabilityClass === \"weak\" || metrics.wiperSuitabilityClass === \"avoid\")) {\n        items.push({\n          severity: \"warning\",\n          title: \"Wiper limitation\",\n          message: \"Wiper geometry is not ideal for this turning mode or overhang condition.\",\n        });\n      }\n      if (metrics.specialCuttingMaterialRoute !== \"carbide_default\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Special route\",\n          message: \"This material/application window may justify a non-standard cutting-material route.\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildResultView(scored) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var metrics = top.metrics || {};\n    \n      return createResultViewModel({\n        processId: \"diameter_turning\",\n        outcome: top.score.total >= 6 ? \"match\" : \"limited_match\",\n        summary: \"Best diameter turning result based on phase fit, rigidity, chip control and surface/process balance.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 4),\n          }),\n          featureSummary(buildFeatureItems(metrics)),\n          geometryFit(buildGeometryItems(metrics)),\n          fitKpis(buildFitItems(top)),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: buildRecipeValues(top),\n          }),\n          machineFeasibility(buildMachineChecks(candidate, metrics)),\n          riskNotes(buildRiskItems(metrics)),\n          setupNotes(buildSetupItems(metrics)),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative diameter-turning option\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust turning inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/diameter-turning/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"diameter_turning\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/diameter-turning/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function getOperationPhase(ctx) {\n      return toNullableString(getAnswer(ctx, \"operation_phase\") || getAnswer(ctx, \"goal_stage\")) || \"semi-finishing\";\n    }\n    \n    function getTurnMode(ctx) {\n      return toNullableString(getAnswer(ctx, \"turn_mode\") || getAnswer(ctx, \"internal_external\")) || \"external\";\n    }\n    \n    function getMaterialRefinement(ctx) {\n      return toNullableString(getAnswer(ctx, \"material_refinement\") || getAnswer(ctx, \"material_condition_class\")) || \"standard\";\n    }\n    \n    function getSurfacePriority(ctx) {\n      return toNullableString(getAnswer(ctx, \"surface_vs_productivity\")) || \"balanced\";\n    }\n    \n    function getShoulderAccess(ctx) {\n      return toNullableString(getAnswer(ctx, \"turning_shoulder_access\")) || \"free\";\n    }\n    \n    function getOverhangClass(ctx) {\n      return toNullableString(getAnswer(ctx, \"overhang_class\")) || \"short\";\n    }\n    \n    function getIsoGroup(ctx) {\n      return toNullableString(ctx && ctx.material && ctx.material.isoGroup) || null;\n    }\n    \n    function stageFitScore(requestedStage, row) {\n      var rowStage = row && row.constraints ? toNullableString(row.constraints.conditionStage) : null;\n      if (!rowStage || !requestedStage) return 0.75;\n      if (rowStage === requestedStage) return 1;\n      if ((rowStage === \"roughing\" && requestedStage === \"semi-finishing\") || (rowStage === \"semi-finishing\" && requestedStage === \"roughing\")) {\n        return 0.72;\n      }\n      if ((rowStage === \"finishing\" && requestedStage === \"semi-finishing\") || (rowStage === \"semi-finishing\" && requestedStage === \"finishing\")) {\n        return 0.82;\n      }\n      return 0.38;\n    }\n    \n    function selectBestRow(rows, requestedStage) {\n      var exact = (rows || []).find(function findExact(row) {\n        return row && row.constraints && row.constraints.conditionStage === requestedStage;\n      });\n      return exact || (rows || [])[0] || null;\n    }\n    \n    function classifyRigidityRisk(turnMode, slenderClass, overhangClass, apMm, diameterMm, noseRadiusMm) {\n      var risk = 0;\n    \n      if (turnMode === \"internal\") risk += 1.2;\n      risk += { no: 0, light: 1, strong: 2.2 }[slenderClass] || 0;\n      risk += { short: 0, medium: 0.7, long: 1.7, critical: 2.8 }[overhangClass] || 0;\n      if (diameterMm != null && apMm != null && diameterMm > 0 && apMm / diameterMm >= 0.08) risk += 0.4;\n      if (noseRadiusMm != null && noseRadiusMm >= 0.8 && (slenderClass === \"light\" || slenderClass === \"strong\")) risk += 0.5;\n    \n      if (risk >= 4.2) return \"critical\";\n      if (risk >= 2.7) return \"high\";\n      if (risk >= 1.2) return \"medium\";\n      return \"low\";\n    }\n    \n    function rigidityScore(rigidityRiskClass, candidatePolarity, noseRadiusMm, slenderClass) {\n      var score = { low: 1, medium: 0.78, high: 0.48, critical: 0.18 }[rigidityRiskClass] || 0.55;\n      if ((slenderClass === \"light\" || slenderClass === \"strong\") && candidatePolarity === \"positive\") score += 0.08;\n      if ((slenderClass === \"light\" || slenderClass === \"strong\") && noseRadiusMm != null && noseRadiusMm <= 0.4) score += 0.08;\n      if (rigidityRiskClass !== \"low\" && noseRadiusMm != null && noseRadiusMm >= 0.8) score -= 0.12;\n      return clamp(score, 0, 1);\n    }\n    \n    function inferPolarityBias(turnMode, slenderClass, interruption, phase, surfacePriority, materialRefinement, isoGroup) {\n      var positiveNeed = 0;\n      var negativeNeed = 0;\n    \n      if (turnMode === \"internal\") positiveNeed += 2;\n      if (slenderClass === \"light\") positiveNeed += 1;\n      if (slenderClass === \"strong\") positiveNeed += 2;\n      if (surfacePriority === \"surface\") positiveNeed += 1;\n      if (materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") positiveNeed += 1;\n    \n      if (interruption === \"heavy\") negativeNeed += 2;\n      if (phase === \"roughing\") negativeNeed += 1;\n      if (surfacePriority === \"productivity\") negativeNeed += 1;\n      if (isoGroup === \"K\") negativeNeed += 1;\n    \n      if (positiveNeed >= negativeNeed + 1) return \"positive_preferred\";\n      if (negativeNeed >= positiveNeed + 1) return \"negative_preferred\";\n      return \"balanced\";\n    }\n    \n    function getCandidatePolarity(candidate) {\n      var clearanceCode = toNullableString(candidate && candidate.turning && candidate.turning.turnClearanceCode);\n      if (!clearanceCode) return \"unknown\";\n      return clearanceCode.toUpperCase() === \"N\" ? \"negative\" : \"positive\";\n    }\n    \n    function polarityFitScore(bias, candidatePolarity) {\n      if (bias === \"balanced\") return candidatePolarity === \"unknown\" ? 0.65 : 0.82;\n      if (candidatePolarity === \"unknown\") return 0.55;\n      if (bias === \"positive_preferred\") return candidatePolarity === \"positive\" ? 1 : 0.38;\n      return candidatePolarity === \"negative\" ? 1 : 0.38;\n    }\n    \n    function shapeAccessScore(shapeCode, shoulderAccess) {\n      var code = String(shapeCode || \"\").toUpperCase();\n      var openMap = { C: 0.95, W: 0.95, S: 0.92, T: 0.9, D: 0.8, V: 0.72, R: 0.6 };\n      var shoulderMap = { C: 0.9, W: 0.88, S: 0.86, T: 0.9, D: 0.86, V: 0.78, R: 0.48 };\n      var contourMap = { V: 1, D: 0.95, T: 0.88, C: 0.72, W: 0.68, S: 0.55, R: 0.32 };\n      var forcedMap = { V: 1, D: 0.96, T: 0.9, C: 0.62, W: 0.58, S: 0.42, R: 0.2 };\n      var table = openMap;\n    \n      if (shoulderAccess === \"near_shoulder\") table = shoulderMap;\n      if (shoulderAccess === \"tight_contour\") table = contourMap;\n      if (shoulderAccess === \"forced_form\") table = forcedMap;\n      return Object.prototype.hasOwnProperty.call(table, code) ? table[code] : 0.65;\n    }\n    \n    function noseRadiusFitScore(noseRadiusMm, noseRadiusLimitMm, surfacePriority, phase, rigidityRiskClass, shoulderAccess) {\n      if (noseRadiusMm == null) return 0.55;\n      if (noseRadiusLimitMm != null) {\n        if (noseRadiusMm > noseRadiusLimitMm) return 0;\n        if (noseRadiusMm >= noseRadiusLimitMm * 0.75) return 1;\n        return clamp(0.72 + noseRadiusMm / Math.max(noseRadiusLimitMm, 0.01) * 0.28, 0.72, 0.98);\n      }\n      if (rigidityRiskClass === \"high\" || rigidityRiskClass === \"critical\" || shoulderAccess === \"tight_contour\" || shoulderAccess === \"forced_form\") {\n        return noseRadiusMm <= 0.4 ? 1 : noseRadiusMm <= 0.8 ? 0.62 : 0.28;\n      }\n      if (surfacePriority === \"surface\" && phase === \"finishing\") {\n        if (noseRadiusMm >= 0.4 && noseRadiusMm <= 0.8) return 1;\n        if (noseRadiusMm < 0.4) return 0.72;\n        return 0.7;\n      }\n      if (surfacePriority === \"productivity\" && phase === \"roughing\") {\n        if (noseRadiusMm >= 0.8) return 1;\n        if (noseRadiusMm >= 0.4) return 0.8;\n        return 0.55;\n      }\n      return noseRadiusMm >= 0.4 && noseRadiusMm <= 0.8 ? 0.92 : 0.72;\n    }\n    \n    function classifyChipControlRisk(materialRefinement, coolantClass, phase, interruption, apMm, fnTyp) {\n      var ratio = apMm != null && fnTyp != null && fnTyp > 0 ? apMm / fnTyp : null;\n      var risk = 0;\n    \n      if (materialRefinement === \"tough_long_chipping\") risk += 1.2;\n      if (materialRefinement === \"sticky_bue\") risk += 1;\n      if (materialRefinement === \"work_hardening\") risk += 1.1;\n      if (phase === \"finishing\") risk += 0.4;\n      if (interruption === \"heavy\") risk -= 0.3;\n      if (coolantClass === \"dry\" || coolantClass === \"unknown\") risk += 0.7;\n    \n      if (ratio != null) {\n        if (ratio < 4 || ratio > 18) risk += 1;\n        else if (ratio < 5 || ratio > 15) risk += 0.45;\n      }\n    \n      if (risk >= 2.6) return \"critical\";\n      if (risk >= 1.7) return \"high\";\n      if (risk >= 0.8) return \"medium\";\n      return \"low\";\n    }\n    \n    function chipRiskScore(chipControlRisk) {\n      return { low: 1, medium: 0.72, high: 0.42, critical: 0.15 }[chipControlRisk] || 0.6;\n    }\n    \n    function classifyCoolingSupport(materialRefinement, coolantClass, hasThroughCoolant, isoGroup) {\n      var demand = 0;\n      var supply = 0;\n    \n      if (isoGroup === \"M\" || isoGroup === \"S\" || isoGroup === \"N\") demand += 1;\n      if (materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") demand += 1;\n    \n      supply += { dry: 0, external: 0.8, internal: 1.2, high_pressure: 1.5, unknown: 0.4 }[coolantClass] || 0.4;\n      if ((coolantClass === \"internal\" || coolantClass === \"high_pressure\") && hasThroughCoolant) supply += 0.3;\n      if ((coolantClass === \"internal\" || coolantClass === \"high_pressure\") && !hasThroughCoolant) supply -= 0.3;\n    \n      if (supply >= demand + 0.7) return \"strong\";\n      if (supply >= demand) return \"adequate\";\n      if (supply >= demand - 0.6) return \"limited\";\n      return \"weak\";\n    }\n    \n    function coolingScore(coolingSupportClass) {\n      return { strong: 1, adequate: 0.82, limited: 0.55, weak: 0.22 }[coolingSupportClass] || 0.6;\n    }\n    \n    function classifyWiperSuitability(surfacePriority, phase, turnMode, overhangClass, rigidityRiskClass, wiperAllowed, shoulderAccess) {\n      if (wiperAllowed === \"no\") return \"avoid\";\n      if (shoulderAccess === \"forced_form\") return \"avoid\";\n      if (turnMode === \"internal\" && (overhangClass === \"long\" || overhangClass === \"critical\")) return \"avoid\";\n      if (rigidityRiskClass === \"high\" || rigidityRiskClass === \"critical\") return \"weak\";\n      if (surfacePriority === \"surface\" && phase === \"finishing\" && turnMode === \"external\") return \"strong\";\n      if (surfacePriority !== \"productivity\") return \"usable\";\n      return \"weak\";\n    }\n    \n    function computeTheoreticalRoughnessUm(fnTyp, noseRadiusMm) {\n      if (fnTyp == null || noseRadiusMm == null || noseRadiusMm <= 0) return null;\n      return fnTyp * fnTyp / (8 * noseRadiusMm) * 1000;\n    }\n    \n    function classifyFinishFeasibility(surfacePriority, phase, rigidityRiskClass, wiperSuitabilityClass, roughnessUm, targetRoughnessUm) {\n      var roughnessFit = roughnessUm == null || targetRoughnessUm == null ? \"unknown\" : (roughnessUm <= targetRoughnessUm ? \"good\" : (roughnessUm <= targetRoughnessUm * 1.35 ? \"near\" : \"poor\"));\n    \n      if (surfacePriority === \"productivity\" && phase === \"roughing\") return \"weak\";\n      if (rigidityRiskClass === \"critical\") return \"weak\";\n      if (wiperSuitabilityClass === \"avoid\") return \"weak\";\n      if (roughnessFit === \"good\" && (phase === \"finishing\" || phase === \"semi-finishing\") && (rigidityRiskClass === \"low\" || rigidityRiskClass === \"medium\")) {\n        return \"strong\";\n      }\n      if (roughnessFit === \"poor\") return \"weak\";\n      return \"conditional\";\n    }\n    \n    function finishScore(finishFeasibility, surfacePriority) {\n      var base = { strong: 1, conditional: 0.68, weak: 0.3 }[finishFeasibility] || 0.55;\n      if (surfacePriority === \"surface\") return base;\n      if (surfacePriority === \"balanced\") return clamp(base + 0.05, 0, 1);\n      return clamp(base + 0.12, 0, 1);\n    }\n    \n    function classifySpecialMaterialRoute(isoGroup, materialRefinement, phase, surfacePriority) {\n      if (isoGroup === \"H\" || materialRefinement === \"hard\") return \"cbn_pcbn_route\";\n      if (isoGroup === \"N\" && (surfacePriority === \"surface\" || phase === \"finishing\")) return \"pcd_route\";\n      if (phase === \"finishing\" && surfacePriority === \"surface\" && (isoGroup === \"P\" || isoGroup === \"M\" || isoGroup === \"K\")) return \"cermet_possible\";\n      return \"carbide_default\";\n    }\n    \n    function buildReasonList(metrics) {\n      return [\n        metrics.stageFitScore >= 0.85 ? \"Stage and recipe window line up with the requested turning phase.\" : \"The selected row is workable but not ideal for the requested turning phase.\",\n        metrics.polarityFitScore >= 0.85 ? \"Insert geometry follows the preferred positive/negative cutting-force tendency.\" : \"Insert geometry is usable, but the cutting-force tendency is a compromise.\",\n        metrics.rigidityRiskClass === \"low\" || metrics.rigidityRiskClass === \"medium\"\n          ? \"Rigidity risk stays within a controlled diameter-turning range.\"\n          : \"Rigidity is the main constraint for this diameter-turning setup.\",\n        metrics.finishFeasibility === \"strong\"\n          ? \"Surface quality is credible with the current feed and nose-radius window.\"\n          : \"Surface quality needs careful feed, radius or wiper handling.\",\n        metrics.chipControlRisk === \"low\" || metrics.chipControlRisk === \"medium\"\n          ? \"Chip control stays manageable for the requested ap and feed window.\"\n          : \"Chip control is the main risk driver for this case.\",\n      ].slice(0, 5);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"diameter_turning\", ctx, toolkits));\n      var phase = getOperationPhase(ctx);\n      var turnMode = getTurnMode(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var slenderClass = toNullableString(getAnswer(ctx, \"slender_or_thinwall\")) || \"no\";\n      var overhangClass = getOverhangClass(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var surfacePriority = getSurfacePriority(ctx);\n      var diameterMm = toNullableNumber(getAnswer(ctx, \"workpiece_diameter_mm\"));\n      var apMm = toNullableNumber(getAnswer(ctx, \"ap_mm\"));\n    \n      derived.condition_stage = phase;\n      derived.turning_mode = turnMode;\n      derived.material_refinement = materialRefinement;\n      derived.positive_negative_bias = inferPolarityBias(turnMode, slenderClass, interruption, phase, surfacePriority, materialRefinement, getIsoGroup(ctx));\n      derived.rigidity_risk_class = classifyRigidityRisk(turnMode, slenderClass, overhangClass, apMm, diameterMm, null);\n      derived.special_cutting_material_route = classifySpecialMaterialRoute(getIsoGroup(ctx), materialRefinement, phase, surfacePriority);\n      if (diameterMm != null && apMm != null && diameterMm > 0) {\n        derived.ap_diameter_ratio = apMm / diameterMm;\n      }\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"diameter_turning\", ctx);\n      var phase = getOperationPhase(ctx);\n      var turnMode = getTurnMode(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var coolantClass = toNullableString(getAnswer(ctx, \"coolant_class\")) || \"unknown\";\n      var surfacePriority = getSurfacePriority(ctx);\n      var overhangClass = getOverhangClass(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var wiperAllowed = toNullableString(getAnswer(ctx, \"wiper_allowed\")) || \"unknown\";\n      var targetRoughnessUm = toNullableNumber(getAnswer(ctx, \"target_roughness\"));\n      var diameterMm = toNullableNumber(getAnswer(ctx, \"workpiece_diameter_mm\"));\n      var apMm = toNullableNumber(getAnswer(ctx, \"ap_mm\"));\n    \n      if ((materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") && (coolantClass === \"dry\" || coolantClass === \"unknown\")) {\n        issues.push({\n          field: \"coolant_class\",\n          message: \"Difficult long-chipping turning cases benefit strongly from better coolant support.\",\n          severity: \"warning\",\n          code: \"turning_coolant_support\",\n        });\n      }\n      if (phase === \"finishing\" && interruption === \"heavy\") {\n        issues.push({\n          field: \"cut_interruption\",\n          message: \"Heavy interruption is a weak fit for finish-oriented diameter turning.\",\n          severity: \"warning\",\n          code: \"turning_finish_interruption\",\n        });\n      }\n      if (surfacePriority === \"productivity\" && getAnswer(ctx, \"slender_or_thinwall\") === \"strong\") {\n        issues.push({\n          field: \"slender_or_thinwall\",\n          message: \"Strongly slender or thin-wall parts rarely support aggressive productivity-biased turning.\",\n          severity: \"warning\",\n          code: \"turning_thinwall_productivity\",\n        });\n      }\n      if (wiperAllowed === \"yes\" && turnMode === \"internal\" && (overhangClass === \"long\" || overhangClass === \"critical\")) {\n        issues.push({\n          field: \"wiper_allowed\",\n          message: \"Wiper geometry is risky in internal turning with long overhang.\",\n          severity: \"warning\",\n          code: \"turning_wiper_internal_overhang\",\n        });\n      }\n      if (targetRoughnessUm != null && targetRoughnessUm < 1 && phase !== \"finishing\") {\n        issues.push({\n          field: \"target_roughness\",\n          message: \"Sub-micron roughness targets usually require a finishing-focused turning strategy.\",\n          severity: \"warning\",\n          code: \"turning_roughness_phase_conflict\",\n        });\n      }\n      if (diameterMm != null && apMm != null && diameterMm > 0 && apMm / diameterMm > 0.2) {\n        issues.push({\n          field: \"ap_mm\",\n          message: \"Requested depth of cut is very high relative to the stated workpiece diameter.\",\n          severity: \"warning\",\n          code: \"turning_high_ap_ratio\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"diameter_turning\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var turningTools = toolkits.turning;\n      var turnMode = getTurnMode(ctx);\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var diameterMm = toNullableNumber(getAnswer(ctx, \"workpiece_diameter_mm\"));\n      var apMm = toNullableNumber(getAnswer(ctx, \"ap_mm\"));\n      var surfacePriority = getSurfacePriority(ctx);\n      var slenderClass = toNullableString(getAnswer(ctx, \"slender_or_thinwall\")) || \"no\";\n      var shoulderAccess = getShoulderAccess(ctx);\n      var coolantClass = toNullableString(getAnswer(ctx, \"coolant_class\")) || \"unknown\";\n      var noseRadiusLimitMm = toNullableNumber(getAnswer(ctx, \"nose_radius_limit\"));\n      var wiperAllowed = toNullableString(getAnswer(ctx, \"wiper_allowed\")) || \"unknown\";\n      var overhangClass = getOverhangClass(ctx);\n      var targetRoughnessUm = toNullableNumber(getAnswer(ctx, \"target_roughness\"));\n      var isoGroup = getIsoGroup(ctx);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = turningTools.resolveRows(candidate, ctx);\n        var row = selectBestRow(rows, phase);\n        var recipeResult = turningTools.resolveRecipe(candidate, ctx);\n        var recipe = row && row.recipe ? row.recipe : recipeResult.recipe;\n        var recipeSource = recipeResult.source;\n        var insertIcMm = toNullableNumber(candidate.turning.turnSizeIcMm) || toNullableNumber(candidate.common.diameterMm);\n        var noseRadiusMm = toNullableNumber(candidate.turning.turnNoseRadiusMm);\n        var candidatePolarity = getCandidatePolarity(candidate);\n        var candidateShapeCode = toNullableString(candidate.turning.turnShapeCode) || \"?\";\n        var stageFit = stageFitScore(phase, row);\n        var polarityBias = inferPolarityBias(turnMode, slenderClass, interruption, phase, surfacePriority, materialRefinement, isoGroup);\n        var polarityFit = polarityFitScore(polarityBias, candidatePolarity);\n        var rigidityRiskClass = classifyRigidityRisk(turnMode, slenderClass, overhangClass, apMm, diameterMm, noseRadiusMm);\n        var rigidityFit = rigidityScore(rigidityRiskClass, candidatePolarity, noseRadiusMm, slenderClass);\n        var accessFit = shapeAccessScore(candidateShapeCode, shoulderAccess);\n        var noseFit = noseRadiusFitScore(noseRadiusMm, noseRadiusLimitMm, surfacePriority, phase, rigidityRiskClass, shoulderAccess);\n        var recipeFnTyp = recipe && recipe.fn ? toNullableNumber(recipe.fn.typ) : null;\n        var recipeVcTyp = recipe && recipe.vc ? toNullableNumber(recipe.vc.typ) : null;\n        var chipControlRisk = classifyChipControlRisk(materialRefinement, coolantClass, phase, interruption, apMm, recipeFnTyp);\n        var chipControlFit = chipRiskScore(chipControlRisk);\n        var coolingSupportClass = classifyCoolingSupport(materialRefinement, coolantClass, Boolean(candidate.common.coolantTsc), isoGroup);\n        var coolingFit = coolingScore(coolingSupportClass);\n        var wiperSuitabilityClass = classifyWiperSuitability(surfacePriority, phase, turnMode, overhangClass, rigidityRiskClass, wiperAllowed, shoulderAccess);\n        var theoreticalRoughnessUm = computeTheoreticalRoughnessUm(recipeFnTyp, noseRadiusMm);\n        var finishFeasibility = classifyFinishFeasibility(surfacePriority, phase, rigidityRiskClass, wiperSuitabilityClass, theoreticalRoughnessUm, targetRoughnessUm);\n        var finishFit = finishScore(finishFeasibility, surfacePriority);\n        var specialCuttingMaterialRoute = classifySpecialMaterialRoute(isoGroup, materialRefinement, phase, surfacePriority);\n        var insertSizeFit = 0.72;\n        var rpmTyp = diameterMm != null && diameterMm > 0 && recipeVcTyp != null ? recipeVcTyp * 1000 / (Math.PI * diameterMm) : null;\n        var feedSpeedMmMin = recipeFnTyp != null && rpmTyp != null ? recipeFnTyp * rpmTyp : null;\n        var mrrCm3Min = apMm != null && recipeFnTyp != null && recipeVcTyp != null ? apMm * recipeFnTyp * recipeVcTyp : null;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidenceBase;\n        var confidence;\n        var metrics;\n    \n        if (rows.length === 0 && candidate.stage === \"detail\") {\n          hardRejectReason = \"No turning row is available for diameter turning.\";\n        }\n        if (!hardRejectReason && turnMode === \"internal\" && diameterMm != null && insertIcMm != null && insertIcMm >= diameterMm) {\n          hardRejectReason = \"Insert size exceeds the requested internal turning diameter.\";\n        }\n        if (!hardRejectReason && noseRadiusLimitMm != null && noseRadiusMm != null && noseRadiusMm > noseRadiusLimitMm) {\n          hardRejectReason = \"Insert nose radius exceeds the allowed contour radius.\";\n        }\n    \n        if (turnMode === \"internal\" && diameterMm != null && insertIcMm != null && insertIcMm > 0) {\n          insertSizeFit = clamp((diameterMm - insertIcMm) / Math.max(diameterMm, 0.01) * 1.6 + 0.35, 0, 1);\n        } else if (apMm != null && insertIcMm != null && insertIcMm > 0) {\n          insertSizeFit = apMm <= insertIcMm * 0.45 ? 1 : apMm <= insertIcMm * 0.8 ? 0.74 : 0.45;\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          rowMatch: row ? 1 : 0,\n          stage: stageFit * 1.2,\n          insertSize: insertSizeFit,\n          polarity: polarityFit * 1.15,\n          access: accessFit * 0.95,\n          noseRadius: noseFit * 1.05,\n          rigidity: rigidityFit * 1.35,\n          chipControl: chipControlFit * 1.1,\n          cooling: coolingFit * 0.85,\n          finish: finishFit * (surfacePriority === \"surface\" ? 1.15 : 0.85),\n          riskPenalty: -(kernel.risk(candidate, ctx) || 0),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidenceBase = { exact: 0.92, near: 0.8, estimated: 0.66, none: 0.48 }[recipeSource] || 0.48;\n        confidence = confidenceBase;\n        if (rigidityRiskClass === \"high\") confidence -= 0.12;\n        if (rigidityRiskClass === \"critical\") confidence -= 0.24;\n        if (chipControlRisk === \"high\") confidence -= 0.08;\n        if (chipControlRisk === \"critical\") confidence -= 0.16;\n        confidence = hardRejectReason ? 0 : clamp(confidence, 0.2, 0.98);\n    \n        metrics = Object.assign({}, turningTools.getSharedMetrics(candidate, ctx), {\n          requestedTurnMode: turnMode,\n          requestedOperationPhase: phase,\n          requestedMaterialRefinement: materialRefinement,\n          requestedCutInterruption: interruption,\n          requestedWorkpieceDiameterMm: diameterMm,\n          requestedApMm: apMm,\n          requestedSurfacePriority: surfacePriority,\n          requestedSlenderOrThinwall: slenderClass,\n          requestedShoulderAccess: shoulderAccess,\n          requestedCoolantClass: coolantClass,\n          requestedNoseRadiusLimitMm: noseRadiusLimitMm,\n          requestedWiperAllowed: wiperAllowed,\n          requestedOverhangClass: overhangClass,\n          requestedTargetRoughnessUm: targetRoughnessUm,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          insertIcMm: insertIcMm,\n          noseRadiusMm: noseRadiusMm,\n          candidatePolarity: candidatePolarity,\n          candidateShapeCode: candidateShapeCode,\n          rigidityRiskClass: rigidityRiskClass,\n          positiveNegativeBias: polarityBias,\n          chipControlRisk: chipControlRisk,\n          coolingSupportClass: coolingSupportClass,\n          wiperSuitabilityClass: wiperSuitabilityClass,\n          finishFeasibility: finishFeasibility,\n          specialCuttingMaterialRoute: specialCuttingMaterialRoute,\n          theoreticalRoughnessUm: theoreticalRoughnessUm,\n          stageFitScore: stageFit,\n          polarityFitScore: polarityFit,\n          insertSizeFitScore: insertSizeFit,\n          accessFitScore: accessFit,\n          noseRadiusFitScore: noseFit,\n          rpmTyp: rpmTyp,\n          feedSpeedMmMin: feedSpeedMmMin,\n          mrrCm3Min: mrrCm3Min,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeSource,\n          reasons: buildReasonList(metrics),\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/drilling-blind/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/drilling-blind/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/drilling-blind/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/drilling-blind/presenter.js\");\n    exports.default = createStubProcessModule(\"drilling_blind\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/drilling-blind/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, heroRecommendation, holeSummary, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, toleranceNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { getTroubleshootingEntries } = __bundle.require(\"core/troubleshooting-library.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function ensureSentence(value) {\n      var text = String(value || \"\").trim();\n      if (!text) return null;\n      return /[.!?]$/.test(text) ? text : text + \".\";\n    }\n    \n    function cleanShortText(value) {\n      return String(value || \"\").replace(/\\s+/g, \" \").trim();\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = cleanShortText(item);\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(0);\n    }\n    \n    function appendUniqueHandle(handles, handle) {\n      if (!handle || handles.indexOf(handle) >= 0) return;\n      handles.push(handle);\n    }\n    \n    function getMaterialProfile(ctx) {\n      return ctx && ctx.material ? ctx.material.profile : null;\n    }\n    \n    function getMaterialLabel(ctx) {\n      var profile = getMaterialProfile(ctx);\n      return profile ? profile.code + \" - \" + profile.label : (ctx && ctx.material ? ctx.material.subgroupCode : null);\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative blind-hole drill option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildTroubleshootingHandles(ctx, top) {\n      var metrics = top.metrics || {};\n      var handles = [];\n    \n      if (metrics.entryRiskClass === \"high\") appendUniqueHandle(handles, \"drill-skids-on-inclined-curved-surface\");\n      if (metrics.holePassability === \"interrupted\") appendUniqueHandle(handles, \"drill-breakage\");\n      if (metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\") appendUniqueHandle(handles, \"chips-pack-in-deep-holes\");\n      if (metrics.qualityFeasibilityClass === \"precision_risk\" || metrics.qualityFeasibilityClass === \"not_credible\") appendUniqueHandle(handles, \"surface-finish-not-acceptable\");\n      if (metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\") appendUniqueHandle(handles, \"spindle-at-power-limit-or-stalls\");\n      if (metrics.bottomFormFeasibilityStatus === \"unproven\") appendUniqueHandle(handles, \"surface-finish-not-acceptable\");\n      if (!handles.length) {\n        appendUniqueHandle(handles, metrics.requestedDepthRatio != null && metrics.requestedDepthRatio > 3 ? \"chips-pack-in-deep-holes\" : \"drill-breakage\");\n        appendUniqueHandle(handles, \"surface-finish-not-acceptable\");\n      }\n    \n      return handles.slice(0, 2);\n    }\n    \n    function buildTroubleshootingCards(ctx, top) {\n      return getTroubleshootingEntries(buildTroubleshootingHandles(ctx, top)).map(function mapEntry(entry) {\n        var focusFlags = [];\n        if (entry.rootWorkholding) focusFlags.push(\"workholding\");\n        if (entry.rootMachinePower) focusFlags.push(\"machine power\");\n        if (entry.rootPreprocessing) focusFlags.push(\"pre-processing\");\n        return {\n          title: entry.problem,\n          tone: entry.problemCategory === \"Process Stability\" || entry.rootMachinePower ? \"high\" : \"watch\",\n          eyebrow: \"Focused response\",\n          category: entry.problemCategory || \"Troubleshooting\",\n          wear: entry.dominantToolWear || null,\n          checkFirst: focusFlags,\n          cause: ensureSentence(entry.cause),\n          actions: (entry.actions || []).slice(0, 4).map(cleanShortText).filter(Boolean),\n          note: entry.alternativeProcess ? ensureSentence(entry.alternativeProcess) : null,\n          items: [],\n        };\n      });\n    }\n    \n    function buildRiskItems(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n    \n      if (metrics.coolantCapabilityClass === \"weak\" || metrics.coolantCapabilityClass === \"poor\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Coolant support\",\n          message: \"Coolant support is narrow for blind-hole drilling at this depth and material behavior.\",\n        });\n      }\n      if (metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Chip evacuation\",\n          message: \"Chip evacuation near the hole bottom is one of the main release limits in this setup. Qualify chip form and chip packing before increasing output.\",\n        });\n      }\n      if (metrics.entryRiskClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Entry stability\",\n          message: \"The entry surface is not naturally stable. Spotting or a reduced entry feed should be part of the first-part plan.\",\n        });\n      }\n      if (metrics.bottomFormFeasibilityStatus === \"unproven\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Bottom requirement\",\n          message: metrics.bottomFormFeasibilityLabel || \"The requested bottom form is not cleanly covered by a standard blind-hole drill.\",\n        });\n      }\n      if (metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Machine load\",\n          message: \"The combined depth, material and coolant window pushes machine load high. Keep the shortest possible drill and avoid releasing aggressively too early.\",\n        });\n      }\n      if (metrics.qualityFeasibilityClass === \"not_credible\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Quality target\",\n          message: \"The requested quality target is not credible under the current blind-hole drilling conditions without improving the route.\",\n        });\n      }\n    \n      return items.slice(0, 4);\n    }\n    \n    function buildMachineChecks(ctx, top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"coolant\",\n          label: \"Coolant capability\",\n          result: metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\" ? \"pass\" : metrics.coolantCapabilityClass === \"weak\" ? \"limited\" : \"fail\",\n          note: (metrics.requestedCoolantLabel || \"Coolant mode not confirmed\") + (metrics.candidateHasTsc ? \" with TSC-capable tool.\" : \".\"),\n        },\n        {\n          key: \"setup\",\n          label: \"Setup stability\",\n          result: metrics.setupStability === \"strong\" ? \"pass\" : metrics.setupStability === \"weak\" ? \"fail\" : \"limited\",\n          note: titleCase(metrics.setupStability || \"medium\") + \" setup stability.\",\n        },\n        {\n          key: \"machine_load\",\n          label: \"Machine load\",\n          result: metrics.machineLoadSeverityClass === \"light\" || metrics.machineLoadSeverityClass === \"normal\" ? \"pass\" : metrics.machineLoadSeverityClass === \"high\" ? \"limited\" : \"fail\",\n          note: metrics.machineLoadSeverityLabel || \"Machine load not confirmed.\",\n        },\n      ];\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n        { key: \"fn\", label: \"fn\", min: metrics.recipeFnMin, typ: metrics.recipeFnTyp, max: metrics.recipeFnMax, unit: \"mm/rev\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildRowBackedValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { label: \"Depth class\", value: metrics.rowDepthClass || metrics.requestedDepthClass || \"n/a\", tone: \"text\" },\n        { label: \"Coolant\", value: metrics.rowCoolantMode ? titleCase(metrics.rowCoolantMode) : \"n/a\", tone: \"text\" },\n        { label: \"vc min\", value: formatDisplayNumber(metrics.recipeVcMin, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"vc max\", value: formatDisplayNumber(metrics.recipeVcMax, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"fn min\", value: formatDisplayNumber(metrics.recipeFnMin, 2) || \"n/a\", unit: \"mm/rev\" },\n        { label: \"fn typ\", value: formatDisplayNumber(metrics.recipeFnTyp, 2) || \"n/a\", unit: \"mm/rev\" },\n        { label: \"fn max\", value: formatDisplayNumber(metrics.recipeFnMax, 2) || \"n/a\", unit: \"mm/rev\" },\n      ];\n    }\n    \n    function buildMachineValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { label: \"N\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n        { label: \"VF\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n        { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n        { label: \"Time\", value: formatDisplayNumber(metrics.cycleTimeSec, 1) || \"n/a\", unit: \"sec\" },\n        { label: \"Peck\", value: titleCase(metrics.peckNecessityClass || \"review\"), tone: \"text\" },\n      ];\n    }\n    \n    function buildRecipeTrustCard(top) {\n      var confidence = top.score.recipeConfidence;\n      return {\n        title: \"Cutting-data basis\",\n        tone: confidence === \"exact\" ? \"good\" : confidence === \"near\" ? \"limited\" : \"default\",\n        badge: confidence === \"exact\" ? \"Exact valid drill row\" : confidence === \"near\" ? \"Nearest valid drill row\" : \"Estimated\",\n        value: confidence === \"exact\"\n          ? \"The starting band comes from a matching blind-hole drilling row for the current material, coolant route and depth class.\"\n          : confidence === \"near\"\n            ? \"The starting band comes from the closest valid blind-hole row and is then translated to the requested diameter.\"\n            : \"The starting band leans more heavily on candidate fit and blind-hole drilling rules because the row match is weaker.\",\n        note: \"vc and fn stay row-backed. rpm, feed speed and MRR are then derived from the requested diameter.\",\n        items: [],\n      };\n    }\n    \n    function buildDepthReachCard(top) {\n      var metrics = top.metrics || {};\n      var tone = metrics.usableLengthMarginMm != null && metrics.usableLengthMarginMm >= 2 && metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 2 ? \"good\" : metrics.usableLengthMarginMm != null && metrics.usableLengthMarginMm >= 0 && metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"limited\" : \"high\";\n    \n      return {\n        title: \"Depth & reach\",\n        tone: tone,\n        badge: metrics.requestedDepthClass || \"Depth review\",\n        value: metrics.requestedDepthRatio != null\n          ? \"The requested \" + formatDisplayNumber(metrics.requestedDepthRatio, 2) + \"xD blind hole stays inside the tool depth window with the current row and candidate reach.\"\n          : \"Depth and reach fit look workable for the requested blind hole.\",\n        note: dedupeTextItems([\n          metrics.usableLengthMarginMm != null ? \"Usable-length margin \" + formatDisplayNumber(metrics.usableLengthMarginMm, 2) + \" mm\" : null,\n          metrics.apmxMarginMm != null ? \"APMX margin \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm\" : null,\n        ]).join(\" / \"),\n        items: dedupeTextItems([\n          metrics.requestedDepthMm != null ? \"Requested drilling depth: \" + formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm.\" : null,\n          metrics.candidateUsableLengthMm != null ? \"Usable length: \" + formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm.\" : null,\n          metrics.candidateApmxMm != null ? \"APMX: \" + formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm.\" : null,\n        ]).slice(0, 3),\n      };\n    }\n    \n    function buildBottomCard(top) {\n      var metrics = top.metrics || {};\n      return {\n        title: \"Blind-hole bottom\",\n        tone: metrics.bottomFormFeasibilityStatus === \"good\" ? \"good\" : metrics.bottomFormFeasibilityStatus === \"conditional\" ? \"limited\" : \"high\",\n        badge: metrics.requestedBottomRequirementLabel || \"Bottom review\",\n        value: metrics.bottomFormFeasibilityLabel || \"Blind-hole bottom credibility is still under review.\",\n        note: metrics.bottomFormFeasibilityNote || \"Bottom geometry is not fully confirmed.\",\n        items: dedupeTextItems([\n          metrics.requestedBottomRequirementLabel ? \"Requested bottom: \" + metrics.requestedBottomRequirementLabel + \".\" : null,\n          metrics.candidatePointAngleDeg != null ? \"Current point angle: \" + formatDisplayNumber(metrics.candidatePointAngleDeg, 0) + \" deg.\" : null,\n          metrics.peckNecessityLabel ? \"Cycle guidance: \" + metrics.peckNecessityLabel + \".\" : null,\n        ]),\n      };\n    }\n    \n    function buildStoryData(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var why = dedupeTextItems([\n        metrics.requestedDepthRatio != null && metrics.rowDepthClass ? \"Requested \" + formatDisplayNumber(metrics.requestedDepthRatio, 2) + \"xD stays inside the \" + metrics.rowDepthClass + \" blind-hole drilling class.\" : null,\n        metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\" ? \"Coolant support stays workable for chip evacuation near the blind-hole bottom.\" : null,\n        metrics.chipEvacuationSeverityClass === \"low\" || metrics.chipEvacuationSeverityClass === \"medium\" ? \"Chip evacuation stays inside a controllable range for a standard blind-hole release.\" : null,\n        metrics.bottomFormFeasibilityStatus === \"good\" ? \"The requested bottom condition stays credible with the current drill geometry.\" : null,\n        materialProfile && materialProfile.chipForm ? \"Material profile points to \" + String(materialProfile.chipForm).toLowerCase() + \" chip behavior, which matches the current drilling strategy.\" : null,\n      ]);\n      var how = dedupeTextItems([\n        \"Start inside the suggested vc and fn band and qualify the first blind holes before increasing output.\",\n        metrics.peckNecessityClass === \"none\" ? \"Prefer a continuous cycle first; only add pecking if chips stop clearing cleanly near the bottom.\" : null,\n        metrics.peckNecessityClass === \"recommended\" ? \"Start with a light peck strategy because chip control needs more help than a short free-cutting blind-hole case.\" : null,\n        metrics.peckNecessityClass === \"necessary\" ? \"Plan for a pecking strategy up front because the current chip-evacuation window is too narrow for a casual continuous cycle.\" : null,\n        metrics.entryRiskClass === \"high\" ? \"Reduce feed at entry or use a spot/pilot strategy because the entry surface is not naturally stable.\" : null,\n        metrics.bottomFormFeasibilityStatus !== \"good\" ? \"Keep the first holes conservative and inspect bottom condition before treating the process as released.\" : null,\n      ]);\n      var watch = dedupeTextItems([\n        metrics.coolantCapabilityClass === \"weak\" || metrics.coolantCapabilityClass === \"poor\" ? \"This coolant route is the main release limiter at the requested blind-hole depth.\" : null,\n        metrics.holePassability === \"interrupted\" ? \"Interrupted blind holes raise the risk of edge chipping, drift and chip packing.\" : null,\n        metrics.bottomFormFeasibilityStatus === \"unproven\" ? \"The requested bottom form is not cleanly covered by a standard V-bottom drill.\" : null,\n        metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\" ? \"Machine load rises quickly in this setup, so keep the shortest possible drill and avoid aggressive first-part release.\" : null,\n        materialProfile && materialProfile.typicalFailure ? \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure).toLowerCase() + \".\" : null,\n      ]);\n      return { why: why, how: how, watch: watch };\n    }\n    \n    function buildStoryPanels(ctx, top, riskItems, storyData) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      return {\n        why: {\n          tone: \"good\",\n          eyebrow: \"Technical fit\",\n          title: \"Why it fits\",\n          badge: \"Depth: \" + (metrics.rowDepthClass || metrics.requestedDepthClass || \"review\"),\n          highlight: metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\"\n            ? \"Depth class, reach reserve and coolant window support a credible blind-hole drilling release.\"\n            : \"The basic tool fit is there, but coolant support narrows the safe release window for this blind-hole case.\",\n          summary: \"Blind-hole drilling is driven mainly by diameter fit, depth class, chip evacuation near the bottom, coolant route and bottom-form credibility rather than breakthrough behavior.\",\n          facts: dedupeTextItems([\n            metrics.requestedDiameterMm != null ? \"D \" + formatDisplayNumber(metrics.requestedDiameterMm, 2) + \" mm\" : null,\n            metrics.requestedDepthRatio != null ? formatDisplayNumber(metrics.requestedDepthRatio, 2) + \"xD\" : null,\n            metrics.requestedBottomRequirementLabel || null,\n          ]),\n          items: storyData.why.slice(0, 3),\n        },\n        how: {\n          tone: \"default\",\n          eyebrow: \"Start strategy\",\n          title: \"How to start\",\n          badge: metrics.peckNecessityClass === \"none\" ? \"Continuous cycle preferred\" : metrics.peckNecessityClass === \"recommended\" ? \"Peck recommended\" : \"Peck likely necessary\",\n          highlight: metrics.bottomFormFeasibilityStatus === \"unproven\"\n            ? \"Treat bottom condition as a first-part check, not as an assumption.\"\n            : \"Keep entry calm, watch chip shape early and qualify the first full blind-hole depth before increasing output.\",\n          summary: \"The safest first release usually comes from stable chip evacuation, a short drill, calm entry and realistic bottom-form expectations rather than chasing vc first.\",\n          facts: dedupeTextItems([\n            metrics.recipeVcTyp != null ? \"vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min\" : null,\n            metrics.recipeFnTyp != null ? \"fn typ \" + formatDisplayNumber(metrics.recipeFnTyp, 2) + \" mm/rev\" : null,\n            metrics.rpmTyp != null ? \"n \" + formatDisplayNumber(metrics.rpmTyp, 0) + \" rpm\" : null,\n            metrics.feedTypMmMin != null ? \"vf \" + formatDisplayNumber(metrics.feedTypMmMin, 0) + \" mm/min\" : null,\n          ]),\n          items: storyData.how.slice(0, 3),\n        },\n        watch: {\n          tone: riskItems.length > 1 || metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\" ? \"watch\" : \"default\",\n          eyebrow: \"Critical signals\",\n          title: \"Watch-outs\",\n          badge: \"Risk: \" + titleCase(metrics.chipEvacuationSeverityClass || \"medium\"),\n          highlight: metrics.bottomFormFeasibilityStatus === \"unproven\"\n            ? \"Bottom-form credibility is the main release limiter in this setup.\"\n            : metrics.coolantCapabilityClass === \"weak\" || metrics.coolantCapabilityClass === \"poor\"\n              ? \"Coolant support is the main release limiter in this setup.\"\n              : \"Chip evacuation and setup stability still decide whether this blind-hole case stays robust in series.\",\n          summary: materialProfile && materialProfile.avoid ? ensureSentence(materialProfile.avoid) : \"Qualify the first parts conservatively before increasing output.\",\n          facts: dedupeTextItems([\n            metrics.chipEvacuationSeverityClass ? \"Chip control: \" + titleCase(metrics.chipEvacuationSeverityClass) : null,\n            metrics.machineLoadSeverityClass ? \"Load: \" + titleCase(metrics.machineLoadSeverityClass) : null,\n            materialProfile && materialProfile.typicalFailure ? \"Typical failure: \" + cleanShortText(materialProfile.typicalFailure) : null,\n          ]),\n          items: storyData.watch.slice(0, 3),\n        },\n      };\n    }\n    \n    function buildRefineData(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n    \n      if (metrics.entryRiskClass === \"high\" && !getAnswer(ctx, \"pilot_spot_status\")) items.push({ questionId: \"pilot_spot_status\", label: \"Confirm spot or pilot status\" });\n      if (!getAnswer(ctx, \"setup_stability\")) items.push({ questionId: \"setup_stability\", label: \"Confirm setup stability\" });\n      if ((metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\") && !getAnswer(ctx, \"machine_torque_capability\")) items.push({ questionId: \"machine_torque_capability\", label: \"Confirm torque reserve\" });\n      if (!getAnswer(ctx, \"tolerance_level\")) items.push({ questionId: \"tolerance_level\", label: \"Confirm quality target\" });\n    \n      return {\n        visible: items.length > 0 && (top.score.confidence < 0.9 || top.score.recipeConfidence !== \"exact\" || metrics.qualityFeasibilityClass === \"precision_risk\" || metrics.qualityFeasibilityClass === \"not_credible\"),\n        title: \"Improve recommendation confidence\",\n        description: \"Confirm one missing setup detail to tighten the blind-hole drilling strategy and reduce estimation around entry, machine limits or quality credibility.\",\n        items: items.slice(0, 2),\n      };\n    }\n    \n    function buildDetailPanels(top, alternativeItems) {\n      var metrics = top.metrics || {};\n      var panels = [];\n    \n      panels.push({\n        eyebrow: \"Technical basis\",\n        title: \"Why this starting band is credible\",\n        summary: top.score.recipeConfidence === \"exact\"\n          ? \"The start values come from a matching blind-hole drilling row and are then converted into rpm and feed speed at the requested diameter.\"\n          : \"The start values use the nearest valid blind-hole drilling row and stay anchored to diameter, depth class and coolant reality.\",\n        facts: dedupeTextItems([\n          metrics.rowDepthClass ? \"Depth class \" + metrics.rowDepthClass : null,\n          metrics.requestedCoolantLabel || null,\n          metrics.recipeVcTyp != null ? \"vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min\" : null,\n          metrics.recipeFnTyp != null ? \"fn typ \" + formatDisplayNumber(metrics.recipeFnTyp, 2) + \" mm/rev\" : null,\n        ]),\n        items: dedupeTextItems([\n          metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\"\n            ? \"Coolant support is credible enough for the requested blind-hole depth and material window.\"\n            : \"Coolant support stays narrow enough that the first parts matter more than the paper recipe.\",\n          metrics.usableLengthMarginMm != null ? \"Usable-length margin stays at \" + formatDisplayNumber(metrics.usableLengthMarginMm, 2) + \" mm.\" : null,\n          metrics.apmxMarginMm != null ? \"APMX margin stays at \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm.\" : null,\n          metrics.candidateHasTsc ? \"The selected drill can actually support internal coolant if the machine can deliver it.\" : null,\n        ]),\n      });\n    \n      panels.push({\n        eyebrow: \"Release checks\",\n        title: \"What to verify before full release\",\n        summary: \"Only keep increasing output once the first holes confirm chip control, blind-hole depth repeatability and the bottom condition your next operation can accept.\",\n        facts: dedupeTextItems([\n          metrics.chipEvacuationSeverityClass ? \"Chip control \" + titleCase(metrics.chipEvacuationSeverityClass) : null,\n          metrics.bottomFormFeasibilityStatus ? \"Bottom fit \" + titleCase(metrics.bottomFormFeasibilityStatus) : null,\n          metrics.qualityFeasibilityClass ? \"Quality \" + titleCase(metrics.qualityFeasibilityClass) : null,\n        ]),\n        items: dedupeTextItems([\n          metrics.peckNecessityClass === \"recommended\" || metrics.peckNecessityClass === \"necessary\" ? \"Use pecking only as much as chip evacuation requires. A clean continuous cycle stays more productive when the chip window allows it.\" : \"Start without pecking unless the first chips prove otherwise.\",\n          metrics.entryRiskClass === \"high\" ? \"Stabilize the entry with spotting, a pilot or a reduced entry feed before treating the result as release-ready.\" : null,\n          metrics.bottomFormFeasibilityStatus !== \"good\" ? \"Inspect the bottom condition on the first holes before assuming the rest cone or flatness is acceptable.\" : null,\n          \"Keep the shortest drill and lowest runout you can realistically hold on the machine.\",\n        ]),\n      });\n    \n      panels.push({\n        type: \"alternatives\",\n        eyebrow: \"Alternatives\",\n        title: \"Alternatives worth checking\",\n        summary: \"If depth, coolant support or bottom-form credibility stay marginal, change route before forcing standard blind-hole drilling deeper into a red zone.\",\n        items: dedupeTextItems([\n          metrics.alternativePrimary === \"deep_hole_drilling\" ? JSON.stringify({ badge: \"Process fallback\", label: \"Deep-hole drilling\", reason: \"Move to a dedicated deep-hole route when blind-hole depth and coolant reality outrun a standard drilling window.\" }) : null,\n          metrics.alternativePrimary === \"flat_bottom_drill\" ? JSON.stringify({ badge: \"Geometry fallback\", label: \"Special flat-bottom drill\", reason: \"Use a dedicated bottom-form solution when a standard V-bottom drill cannot credibly satisfy the requested blind-hole bottom condition.\" }) : null,\n        ].concat((alternativeItems || []).map(function mapItem(item) {\n          return JSON.stringify({ badge: \"Tool option\", label: item.label, reason: item.reason });\n        }))).map(function parseItem(text) {\n          try {\n            return JSON.parse(text);\n          } catch (error) {\n            return null;\n          }\n        }).filter(Boolean),\n      });\n    \n      return panels;\n    }\n    \n    function buildSetupNotes(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      return [\n        { area: \"drilling\", message: \"blind-hole drilling at \" + (metrics.requestedDepthRatio != null ? formatDisplayNumber(metrics.requestedDepthRatio, 2) + \"xD\" : \"unknown xD\") + \" with row class \" + (metrics.rowDepthClass || \"not confirmed\") },\n        { area: \"coolant\", message: (metrics.requestedCoolantLabel || \"coolant not confirmed\") + \", capability \" + titleCase(metrics.coolantCapabilityClass || \"review\") + \", peck \" + titleCase(metrics.peckNecessityClass || \"review\") },\n        { area: \"entry\", message: \"entry \" + titleCase(metrics.requestedEntryConditionLabel || \"unknown\") + \", hole \" + titleCase(metrics.holePassabilityLabel || \"unknown\") },\n        { area: \"bottom\", message: (metrics.requestedBottomRequirementLabel || \"bottom not confirmed\") + \", fit \" + titleCase(metrics.bottomFormFeasibilityStatus || \"review\") },\n        { area: \"quality\", message: \"target \" + titleCase(metrics.requestedToleranceLevelLabel || \"general\") + \", feasibility \" + titleCase(metrics.qualityFeasibilityClass || \"review\") },\n        { area: \"material\", message: materialProfile ? materialProfile.code + \" - \" + materialProfile.label + \", typical failure \" + cleanShortText(materialProfile.typicalFailure || \"not stated\") : \"material profile not available\" },\n        { area: \"troubleshooting\", message: \"focused troubleshooting loaded for \" + buildTroubleshootingHandles(ctx, top).length + \" likely issue paths\" },\n      ];\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var alternativeItems;\n      var riskItems;\n      var machineChecks;\n      var storyData;\n      var storyPanels;\n      var troubleshooting;\n      var heroBlock;\n      var holeBlock;\n      var kpiBlock;\n      var toleranceBlock;\n      var recipeBlock;\n      var riskBlock;\n      var machineBlock;\n      var setupBlock;\n      var alternativesBlock;\n      var commerceBlock;\n    \n      if (!top || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"drilling_blind\",\n          outcome: \"no_match\",\n          summary: \"No safe blind-hole drilling recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current setup is incomplete or incompatible for a safe blind-hole drilling recommendation.\"),\n            noMatchGuidance({\n              message: \"Check diameter, real drilling depth, coolant route, entry condition, interruption risk and the actual bottom requirement. If chip evacuation or bottom-form credibility stay too narrow, move to a dedicated deep-hole or special bottom-form route first.\",\n              steps: [\n                \"Confirm the exact hole diameter and true drilling depth.\",\n                \"Verify coolant reality, especially if depth moves beyond about 3xD.\",\n                \"Clarify whether the hole stays solid or becomes interrupted on the way down.\",\n                \"Confirm whether a standard conical bottom is acceptable or a flatter bottom is functionally required.\",\n                \"Switch to a dedicated deep-hole or special flat-bottom route when standard blind-hole drilling no longer stays credible.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust drilling setup\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      alternativeItems = buildAlternativeItems(scored);\n      riskItems = buildRiskItems(ctx, top);\n      machineChecks = buildMachineChecks(ctx, top);\n      storyData = buildStoryData(ctx, top);\n      storyPanels = buildStoryPanels(ctx, top, riskItems, storyData);\n      troubleshooting = buildTroubleshootingCards(ctx, top);\n    \n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best fit for \" + (metrics.requestedDiameterMm != null ? formatDisplayNumber(metrics.requestedDiameterMm, 2) + \" mm\" : \"the requested diameter\") + \" Blind-Hole Drilling in \" + (getMaterialLabel(ctx) || \"the selected material\") + \".\",\n        headerPills: [\n          { tone: \"good\", text: \"Best fit\" },\n          { tone: top.score.confidence >= 0.88 ? \"good\" : top.score.confidence >= 0.75 ? \"default\" : \"watch\", text: \"Confidence: \" + (top.score.confidence >= 0.88 ? \"High\" : top.score.confidence >= 0.75 ? \"Medium\" : \"Review\") },\n          { tone: metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\" ? \"watch\" : \"default\", text: \"Chip control: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") },\n          { tone: metrics.bottomFormFeasibilityStatus === \"good\" ? \"good\" : metrics.bottomFormFeasibilityStatus === \"conditional\" ? \"default\" : \"watch\", text: \"Bottom: \" + titleCase(metrics.bottomFormFeasibilityStatus || \"review\") },\n        ],\n      };\n    \n      holeBlock = holeSummary({\n        diameterMm: metrics.requestedDiameterMm,\n        depthMm: metrics.requestedDepthMm,\n        depthRatio: metrics.requestedDepthRatio,\n        blindThrough: \"blind\",\n      });\n    \n      kpiBlock = fitKpis([\n        { key: \"diameter_fit\", label: \"Diameter fit\", value: (top.score.parts.diameter || 0).toFixed(2), status: (top.score.parts.diameter || 0) >= 2.1 ? \"good\" : \"ok\" },\n        { key: \"depth_capability\", label: \"Depth capability\", value: ((top.score.parts.depthClass || 0) + (top.score.parts.reach || 0)).toFixed(2), status: metrics.rowDepthFitScore >= 0.95 ? \"good\" : \"ok\" },\n        { key: \"chip_control\", label: \"Chip control\", value: ((top.score.parts.coolant || 0) + (top.score.parts.chipControl || 0)).toFixed(2), status: metrics.chipEvacuationSeverityClass === \"low\" || metrics.chipEvacuationSeverityClass === \"medium\" ? \"good\" : \"ok\" },\n        { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.8 ? \"good\" : \"ok\" },\n      ]);\n    \n      toleranceBlock = toleranceNotes([\n        \"Quality target: \" + String(metrics.requestedToleranceLevelLabel || \"general\"),\n        \"Quality feasibility: \" + String(metrics.qualityFeasibilityLabel || \"review\"),\n        \"Bottom requirement: \" + String(metrics.requestedBottomRequirementLabel || \"unknown\"),\n        \"Bottom fit: \" + String(metrics.bottomFormFeasibilityLabel || \"review\"),\n      ]);\n    \n      recipeBlock = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: buildRecipeValues(top),\n      });\n      recipeBlock.data.presentation = {\n        title: \"Start here\",\n        description: \"Use these as the first safe blind-hole drilling values. vc and fn stay row-backed; rpm and feed speed are translated to the requested diameter.\",\n        rowBackedValues: buildRowBackedValues(top),\n        machineValues: buildMachineValues(top),\n        trustCard: buildRecipeTrustCard(top),\n        holePrepCard: buildBottomCard(top),\n        auxiliaryCard: buildDepthReachCard(top),\n      };\n    \n      riskBlock = riskNotes(riskItems);\n    \n      machineBlock = machineFeasibility(machineChecks);\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Coolant & setup\",\n          tone: metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\"\n            ? (metrics.setupStability === \"strong\" ? \"good\" : \"limited\")\n            : \"high\",\n          badge: metrics.coolantCapabilityClass === \"strong\" ? \"Strong window\" : metrics.coolantCapabilityClass === \"acceptable\" ? \"Workable\" : \"Risk\",\n          value: (metrics.requestedCoolantLabel || \"Coolant route not confirmed\") + \" with \" + titleCase(metrics.setupStability || \"medium\") + \" setup stability.\",\n          note: \"Blind-hole drilling stays most credible when chip evacuation, runout and bottom-form expectations all stay calm together.\",\n          items: dedupeTextItems(machineChecks.map(function mapCheck(item) {\n            return item.label + \": \" + item.note;\n          }).concat([\n            metrics.peckNecessityLabel ? \"Cycle guidance: \" + metrics.peckNecessityLabel + \".\" : null,\n            \"Keep the shortest possible drill and holder stack.\",\n          ])),\n        },\n      };\n    \n      setupBlock = setupNotes(buildSetupNotes(ctx, top));\n      setupBlock.data.presentation = {\n        stories: storyData,\n        storyPanels: storyPanels,\n        refine: buildRefineData(ctx, top),\n        detailPanels: buildDetailPanels(top, alternativeItems),\n        troubleshooting: troubleshooting,\n      };\n    \n      alternativesBlock = alternatives(alternativeItems);\n    \n      commerceBlock = commerceCta({\n        productUrl: candidate.catalog.url,\n        available: candidate.commerce.available,\n        priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n        ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n      });\n      commerceBlock.data.presentation = {\n        eyebrow: \"Order this tool\",\n        availabilityLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Ready to review\",\n        availabilityNote: candidate.ids.sku || \"\",\n      };\n    \n      return createResultViewModel({\n        processId: \"drilling_blind\",\n        outcome: top.score.total >= 5 ? \"match\" : \"limited_match\",\n        summary: \"Best blind-hole drilling match based on diameter, depth class, coolant capability, chip evacuation, bottom-form credibility and setup stability.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          holeBlock,\n          kpiBlock,\n          toleranceBlock,\n          recipeBlock,\n          riskBlock,\n          machineBlock,\n          setupBlock,\n          alternativesBlock,\n          commerceBlock,\n        ],\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust drilling setup\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/drilling-blind/questions.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { getQuestionDefinition } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function cloneQuestion(questionId, overrides) {\n      return createQuestionDef(Object.assign({}, getQuestionDefinition(questionId), overrides || {}));\n    }\n    \n    function getQuestions() {\n      return [\n        cloneQuestion(\"feature_diameter_mm\", {\n          label: \"Which blind-hole diameter do you need?\",\n          helpText: \"Why it matters: the requested diameter is the primary fit key for the drill candidate and the blind-hole recipe row.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"feature_depth_mm\", {\n          label: \"How deep does the blind hole need to drill?\",\n          helpText: \"Why it matters: true drilling depth drives the requested xD ratio, depth-class fit, usable-length margin, APMX margin and how much chip pressure builds near the hole bottom.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"coolant_capability\", {\n          label: \"Which coolant support is actually available?\",\n          helpText: \"Why it matters: blind-hole drilling is especially sensitive to chip evacuation and heat at the bottom, so coolant support directly affects process security.\",\n          type: \"chips\",\n          options: [\n            { value: \"through\", label: \"Internal coolant\" },\n            { value: \"external\", label: \"External coolant\" },\n            { value: \"mql\", label: \"MQL / mist\" },\n            { value: \"dry\", label: \"Dry\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"entry_condition\", {\n          label: \"What does the entry surface look like?\",\n          helpText: \"Why it matters: non-flat entry surfaces raise walking, chipping and straightness risk before the drill even reaches the blind-hole depth zone.\",\n          options: [\n            { value: \"flat\", label: \"Flat\" },\n            { value: \"angled\", label: \"Angled\" },\n            { value: \"convex\", label: \"Convex\" },\n            { value: \"concave\", label: \"Concave\" },\n            { value: \"uneven\", label: \"Uneven\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"hole_passability\", {\n          label: \"Is the hole solid all the way down or interrupted?\",\n          helpText: \"Why it matters: interrupted blind holes raise breakage and chip-packing risk because the cut destabilizes before the drill can clear the bottom cleanly.\",\n          options: [\n            { value: \"solid\", label: \"Solid / whole material\" },\n            { value: \"interrupted\", label: \"Interrupted / cross-hole\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"material_condition_class\", {\n          label: \"How does the selected material behave in practice?\",\n          helpText: \"Why it matters: the Step 1 ISO subgroup stays the baseline, but blind-hole drilling still needs one extra clue for chip behavior, adhesiveness or work-hardening in the real workpiece.\",\n          options: [\n            { value: \"standard\", label: \"Standard\" },\n            { value: \"tough_long_chipping\", label: \"Tough / long-chipping\" },\n            { value: \"sticky_bue\", label: \"Sticky / built-up edge\" },\n            { value: \"work_hardening\", label: \"Work-hardening\" },\n            { value: \"hard_abrasive\", label: \"Hard / abrasive\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"blind_bottom_type\", {\n          label: \"What bottom requirement does the blind hole have?\",\n          helpText: \"Why it matters: blind-hole drilling is not only about depth. The bottom form decides whether a standard V-bottom drill is credible or whether the process needs a tighter cone or a flatter bottom strategy.\",\n          type: \"chips\",\n          options: [\n            { value: \"standard_conical_ok\", label: \"Standard conical bottom is fine\" },\n            { value: \"small_rest_cone\", label: \"Small rest cone preferred\" },\n            { value: \"flat_bottom_required\", label: \"Flat bottom matters\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"priority\", {\n          label: \"What matters most?\",\n          helpText: \"Why it matters: this biases the ranking between a standard recommendation, tighter quality, higher process security or higher output.\",\n          group: \"advanced\",\n          required: false,\n          options: [\n            { value: \"balanced\", label: \"Standard\" },\n            { value: \"precision\", label: \"Accuracy\" },\n            { value: \"safety\", label: \"Process safety\" },\n            { value: \"productivity\", label: \"Productivity\" },\n          ],\n        }),\n        cloneQuestion(\"pilot_spot_status\", {\n          label: \"Is there already a spot or pilot hole?\",\n          helpText: \"Why it matters: spotting or a pilot hole can stabilize entry and early straightness, especially when the blind hole starts on a difficult surface.\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          options: [\n            { value: \"none\", label: \"No\" },\n            { value: \"spot_only\", label: \"Spot only\" },\n            { value: \"pilot_hole\", label: \"Pilot hole\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"setup_stability\", {\n          label: \"How stable are holder, machine and clamping?\",\n          helpText: \"Why it matters: stability and runout directly affect straightness, bottom repeatability, surface quality and breakage risk in blind holes.\",\n          group: \"machine\",\n          expertOnly: true,\n          required: false,\n          options: [\n            { value: \"strong\", label: \"Strong\" },\n            { value: \"medium\", label: \"Normal\" },\n            { value: \"weak\", label: \"Weak\" },\n          ],\n        }),\n        cloneQuestion(\"machine_torque_capability\", {\n          label: \"Is spindle power or torque a concern?\",\n          helpText: \"Why it matters: deeper blind holes in difficult materials can hit machine load limits before the recipe band becomes productive.\",\n          group: \"machine\",\n          expertOnly: true,\n          required: false,\n          options: [\n            { value: \"high\", label: \"No issue\" },\n            { value: \"medium\", label: \"Some limit\" },\n            { value: \"low\", label: \"Clearly limited\" },\n          ],\n        }),\n        cloneQuestion(\"tolerance_level\", {\n          label: \"How demanding is the hole-quality target?\",\n          helpText: \"Why it matters: straightness, finish and bottom repeatability decide how conservative the blind-hole recommendation should stay.\",\n          group: \"safety\",\n          expertOnly: true,\n          required: false,\n          options: [\n            { value: \"general\", label: \"General\" },\n            { value: \"tight\", label: \"Tight\" },\n            { value: \"high_precision\", label: \"High precision\" },\n          ],\n        }),\n      ];\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/drilling-blind/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp01(value) {\n      if (!Number.isFinite(value)) return 0;\n      return value <= 0 ? 0 : value >= 1 ? 1 : value;\n    }\n    \n    function roundValue(value, digits) {\n      var factor = Math.pow(10, digits == null ? 2 : digits);\n      return value == null || !Number.isFinite(value) ? null : Math.round(value * factor) / factor;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function normalizeCoolantCapability(value) {\n      switch (String(value || \"\").toLowerCase()) {\n        case \"through\": return \"through\";\n        case \"external\": return \"external\";\n        case \"mql\": return \"mist\";\n        case \"dry\": return \"dry\";\n        default: return \"unknown\";\n      }\n    }\n    \n    function getDepthClassFromRatio(ratio) {\n      if (ratio == null || !Number.isFinite(ratio) || ratio <= 0) return null;\n      if (ratio <= 3) return \"3xD\";\n      if (ratio <= 5) return \"5xD\";\n      if (ratio <= 8) return \"8xD\";\n      if (ratio <= 10) return \"10xD\";\n      return \"12xD\";\n    }\n    \n    function depthClassCapacity(value) {\n      var match = String(value || \"\").match(/^(\\d+(?:\\.\\d+)?)xD$/i);\n      return match ? Number(match[1]) : null;\n    }\n    \n    function collectMaterialCodes(row) {\n      var constraints = row && row.constraints ? row.constraints : {};\n      return []\n        .concat(constraints.materialCodes || [])\n        .concat(constraints.secondaryMaterialCodes || [])\n        .map(function mapCode(item) { return String(item || \"\").trim().toUpperCase(); })\n        .filter(Boolean);\n    }\n    \n    function materialMatchClass(row, materialCode) {\n      var requested = String(materialCode || \"\").trim().toUpperCase();\n      var family = requested ? requested.charAt(0) : null;\n      var rowCodes = collectMaterialCodes(row);\n      if (!requested || !rowCodes.length) return \"exact\";\n      if (rowCodes.indexOf(requested) >= 0) return \"exact\";\n      if (family && rowCodes.some(function someCode(code) { return code === family || code.charAt(0) === family; })) return \"near\";\n      return \"none\";\n    }\n    \n    function mapMaterialCondition(value) {\n      switch (String(value || \"\").toLowerCase()) {\n        case \"tough_long_chipping\":\n          return { code: \"tough_long_chipping\", label: \"Tough / long-chipping\" };\n        case \"sticky_bue\":\n          return { code: \"sticky_bue\", label: \"Sticky / built-up edge\" };\n        case \"work_hardening\":\n          return { code: \"work_hardening\", label: \"Work-hardening\" };\n        case \"hard_abrasive\":\n          return { code: \"hard_abrasive\", label: \"Hard / abrasive\" };\n        case \"unknown\":\n          return { code: \"unknown\", label: \"Unknown\" };\n        default:\n          return { code: \"standard\", label: \"Standard\" };\n      }\n    }\n    \n    function getBottomRequirementLabel(value) {\n      switch (String(value || \"\").toLowerCase()) {\n        case \"small_rest_cone\":\n          return \"Small rest cone preferred\";\n        case \"flat_bottom_required\":\n          return \"Flat bottom matters\";\n        case \"unknown\":\n          return \"Bottom requirement unknown\";\n        default:\n          return \"Standard conical bottom is fine\";\n      }\n    }\n    \n    function getMaterialDifficulty(materialGroup, materialConditionCode, materialProfile) {\n      var score = 0;\n      if (materialGroup === \"M\" || materialGroup === \"S\") score += 2;\n      if (materialGroup === \"H\") score += 3;\n      if (materialConditionCode === \"tough_long_chipping\" || materialConditionCode === \"sticky_bue\") score += 2;\n      if (materialConditionCode === \"work_hardening\" || materialConditionCode === \"hard_abrasive\") score += 2;\n      if (materialProfile && String(materialProfile.workHardening || \"\").toLowerCase().indexOf(\"high\") >= 0) score += 1;\n      if (materialProfile && String(materialProfile.buildUpEdgeTendency || \"\").toLowerCase().indexOf(\"high\") >= 0) score += 1;\n      if (materialProfile && String(materialProfile.abrasiveness || \"\").toLowerCase().indexOf(\"high\") >= 0) score += 1;\n      return score;\n    }\n    \n    function deriveCoolantCapability(materialGroup, requestedCoolant, candidateHasTsc, requestedRatio, materialConditionCode, materialProfile) {\n      var difficult = getMaterialDifficulty(materialGroup, materialConditionCode, materialProfile) >= 3;\n      var score = 0.4;\n    \n      switch (requestedCoolant) {\n        case \"through\":\n          score = candidateHasTsc ? 1 : 0.16;\n          break;\n        case \"external\":\n          if (requestedRatio == null || requestedRatio <= 2) score = difficult ? 0.52 : 0.72;\n          else if (requestedRatio <= 3) score = difficult ? 0.42 : 0.64;\n          else if (requestedRatio <= 5) score = difficult ? 0.24 : 0.42;\n          else if (requestedRatio <= 8) score = difficult ? 0.12 : 0.24;\n          else score = difficult ? 0.08 : 0.16;\n          break;\n        case \"mist\":\n          if (requestedRatio != null && requestedRatio <= 2 && !difficult) score = 0.42;\n          else if (requestedRatio != null && requestedRatio <= 3) score = 0.24;\n          else score = 0.12;\n          break;\n        case \"dry\":\n          if ((materialGroup === \"K\" || materialGroup === \"H\") && (requestedRatio == null || requestedRatio <= 2)) score = 0.42;\n          else score = 0.08;\n          break;\n        default:\n          score = difficult ? 0.26 : 0.4;\n          break;\n      }\n    \n      return {\n        code: score >= 0.85 ? \"strong\" : score >= 0.6 ? \"acceptable\" : score >= 0.35 ? \"weak\" : \"poor\",\n        label: score >= 0.85\n          ? \"Coolant window is strong for blind-hole drilling.\"\n          : score >= 0.6\n            ? \"Coolant window is workable for this blind-hole depth and material.\"\n            : score >= 0.35\n              ? \"Coolant window is narrow for reliable blind-hole chip evacuation.\"\n              : \"Coolant window is weak for this blind-hole drilling load.\",\n        fitScore: clamp01(score),\n      };\n    }\n    \n    function deriveChipEvacuationSeverity(materialGroup, materialConditionCode, materialProfile, requestedRatio, coolantCapability, holePassability) {\n      var level = 0;\n      var chipForm = materialProfile && String(materialProfile.chipForm || \"\").toLowerCase();\n      var workHardening = materialProfile && String(materialProfile.workHardening || \"\").toLowerCase();\n      var bue = materialProfile && String(materialProfile.buildUpEdgeTendency || \"\").toLowerCase();\n    \n      if (requestedRatio != null) {\n        if (requestedRatio > 2) level += 1;\n        if (requestedRatio > 3) level += 1;\n        if (requestedRatio > 5) level += 1;\n      }\n      if (holePassability === \"interrupted\") level += 1;\n      if (coolantCapability.code === \"weak\") level += 1;\n      if (coolantCapability.code === \"poor\") level += 2;\n      if (materialConditionCode === \"tough_long_chipping\" || materialConditionCode === \"sticky_bue\") level += 1;\n      if (materialConditionCode === \"work_hardening\" && (requestedRatio == null || requestedRatio > 2 || coolantCapability.code !== \"strong\")) level += 1;\n      if (chipForm === \"long\" && ((requestedRatio != null && requestedRatio > 2) || holePassability === \"interrupted\" || coolantCapability.code !== \"strong\")) level += 1;\n      if (workHardening.indexOf(\"high\") >= 0 && ((requestedRatio != null && requestedRatio > 2) || coolantCapability.code === \"weak\" || coolantCapability.code === \"poor\")) level += 1;\n      if (bue.indexOf(\"high\") >= 0 && (coolantCapability.code !== \"strong\" || materialConditionCode === \"sticky_bue\" || materialGroup === \"N\")) level += 1;\n      if ((materialGroup === \"M\" && requestedRatio != null && requestedRatio > 2) || (materialGroup === \"S\" && requestedRatio != null && requestedRatio > 2)) level += 1;\n      if (materialGroup === \"K\" || materialGroup === \"H\" || chipForm === \"short\" || chipForm === \"powder\") level -= 1;\n      if (coolantCapability.code === \"strong\" && requestedRatio != null && requestedRatio <= 2 && holePassability !== \"interrupted\") level -= 1;\n      if (materialProfile && Number(materialProfile.machinability) >= 75) level -= 1;\n      if (level < 0) level = 0;\n      if (level > 3) level = 3;\n    \n      return {\n        code: [\"low\", \"medium\", \"high\", \"critical\"][level],\n        label: [\"Low chip-evacuation risk\", \"Medium chip-evacuation risk\", \"High chip-evacuation risk\", \"Critical chip-evacuation risk\"][level],\n        fitScore: [1, 0.72, 0.4, 0.1][level],\n        level: level,\n      };\n    }\n    \n    function deriveEntryRisk(entryCondition, pilotSpotStatus) {\n      var level = 1;\n      switch (String(entryCondition || \"\").toLowerCase()) {\n        case \"flat\":\n          level = 0;\n          break;\n        case \"angled\":\n        case \"convex\":\n        case \"concave\":\n        case \"uneven\":\n          level = 2;\n          break;\n        default:\n          level = 1;\n          break;\n      }\n      if (pilotSpotStatus === \"spot_only\") level -= 1;\n      if (pilotSpotStatus === \"pilot_hole\") level -= 2;\n      if (level < 0) level = 0;\n      if (level > 2) level = 2;\n      return {\n        code: [\"low\", \"medium\", \"high\"][level],\n        label: [\"Stable entry\", \"Review entry\", \"High entry risk\"][level],\n        fitScore: [1, 0.72, 0.38][level],\n        level: level,\n      };\n    }\n    \n    function candidateSupportsFlatBottom(candidate) {\n      var drilling = candidate && candidate.drilling ? candidate.drilling : {};\n      var catalogContext = candidate && candidate.attachments && candidate.attachments.catalogContext ? candidate.attachments.catalogContext : {};\n      var bottomStyle = String(drilling.bottomStyle || drilling.bottomForm || catalogContext.bottomStyle || \"\").toLowerCase();\n      var series = String(catalogContext.series || candidate && candidate.catalog && candidate.catalog.productTitle || \"\").toLowerCase();\n      return bottomStyle.indexOf(\"flat\") >= 0 || series.indexOf(\"flat\") >= 0;\n    }\n    \n    function deriveBottomFeasibility(bottomRequirement, candidate) {\n      var pointAngle = candidate && candidate.drilling ? toNullableNumber(candidate.drilling.pointAngleDeg) : null;\n      var flatBottomSupport = candidateSupportsFlatBottom(candidate);\n      var code = \"standard_v_ok\";\n      var status = \"good\";\n      var fitScore = 1;\n      var label = \"Standard conical bottom is credible with this drill.\";\n      var note = pointAngle != null ? \"Point angle \" + roundValue(pointAngle, 0) + \" deg.\" : \"Point angle not confirmed.\";\n    \n      switch (String(bottomRequirement || \"\").toLowerCase()) {\n        case \"small_rest_cone\":\n          code = \"small_rest_cone_preferred\";\n          if (flatBottomSupport) {\n            status = \"good\";\n            fitScore = 0.94;\n            label = \"The requested smaller bottom cone looks credible with the current drill context.\";\n          } else if (pointAngle != null && pointAngle >= 135) {\n            status = \"good\";\n            fitScore = 0.86;\n            label = \"The requested smaller bottom cone looks credible because the point geometry stays relatively shallow.\";\n          } else if (pointAngle != null && pointAngle >= 130) {\n            status = \"conditional\";\n            fitScore = 0.66;\n            label = \"A smaller bottom cone may be possible, but the bottom condition should be qualified on the first holes.\";\n          } else {\n            status = \"unproven\";\n            fitScore = 0.42;\n            label = \"A smaller bottom cone is not strongly supported by the current drill geometry.\";\n          }\n          break;\n        case \"flat_bottom_required\":\n          code = \"flat_bottom_required\";\n          if (flatBottomSupport) {\n            status = \"good\";\n            fitScore = 0.9;\n            label = \"A flat-bottom requirement is explicitly supported by the current drill context.\";\n          } else {\n            status = \"unproven\";\n            fitScore = 0.16;\n            label = \"A flat-bottom requirement is not cleanly covered by a standard V-bottom drill.\";\n          }\n          break;\n        case \"unknown\":\n          code = \"bottom_requirement_unknown\";\n          status = \"conditional\";\n          fitScore = 0.58;\n          label = \"The bottom requirement is still open, so blind-hole release needs a small credibility reserve.\";\n          break;\n        default:\n          break;\n      }\n    \n      return {\n        code: code,\n        status: status,\n        label: label,\n        fitScore: fitScore,\n        note: note,\n      };\n    }\n    \n    function derivePeckClass(requestedRatio, coolantCapability, chipSeverity, holePassability) {\n      var code;\n      if ((requestedRatio == null || requestedRatio <= 2.5) && chipSeverity.code === \"low\" && holePassability !== \"interrupted\" && (coolantCapability.code === \"strong\" || coolantCapability.code === \"acceptable\")) {\n        code = \"none\";\n      } else if ((requestedRatio != null && requestedRatio > 5) || chipSeverity.code === \"critical\" || (holePassability === \"interrupted\" && (coolantCapability.code === \"weak\" || coolantCapability.code === \"poor\")) || ((coolantCapability.code === \"weak\" || coolantCapability.code === \"poor\") && requestedRatio != null && requestedRatio > 3)) {\n        code = \"necessary\";\n      } else {\n        code = \"recommended\";\n      }\n      return {\n        code: code,\n        label: code === \"none\" ? \"No peck preferred\" : code === \"recommended\" ? \"Pecking recommended\" : \"Pecking likely necessary\",\n        fitScore: code === \"none\" ? 1 : code === \"recommended\" ? 0.66 : 0.28,\n      };\n    }\n    \n    function deriveLoadSeverity(materialGroup, requestedRatio, materialConditionCode, coolantCapability, torqueCapability, setupStability, bottomRequirement, materialProfile) {\n      var level = 0;\n      if (requestedRatio != null) {\n        if (requestedRatio > 3) level += 1;\n        if (requestedRatio > 5) level += 1;\n      }\n      if (materialGroup === \"M\" || materialGroup === \"S\") level += 1;\n      if (materialGroup === \"H\") level += 2;\n      if (materialConditionCode === \"work_hardening\" || materialConditionCode === \"hard_abrasive\") level += 1;\n      if (materialConditionCode === \"sticky_bue\") level += 1;\n      if (bottomRequirement === \"small_rest_cone\" && requestedRatio != null && requestedRatio > 3) level += 1;\n      if (bottomRequirement === \"flat_bottom_required\") level += 1;\n      if (coolantCapability.code === \"weak\") level += 1;\n      if (coolantCapability.code === \"poor\") level += 2;\n      if (String(torqueCapability || \"\").toLowerCase() === \"medium\") level += 1;\n      if (String(torqueCapability || \"\").toLowerCase() === \"low\") level += 2;\n      if (String(setupStability || \"\").toLowerCase() === \"weak\") level += 2;\n      if (materialProfile && String(materialProfile.abrasiveness || \"\").toLowerCase().indexOf(\"very\") >= 0) level += 1;\n      if (materialGroup === \"K\" && requestedRatio != null && requestedRatio <= 3) level -= 1;\n      if (level < 0) level = 0;\n      if (level > 3) level = 3;\n    \n      return {\n        code: [\"light\", \"normal\", \"high\", \"critical\"][level],\n        label: [\"Light machine load\", \"Normal machine load\", \"High machine load\", \"Critical machine load\"][level],\n        fitScore: [1, 0.8, 0.5, 0.16][level],\n        level: level,\n      };\n    }\n    \n    function deriveQualityFeasibility(toleranceLevel, chipSeverity, entryRisk, setupStability, bottomFit) {\n      var stabilityPenalty = String(setupStability || \"\").toLowerCase() === \"strong\" ? 0 : String(setupStability || \"\").toLowerCase() === \"weak\" ? 2 : 1;\n      var bottomPenalty = bottomFit.status === \"good\" ? 0 : bottomFit.status === \"conditional\" ? 1 : 2;\n      var totalRisk = chipSeverity.level + entryRisk.level + stabilityPenalty + bottomPenalty;\n      var code = \"standard\";\n    \n      switch (String(toleranceLevel || \"\").toLowerCase()) {\n        case \"high_precision\":\n          code = totalRisk <= 1 ? \"good\" : totalRisk <= 3 ? \"precision_risk\" : \"not_credible\";\n          break;\n        case \"tight\":\n          code = totalRisk <= 2 ? \"good\" : totalRisk <= 4 ? \"precision_risk\" : \"not_credible\";\n          break;\n        default:\n          code = totalRisk <= 3 ? \"standard\" : totalRisk <= 5 ? \"precision_risk\" : \"not_credible\";\n          break;\n      }\n    \n      return {\n        code: code,\n        label: code === \"good\"\n          ? \"Quality target looks credible.\"\n          : code === \"standard\"\n            ? \"Standard blind-hole quality looks credible.\"\n            : code === \"precision_risk\"\n              ? \"Quality target is possible, but the blind-hole window is narrow.\"\n              : \"Quality target is not credible without improving depth, coolant or bottom-form support.\",\n        fitScore: code === \"good\" ? 1 : code === \"standard\" ? 0.84 : code === \"precision_risk\" ? 0.44 : 0.1,\n      };\n    }\n    \n    function getMaterialLabel(ctx) {\n      return ctx && ctx.material && ctx.material.subgroupCode\n        ? ctx.material.subgroupCode + (ctx.material.subgroupLabel && ctx.material.subgroupLabel !== ctx.material.subgroupCode ? \" - \" + ctx.material.subgroupLabel : \"\")\n        : null;\n    }\n    \n    function isBlindCompatible(row) {\n      var blindThrough = row && row.constraints ? row.constraints.blindThrough : null;\n      return !blindThrough || blindThrough === \"blind\" || blindThrough === \"either\";\n    }\n    \n    function coolantMatchScore(rowCoolant, requestedCoolant) {\n      var normalizedRowCoolant = String(rowCoolant || \"\").toLowerCase();\n      var normalizedRequested = String(requestedCoolant || \"\").toLowerCase();\n      if (!normalizedRequested || normalizedRequested === \"unknown\") return 0.6;\n      if (!normalizedRowCoolant || normalizedRowCoolant === \"unknown\") return 0.55;\n      if (normalizedRowCoolant === normalizedRequested) return 1;\n      if (normalizedRequested === \"through\") return normalizedRowCoolant === \"external\" ? 0.38 : 0.2;\n      if (normalizedRequested === \"external\") return normalizedRowCoolant === \"through\" ? 0.78 : normalizedRowCoolant === \"mist\" ? 0.46 : 0.28;\n      if (normalizedRequested === \"mist\") return normalizedRowCoolant === \"external\" ? 0.52 : normalizedRowCoolant === \"through\" ? 0.42 : 0.24;\n      if (normalizedRequested === \"dry\") return normalizedRowCoolant === \"external\" ? 0.36 : normalizedRowCoolant === \"through\" ? 0.3 : 0.24;\n      return 0.5;\n    }\n    \n    function resolveDrillRow(candidate, ctx, requestedDepthRatio, requestedCoolant) {\n      var rows = candidate && candidate.rows ? candidate.rows.drilling || [] : [];\n      var processId = ctx && ctx.process ? ctx.process.id : null;\n      var materialCode = ctx && ctx.material ? ctx.material.subgroupCode : null;\n      var best = null;\n      var requestedDepthClass = getDepthClassFromRatio(requestedDepthRatio);\n      var requestedCapacity = depthClassCapacity(requestedDepthClass);\n    \n      rows.forEach(function eachRow(row) {\n        var processIds = row && row.constraints ? row.constraints.processIds || [] : [];\n        var materialClass;\n        var rowDepthClass;\n        var rowCapacity;\n        var depthFitScore;\n        var coolantScore;\n        var score;\n    \n        if (processId && processIds.length && processIds.indexOf(processId) < 0) return;\n        if (!isBlindCompatible(row)) return;\n    \n        materialClass = materialMatchClass(row, materialCode);\n        if (materialClass === \"none\") return;\n    \n        rowDepthClass = row && row.familyData ? row.familyData.holeDepthClass : null;\n        rowCapacity = depthClassCapacity(rowDepthClass);\n        if (requestedCapacity != null && rowCapacity != null) {\n          depthFitScore = rowCapacity >= requestedCapacity ? clamp01(0.8 + Math.min(0.2, (rowCapacity - requestedCapacity) * 0.06)) : clamp01(rowCapacity / requestedCapacity);\n        } else if (requestedCapacity != null && rowCapacity == null) {\n          depthFitScore = 0.55;\n        } else {\n          depthFitScore = 0.8;\n        }\n    \n        coolantScore = coolantMatchScore(row && row.constraints ? row.constraints.coolantMode : null, requestedCoolant);\n        score = (materialClass === \"exact\" ? 4 : 2.4) + (depthFitScore * 3.3) + (coolantScore * 2.4);\n    \n        if (!best || score > best.score) {\n          best = {\n            row: row,\n            score: score,\n            materialClass: materialClass,\n            depthFitScore: depthFitScore,\n            coolantFitScore: coolantScore,\n            requestedDepthClass: requestedDepthClass,\n            rowDepthClass: rowDepthClass,\n          };\n        }\n      });\n    \n      if (!best) {\n        return {\n          row: null,\n          source: \"none\",\n          depthFitScore: 0,\n          coolantFitScore: 0,\n          requestedDepthClass: requestedDepthClass,\n          rowDepthClass: null,\n          materialClass: \"none\",\n        };\n      }\n    \n      return {\n        row: best.row,\n        source: best.materialClass === \"exact\" && best.depthFitScore >= 0.95 && best.coolantFitScore >= 0.95\n          ? \"exact\"\n          : best.materialClass !== \"none\" && best.depthFitScore >= 0.7\n            ? \"near\"\n            : \"estimated\",\n        depthFitScore: best.depthFitScore,\n        coolantFitScore: best.coolantFitScore,\n        requestedDepthClass: best.requestedDepthClass,\n        rowDepthClass: best.rowDepthClass,\n        materialClass: best.materialClass,\n      };\n    }\n    \n    function computeRpm(vc, diameter) {\n      if (vc == null || diameter == null || diameter <= 0) return null;\n      return (1000 * vc) / (Math.PI * diameter);\n    }\n    \n    function computeFeed(fn, rpm) {\n      if (fn == null || rpm == null) return null;\n      return fn * rpm;\n    }\n    \n    function computeMrr(diameter, fn, vc) {\n      if (diameter == null || fn == null || vc == null) return null;\n      return (diameter * fn * vc) / 4;\n    }\n    \n    function computeCycleTimeSec(depth, feedMmMin) {\n      if (depth == null || feedMmMin == null || feedMmMin <= 0) return null;\n      return (depth / feedMmMin) * 60;\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"drilling_blind\", ctx, toolkits));\n      var materialProfile = ctx && ctx.material ? ctx.material.profile : null;\n      var materialGroup = ctx && ctx.material ? ctx.material.isoGroup : null;\n      var diameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var requestedRatio = diameter != null && depth != null && diameter > 0 ? depth / diameter : null;\n      var requestedCoolant = normalizeCoolantCapability(getAnswer(ctx, \"coolant_capability\"));\n      var holePassability = toNullableString(getAnswer(ctx, \"hole_passability\")) || \"unknown\";\n      var materialCondition = mapMaterialCondition(getAnswer(ctx, \"material_condition_class\"));\n      var setupStability = toNullableString(getAnswer(ctx, \"setup_stability\")) || \"medium\";\n      var torqueCapability = toNullableString(getAnswer(ctx, \"machine_torque_capability\")) || \"medium\";\n      var pilotSpotStatus = toNullableString(getAnswer(ctx, \"pilot_spot_status\")) || \"unknown\";\n      var toleranceLevel = toNullableString(getAnswer(ctx, \"tolerance_level\")) || \"general\";\n      var bottomRequirement = toNullableString(getAnswer(ctx, \"blind_bottom_type\")) || \"unknown\";\n      var coolantCapability = deriveCoolantCapability(materialGroup, requestedCoolant, requestedCoolant === \"through\", requestedRatio, materialCondition.code, materialProfile);\n      var chipSeverity = deriveChipEvacuationSeverity(materialGroup, materialCondition.code, materialProfile, requestedRatio, coolantCapability, holePassability);\n      var entryRisk = deriveEntryRisk(getAnswer(ctx, \"entry_condition\"), pilotSpotStatus);\n      var bottomFit = deriveBottomFeasibility(bottomRequirement, null);\n      var loadSeverity = deriveLoadSeverity(materialGroup, requestedRatio, materialCondition.code, coolantCapability, torqueCapability, setupStability, bottomRequirement, materialProfile);\n      var peckClass = derivePeckClass(requestedRatio, coolantCapability, chipSeverity, holePassability);\n      var qualityFeasibility = deriveQualityFeasibility(toleranceLevel, chipSeverity, entryRisk, setupStability, bottomFit);\n    \n      derived.requested_diameter_mm = diameter;\n      derived.requested_depth_mm = depth;\n      derived.requested_depth_ratio = requestedRatio;\n      derived.requested_depth_class = getDepthClassFromRatio(requestedRatio);\n      derived.coolant_mode = requestedCoolant;\n      derived.coolant_capability_class = coolantCapability.code;\n      derived.coolant_capability_label = coolantCapability.label;\n      derived.chip_evacuation_severity_class = chipSeverity.code;\n      derived.chip_evacuation_severity_label = chipSeverity.label;\n      derived.entry_stability_risk_class = entryRisk.code;\n      derived.entry_stability_risk_label = entryRisk.label;\n      derived.bottom_form_feasibility_class = bottomFit.code;\n      derived.bottom_form_feasibility_label = bottomFit.label;\n      derived.bottom_form_feasibility_status = bottomFit.status;\n      derived.machine_load_severity_class = loadSeverity.code;\n      derived.machine_load_severity_label = loadSeverity.label;\n      derived.peck_necessity_class = peckClass.code;\n      derived.peck_necessity_label = peckClass.label;\n      derived.quality_feasibility_class = qualityFeasibility.code;\n      derived.quality_feasibility_label = qualityFeasibility.label;\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"drilling_blind\", ctx);\n      var materialProfile = ctx && ctx.material ? ctx.material.profile : null;\n      var materialGroup = ctx && ctx.material ? ctx.material.isoGroup : null;\n      var requestedRatio = toNullableNumber(ctx && ctx.derived ? ctx.derived.requested_depth_ratio : null);\n      var requestedCoolant = normalizeCoolantCapability(getAnswer(ctx, \"coolant_capability\"));\n      var holePassability = toNullableString(getAnswer(ctx, \"hole_passability\")) || \"unknown\";\n      var materialCondition = mapMaterialCondition(getAnswer(ctx, \"material_condition_class\"));\n      var setupStability = toNullableString(getAnswer(ctx, \"setup_stability\")) || \"medium\";\n      var toleranceLevel = toNullableString(getAnswer(ctx, \"tolerance_level\")) || \"general\";\n      var bottomRequirement = toNullableString(getAnswer(ctx, \"blind_bottom_type\")) || \"unknown\";\n    \n      if ((requestedCoolant === \"external\" || requestedCoolant === \"mist\" || requestedCoolant === \"dry\") && requestedRatio != null && requestedRatio > 3) {\n        issues.push({\n          field: \"coolant_capability\",\n          message: materialGroup === \"M\" || materialGroup === \"S\" || materialCondition.code === \"tough_long_chipping\" || materialCondition.code === \"work_hardening\"\n            ? \"External, mist or dry coolant beyond about 3xD is especially risky in blind holes and needs a conservative drilling strategy.\"\n            : \"External, mist or dry coolant beyond about 3xD narrows the blind-hole chip window and needs a conservative drilling strategy.\",\n          severity: \"warning\",\n          code: \"coolant_depth_warning\",\n        });\n      }\n      if (holePassability === \"interrupted\" && requestedRatio != null && requestedRatio >= 3 && requestedCoolant !== \"through\") {\n        issues.push({\n          field: \"hole_passability\",\n          message: \"Interrupted blind holes with limited coolant support raise breakage and chip-packing risk sharply.\",\n          severity: \"warning\",\n          code: \"interrupted_blind_hole_warning\",\n        });\n      }\n      if (String(getAnswer(ctx, \"entry_condition\") || \"\").toLowerCase() !== \"flat\") {\n        issues.push({\n          field: \"entry_condition\",\n          message: \"Non-flat entry surfaces usually need spotting, piloting or a reduced entry feed.\",\n          severity: \"warning\",\n          code: \"entry_surface_warning\",\n        });\n      }\n      if (bottomRequirement === \"flat_bottom_required\") {\n        issues.push({\n          field: \"blind_bottom_type\",\n          message: \"A flat-bottom requirement is not cleanly covered by a standard V-bottom drill unless a dedicated bottom-form tool is confirmed.\",\n          severity: \"warning\",\n          code: \"flat_bottom_requirement_warning\",\n        });\n      }\n      if (bottomRequirement === \"small_rest_cone\" && requestedRatio != null && requestedRatio > 5) {\n        issues.push({\n          field: \"blind_bottom_type\",\n          message: \"A smaller rest cone becomes harder to hold as blind-hole depth rises. Qualify the bottom condition on the first holes.\",\n          severity: \"warning\",\n          code: \"small_cone_depth_warning\",\n        });\n      }\n      if (setupStability === \"weak\" && (toleranceLevel === \"tight\" || toleranceLevel === \"high_precision\")) {\n        issues.push({\n          field: \"setup_stability\",\n          message: \"A weak setup does not support a tight blind-hole quality target credibly.\",\n          severity: \"warning\",\n          code: \"quality_stability_warning\",\n        });\n      }\n      if (materialProfile && String(materialProfile.preferredCoolantMode || \"\").toLowerCase() === \"through\" && requestedCoolant !== \"through\" && requestedRatio != null && requestedRatio > 3) {\n        issues.push({\n          field: \"coolant_capability\",\n          message: \"The selected material profile strongly prefers internal coolant for this blind-hole depth range.\",\n          severity: \"warning\",\n          code: \"material_coolant_preference\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"drilling_blind\", pool);\n    }\n    \n    function score(pool, ctx, kernel) {\n      var materialProfile = ctx && ctx.material ? ctx.material.profile : null;\n      var materialGroup = ctx && ctx.material ? ctx.material.isoGroup : null;\n      var materialLabel = getMaterialLabel(ctx);\n      var diameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var requestedRatio = diameter != null && depth != null && diameter > 0 ? depth / diameter : null;\n      var requestedDepthClass = getDepthClassFromRatio(requestedRatio);\n      var requestedCoolant = normalizeCoolantCapability(getAnswer(ctx, \"coolant_capability\"));\n      var holePassability = toNullableString(getAnswer(ctx, \"hole_passability\")) || \"unknown\";\n      var materialCondition = mapMaterialCondition(getAnswer(ctx, \"material_condition_class\"));\n      var entryCondition = toNullableString(getAnswer(ctx, \"entry_condition\")) || \"unknown\";\n      var setupStability = toNullableString(getAnswer(ctx, \"setup_stability\")) || \"medium\";\n      var torqueCapability = toNullableString(getAnswer(ctx, \"machine_torque_capability\")) || \"medium\";\n      var pilotSpotStatus = toNullableString(getAnswer(ctx, \"pilot_spot_status\")) || \"unknown\";\n      var toleranceLevel = toNullableString(getAnswer(ctx, \"tolerance_level\")) || \"general\";\n      var priority = toNullableString(getAnswer(ctx, \"priority\")) || \"balanced\";\n      var bottomRequirement = toNullableString(getAnswer(ctx, \"blind_bottom_type\")) || \"unknown\";\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var diameterFit = diameter != null ? kernel.diameterFit(candidate, diameter) : 0;\n        var reachScore = depth != null ? kernel.reachFit(candidate, depth) : 0;\n        var usableLength = candidate && candidate.common ? toNullableNumber(candidate.common.usableLengthMm) : null;\n        var apmxLength = candidate && candidate.common ? toNullableNumber(candidate.common.apmxMm) : null;\n        var resolvedRow = resolveDrillRow(candidate, ctx, requestedRatio, requestedCoolant);\n        var recipe = resolvedRow.row ? resolvedRow.row.recipe : null;\n        var candidateDiameter = candidate && candidate.common ? toNullableNumber(candidate.common.diameterMm) : diameter;\n        var coolantCapability = deriveCoolantCapability(materialGroup, requestedCoolant, Boolean(candidate && candidate.common && candidate.common.coolantTsc), requestedRatio, materialCondition.code, materialProfile);\n        var chipSeverity = deriveChipEvacuationSeverity(materialGroup, materialCondition.code, materialProfile, requestedRatio, coolantCapability, holePassability);\n        var entryRisk = deriveEntryRisk(entryCondition, pilotSpotStatus);\n        var bottomFit = deriveBottomFeasibility(bottomRequirement, candidate);\n        var loadSeverity = deriveLoadSeverity(materialGroup, requestedRatio, materialCondition.code, coolantCapability, torqueCapability, setupStability, bottomRequirement, materialProfile);\n        var peckClass = derivePeckClass(requestedRatio, coolantCapability, chipSeverity, holePassability);\n        var qualityFeasibility = deriveQualityFeasibility(toleranceLevel, chipSeverity, entryRisk, setupStability, bottomFit);\n        var rpmMin = computeRpm(recipe && recipe.vc ? recipe.vc.min : null, candidateDiameter);\n        var rpmTyp = computeRpm(recipe && recipe.vc ? recipe.vc.typ : null, candidateDiameter);\n        var rpmMax = computeRpm(recipe && recipe.vc ? recipe.vc.max : null, candidateDiameter);\n        var feedMin = computeFeed(recipe && recipe.fn ? recipe.fn.min : null, rpmMin);\n        var feedTyp = computeFeed(recipe && recipe.fn ? recipe.fn.typ : null, rpmTyp);\n        var feedMax = computeFeed(recipe && recipe.fn ? recipe.fn.max : null, rpmMax);\n        var mrrTyp = computeMrr(candidateDiameter, recipe && recipe.fn ? recipe.fn.typ : null, recipe && recipe.vc ? recipe.vc.typ : null);\n        var cycleTimeSec = computeCycleTimeSec(depth, feedTyp);\n        var usableLengthMarginMm = usableLength != null && depth != null ? usableLength - depth : null;\n        var apmxMarginMm = apmxLength != null && depth != null ? apmxLength - depth : null;\n        var coolantScore = clamp01((coolantCapability.fitScore * 0.72) + (resolvedRow.coolantFitScore * 0.28));\n        var chipControlScore = chipSeverity.fitScore;\n        var entryScore = entryRisk.fitScore;\n        var bottomScore = bottomFit.fitScore;\n        var setupScore = clamp01((loadSeverity.fitScore * 0.65) + (String(setupStability || \"\").toLowerCase() === \"strong\" ? 0.35 : String(setupStability || \"\").toLowerCase() === \"weak\" ? 0.1 : 0.24));\n        var qualityScore = qualityFeasibility.fitScore;\n        var priorityBias = priority === \"safety\"\n          ? clamp01((coolantScore + chipControlScore + setupScore) / 3)\n          : priority === \"precision\"\n            ? clamp01((qualityScore + entryScore + bottomScore) / 3)\n            : priority === \"productivity\"\n              ? clamp01(((recipe && recipe.vc && recipe.vc.typ ? 0.65 : 0.35) + coolantScore + chipControlScore) / 3)\n              : clamp01((qualityScore + coolantScore + chipControlScore) / 3);\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidenceMap;\n        var confidence;\n        var severityPenalty;\n        var reasons;\n        var metrics;\n        var alternativePrimary = null;\n    \n        if (diameter != null && diameterFit < 0.6) hardRejectReason = \"Tool diameter is too far from the requested blind-hole size.\";\n        if (!hardRejectReason && usableLengthMarginMm != null && usableLengthMarginMm < 0) hardRejectReason = \"Usable length is shorter than the requested blind-hole depth.\";\n        if (!hardRejectReason && apmxMarginMm != null && apmxMarginMm < 0) hardRejectReason = \"Maximum drill depth is shorter than the requested blind-hole depth.\";\n        if (!hardRejectReason && !resolvedRow.row) hardRejectReason = \"No blind-hole drilling row is available for the selected process and material.\";\n        if (!hardRejectReason && resolvedRow.depthFitScore < 0.75) hardRejectReason = \"The available depth class is shorter than the requested blind-hole xD range.\";\n    \n        severityPenalty = chipSeverity.code === \"critical\" ? 0.55 : chipSeverity.code === \"high\" ? 0.25 : 0;\n        if (qualityFeasibility.code === \"not_credible\") severityPenalty += 0.35;\n        if (loadSeverity.code === \"critical\") severityPenalty += 0.25;\n        if (bottomFit.status === \"unproven\" && bottomRequirement === \"flat_bottom_required\") severityPenalty += 0.22;\n        if (bottomFit.status === \"conditional\" && bottomRequirement === \"small_rest_cone\") severityPenalty += 0.08;\n    \n        if (bottomRequirement === \"flat_bottom_required\" && bottomFit.status !== \"good\") {\n          alternativePrimary = \"flat_bottom_drill\";\n        } else if ((requestedRatio != null && requestedRatio > 5 && requestedCoolant !== \"through\") || chipSeverity.code === \"critical\") {\n          alternativePrimary = \"deep_hole_drilling\";\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.1,\n          process: kernel.processFit(candidate, ctx) * 1.1,\n          diameter: diameterFit * 2.5,\n          depthClass: resolvedRow.depthFitScore * 1.55,\n          reach: reachScore * 1.6,\n          coolant: coolantScore * 1.45,\n          chipControl: chipControlScore * 1.55,\n          entry: entryScore * 0.8,\n          bottomFit: bottomScore * 1.05,\n          setup: setupScore * 0.95,\n          quality: qualityScore * 0.9,\n          rowMatch: (resolvedRow.source === \"exact\" ? 1 : resolvedRow.source === \"near\" ? 0.8 : 0.45) * 0.8,\n          priorityBias: priorityBias * 0.55,\n          riskPenalty: -(severityPenalty + (kernel.risk(candidate, ctx) || 0)),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidenceMap = { exact: 0.95, near: 0.84, estimated: 0.68, none: 0.42 };\n        confidence = confidenceMap[resolvedRow.source] || 0.42;\n        if (bottomRequirement === \"flat_bottom_required\" && bottomFit.status !== \"good\") confidence = Math.min(confidence, 0.58);\n        if (qualityFeasibility.code === \"not_credible\") confidence = Math.min(confidence, 0.56);\n        if (hardRejectReason) confidence = 0;\n    \n        reasons = [\n          requestedDepthClass && resolvedRow.rowDepthClass\n            ? \"Depth class covers the requested \" + requestedDepthClass + \" blind-hole window.\"\n            : \"Blind-hole process and material fit are available.\",\n          coolantCapability.code === \"strong\" || coolantCapability.code === \"acceptable\"\n            ? \"Coolant support stays workable for chip evacuation near the hole bottom.\"\n            : \"Coolant support is the main release limiter in this blind-hole setup.\",\n          bottomRequirement === \"standard_conical_ok\" || bottomFit.status === \"good\"\n            ? \"The bottom requirement looks credible for a standard blind-hole release.\"\n            : \"The bottom requirement needs special attention before the process is released.\",\n          chipSeverity.code === \"low\" || chipSeverity.code === \"medium\"\n            ? \"Chip evacuation stays within a controllable range for blind-hole drilling.\"\n            : \"Chip evacuation near the bottom is one of the main risks to qualify before raising output.\",\n        ].filter(Boolean).slice(0, 4);\n    \n        metrics = {\n          materialGroup: materialGroup,\n          materialLabel: materialLabel,\n          materialCondition: materialCondition.code,\n          materialConditionLabel: materialCondition.label,\n          requestedDiameterMm: diameter,\n          requestedDepthMm: depth,\n          requestedDepthRatio: roundValue(requestedRatio, 2),\n          requestedDepthClass: requestedDepthClass,\n          requestedCoolantMode: requestedCoolant,\n          requestedCoolantLabel: requestedCoolant === \"through\" ? \"Internal coolant\" : requestedCoolant === \"external\" ? \"External coolant\" : requestedCoolant === \"mist\" ? \"MQL / mist\" : requestedCoolant === \"dry\" ? \"Dry\" : \"Unknown coolant\",\n          requestedEntryCondition: entryCondition,\n          requestedEntryConditionLabel: entryCondition ? entryCondition.replace(/_/g, \" \") : null,\n          requestedToleranceLevel: toleranceLevel,\n          requestedToleranceLevelLabel: toleranceLevel ? toleranceLevel.replace(/_/g, \" \") : null,\n          requestedBottomRequirement: bottomRequirement,\n          requestedBottomRequirementLabel: getBottomRequirementLabel(bottomRequirement),\n          holePassability: holePassability,\n          holePassabilityLabel: holePassability ? holePassability.replace(/_/g, \" \") : null,\n          priority: priority,\n          priorityLabel: priority ? priority.replace(/_/g, \" \") : null,\n          setupStability: setupStability,\n          torqueCapability: torqueCapability,\n          pilotSpotStatus: pilotSpotStatus,\n          recipeOperationId: resolvedRow.row && resolvedRow.row.constraints && resolvedRow.row.constraints.processIds && resolvedRow.row.constraints.processIds[0] || \"drilling_blind\",\n          rowCoolantMode: resolvedRow.row && resolvedRow.row.constraints ? resolvedRow.row.constraints.coolantMode : null,\n          rowDepthClass: resolvedRow.rowDepthClass,\n          recipeVcMin: recipe && recipe.vc ? recipe.vc.min : null,\n          recipeVcTyp: recipe && recipe.vc ? recipe.vc.typ : null,\n          recipeVcMax: recipe && recipe.vc ? recipe.vc.max : null,\n          recipeFnMin: recipe && recipe.fn ? recipe.fn.min : null,\n          recipeFnTyp: recipe && recipe.fn ? recipe.fn.typ : null,\n          recipeFnMax: recipe && recipe.fn ? recipe.fn.max : null,\n          rpmMin: roundValue(rpmMin, 0),\n          rpmTyp: roundValue(rpmTyp, 0),\n          rpmMax: roundValue(rpmMax, 0),\n          feedMinMmMin: roundValue(feedMin, 0),\n          feedTypMmMin: roundValue(feedTyp, 0),\n          feedMaxMmMin: roundValue(feedMax, 0),\n          mrrTyp: roundValue(mrrTyp, 1),\n          cycleTimeSec: roundValue(cycleTimeSec, 1),\n          usableLengthMarginMm: roundValue(usableLengthMarginMm, 2),\n          apmxMarginMm: roundValue(apmxMarginMm, 2),\n          candidateDiameterMm: candidateDiameter,\n          candidateUsableLengthMm: usableLength,\n          candidateApmxMm: apmxLength,\n          candidateHasTsc: Boolean(candidate && candidate.common && candidate.common.coolantTsc),\n          candidatePointAngleDeg: candidate && candidate.drilling ? toNullableNumber(candidate.drilling.pointAngleDeg) : null,\n          coolantCapabilityClass: coolantCapability.code,\n          coolantCapabilityLabel: coolantCapability.label,\n          chipEvacuationSeverityClass: chipSeverity.code,\n          chipEvacuationSeverityLabel: chipSeverity.label,\n          entryRiskClass: entryRisk.code,\n          entryRiskLabel: entryRisk.label,\n          bottomFormFeasibilityClass: bottomFit.code,\n          bottomFormFeasibilityLabel: bottomFit.label,\n          bottomFormFeasibilityStatus: bottomFit.status,\n          bottomFormFeasibilityNote: bottomFit.note,\n          machineLoadSeverityClass: loadSeverity.code,\n          machineLoadSeverityLabel: loadSeverity.label,\n          peckNecessityClass: peckClass.code,\n          peckNecessityLabel: peckClass.label,\n          qualityFeasibilityClass: qualityFeasibility.code,\n          qualityFeasibilityLabel: qualityFeasibility.label,\n          rowDepthFitScore: roundValue(resolvedRow.depthFitScore, 2),\n          rowCoolantFitScore: roundValue(resolvedRow.coolantFitScore, 2),\n          alternativeProcessFlag: Boolean(alternativePrimary),\n          alternativePrimary: alternativePrimary,\n        };\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: resolvedRow.source,\n          reasons: reasons,\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/drilling-through/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/drilling-through/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/drilling-through/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/drilling-through/presenter.js\");\n    exports.default = createStubProcessModule(\"drilling_through\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/drilling-through/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, heroRecommendation, holeSummary, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, toleranceNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { getTroubleshootingEntries } = __bundle.require(\"core/troubleshooting-library.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function ensureSentence(value) {\n      var text = String(value || \"\").trim();\n      if (!text) return null;\n      return /[.!?]$/.test(text) ? text : text + \".\";\n    }\n    \n    function cleanShortText(value) {\n      return String(value || \"\").replace(/\\s+/g, \" \").trim();\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = cleanShortText(item);\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(0);\n    }\n    \n    function appendUniqueHandle(handles, handle) {\n      if (!handle || handles.indexOf(handle) >= 0) return;\n      handles.push(handle);\n    }\n    \n    function getMaterialProfile(ctx) {\n      return ctx && ctx.material ? ctx.material.profile : null;\n    }\n    \n    function getMaterialLabel(ctx) {\n      var profile = getMaterialProfile(ctx);\n      return profile ? profile.code + \" - \" + profile.label : (ctx && ctx.material ? ctx.material.subgroupCode : null);\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative drill option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildTroubleshootingHandles(ctx, top) {\n      var metrics = top.metrics || {};\n      var handles = [];\n    \n      if (metrics.entryRiskClass === \"high\") appendUniqueHandle(handles, \"drill-skids-on-inclined-curved-surface\");\n      if (metrics.holePassability === \"interrupted\") {\n        appendUniqueHandle(handles, \"drill-breakage\");\n        appendUniqueHandle(handles, metrics.requestedExitCondition === \"interrupted_exit\" ? \"burrs-or-breakout-at-cross-hole-intersection\" : \"chipping-when-drilling-into-a-pre-hole\");\n      }\n      if (metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\") appendUniqueHandle(handles, \"chips-pack-in-deep-holes\");\n      if (metrics.exitRiskClass === \"high\") appendUniqueHandle(handles, metrics.requestedExitCondition === \"interrupted_exit\" ? \"burrs-or-breakout-at-cross-hole-intersection\" : \"burrs-at-entry-and-or-exit\");\n      if (metrics.qualityFeasibilityClass === \"precision_risk\" || metrics.qualityFeasibilityClass === \"not_credible\") appendUniqueHandle(handles, \"drill-wanders-hole-off-position\");\n      if (metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\") appendUniqueHandle(handles, \"spindle-at-power-limit-or-stalls\");\n      if (!handles.length) {\n        appendUniqueHandle(handles, metrics.requestedDepthRatio != null && metrics.requestedDepthRatio > 3 ? \"chips-pack-in-deep-holes\" : \"burrs-at-entry-and-or-exit\");\n        appendUniqueHandle(handles, \"drill-wanders-hole-off-position\");\n      }\n    \n      return handles.slice(0, 2);\n    }\n    \n    function buildTroubleshootingCards(ctx, top) {\n      return getTroubleshootingEntries(buildTroubleshootingHandles(ctx, top)).map(function mapEntry(entry) {\n        var focusFlags = [];\n        if (entry.rootWorkholding) focusFlags.push(\"workholding\");\n        if (entry.rootMachinePower) focusFlags.push(\"machine power\");\n        if (entry.rootPreprocessing) focusFlags.push(\"pre-processing\");\n        return {\n          title: entry.problem,\n          tone: entry.problemCategory === \"Process Stability\" || entry.rootMachinePower ? \"high\" : \"watch\",\n          eyebrow: \"Focused response\",\n          category: entry.problemCategory || \"Troubleshooting\",\n          wear: entry.dominantToolWear || null,\n          checkFirst: focusFlags,\n          cause: ensureSentence(entry.cause),\n          actions: (entry.actions || []).slice(0, 4).map(cleanShortText).filter(Boolean),\n          note: entry.alternativeProcess ? ensureSentence(entry.alternativeProcess) : null,\n          items: [],\n        };\n      });\n    }\n    \n    function buildRiskItems(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n    \n      if (metrics.coolantCapabilityClass === \"weak\" || metrics.coolantCapabilityClass === \"poor\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Coolant support\",\n          message: metrics.requestedCoolantMode === \"external\" || metrics.requestedCoolantMode === \"mist\" || metrics.requestedCoolantMode === \"dry\"\n            ? \"Coolant support is narrow for through drilling at this depth and material behavior.\"\n            : \"Chip evacuation depends on coolant support more than this setup currently confirms.\",\n        });\n      }\n      if (metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Chip evacuation\",\n          message: \"Chip evacuation is one of the main release limits in this through-hole case. Qualify chip shape and evacuation before raising output.\",\n        });\n      }\n      if (metrics.entryRiskClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Entry stability\",\n          message: \"The entry surface is not naturally stable. Spotting or a reduced entry feed should be part of the first-part plan.\",\n        });\n      }\n      if (metrics.exitRiskClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Breakthrough quality\",\n          message: \"Breakthrough is quality-critical here. Reduce feed before exit if burrs, oblique exit or interruption matter.\",\n        });\n      }\n      if (metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Machine load\",\n          message: \"The combined depth, material and coolant window pushes machine load high. Keep the shortest possible drill and avoid releasing aggressively too early.\",\n        });\n      }\n      if (metrics.qualityFeasibilityClass === \"not_credible\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Quality target\",\n          message: \"The requested quality target is not credible under the current drilling conditions without improving stability, coolant support or the process route.\",\n        });\n      }\n    \n      return items.slice(0, 4);\n    }\n    \n    function buildMachineChecks(ctx, top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"coolant\",\n          label: \"Coolant capability\",\n          result: metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\" ? \"pass\" : metrics.coolantCapabilityClass === \"weak\" ? \"limited\" : \"fail\",\n          note: (metrics.requestedCoolantLabel || \"Coolant mode not confirmed\") + (metrics.candidateHasTsc ? \" with TSC-capable tool.\" : \".\"),\n        },\n        {\n          key: \"setup\",\n          label: \"Setup stability\",\n          result: metrics.setupStability === \"strong\" ? \"pass\" : metrics.setupStability === \"weak\" ? \"fail\" : \"limited\",\n          note: titleCase(metrics.setupStability || \"medium\") + \" setup stability.\",\n        },\n        {\n          key: \"machine_load\",\n          label: \"Machine load\",\n          result: metrics.machineLoadSeverityClass === \"light\" || metrics.machineLoadSeverityClass === \"normal\" ? \"pass\" : metrics.machineLoadSeverityClass === \"high\" ? \"limited\" : \"fail\",\n          note: metrics.machineLoadSeverityLabel || \"Machine load not confirmed.\",\n        },\n      ];\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n        { key: \"fn\", label: \"fn\", min: metrics.recipeFnMin, typ: metrics.recipeFnTyp, max: metrics.recipeFnMax, unit: \"mm/rev\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildRowBackedValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { label: \"Depth class\", value: metrics.rowDepthClass || metrics.requestedDepthClass || \"n/a\", tone: \"text\" },\n        { label: \"Coolant\", value: metrics.rowCoolantMode ? titleCase(metrics.rowCoolantMode) : \"n/a\", tone: \"text\" },\n        { label: \"vc min\", value: formatDisplayNumber(metrics.recipeVcMin, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"vc max\", value: formatDisplayNumber(metrics.recipeVcMax, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"fn min\", value: formatDisplayNumber(metrics.recipeFnMin, 2) || \"n/a\", unit: \"mm/rev\" },\n        { label: \"fn typ\", value: formatDisplayNumber(metrics.recipeFnTyp, 2) || \"n/a\", unit: \"mm/rev\" },\n        { label: \"fn max\", value: formatDisplayNumber(metrics.recipeFnMax, 2) || \"n/a\", unit: \"mm/rev\" },\n      ];\n    }\n    \n    function buildMachineValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { label: \"N\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n        { label: \"VF\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n        { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n        { label: \"Time\", value: formatDisplayNumber(metrics.cycleTimeSec, 1) || \"n/a\", unit: \"sec\" },\n        { label: \"Peck\", value: titleCase(metrics.peckNecessityClass || \"review\"), tone: \"text\" },\n      ];\n    }\n    \n    function buildRecipeTrustCard(top) {\n      var confidence = top.score.recipeConfidence;\n      return {\n        title: \"Cutting-data basis\",\n        tone: confidence === \"exact\" ? \"good\" : confidence === \"near\" ? \"limited\" : \"default\",\n        badge: confidence === \"exact\" ? \"Exact valid drill row\" : confidence === \"near\" ? \"Nearest valid drill row\" : \"Estimated\",\n        value: confidence === \"exact\"\n          ? \"The starting band comes from a matching through-drilling row for the current material, coolant route and depth class.\"\n          : confidence === \"near\"\n            ? \"The starting band comes from the closest valid through-drilling row and is then translated to the requested diameter.\"\n            : \"The starting band leans more heavily on candidate fit and drilling-process rules because the row match is weaker.\",\n        note: \"vc and fn stay row-backed. rpm, feed speed and MRR are then derived from the requested diameter.\",\n        items: [],\n      };\n    }\n    \n    function buildDepthReachCard(top) {\n      var metrics = top.metrics || {};\n      var tone = metrics.usableLengthMarginMm != null && metrics.usableLengthMarginMm >= 2 && metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 2 ? \"good\" : metrics.usableLengthMarginMm != null && metrics.usableLengthMarginMm >= 0 && metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"limited\" : \"high\";\n    \n      return {\n        title: \"Depth & reach\",\n        tone: tone,\n        badge: metrics.requestedDepthClass || \"Depth review\",\n        value: metrics.requestedDepthRatio != null\n          ? \"The requested \" + formatDisplayNumber(metrics.requestedDepthRatio, 2) + \"xD through-hole stays inside the tool depth window with the current row and candidate reach.\"\n          : \"Depth and reach fit look workable for the requested through-hole.\",\n        note: dedupeTextItems([\n          metrics.usableLengthMarginMm != null ? \"Usable-length margin \" + formatDisplayNumber(metrics.usableLengthMarginMm, 2) + \" mm\" : null,\n          metrics.apmxMarginMm != null ? \"APMX margin \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm\" : null,\n        ]).join(\" / \"),\n        items: dedupeTextItems([\n          metrics.requestedDepthMm != null ? \"Requested drilling depth: \" + formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm.\" : null,\n          metrics.candidateUsableLengthMm != null ? \"Usable length: \" + formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm.\" : null,\n          metrics.candidateApmxMm != null ? \"APMX: \" + formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm.\" : null,\n        ]).slice(0, 3),\n      };\n    }\n    \n    function buildStoryData(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var why = dedupeTextItems([\n        metrics.requestedDepthRatio != null && metrics.rowDepthClass ? \"Requested \" + formatDisplayNumber(metrics.requestedDepthRatio, 2) + \"xD stays inside the \" + metrics.rowDepthClass + \" through-drilling class.\" : null,\n        metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\" ? \"Coolant support stays workable for chip evacuation in this material and depth window.\" : null,\n        metrics.chipEvacuationSeverityClass === \"low\" || metrics.chipEvacuationSeverityClass === \"medium\" ? \"Chip evacuation stays inside a controllable range for a standard release.\" : null,\n        metrics.entryRiskClass === \"low\" && metrics.exitRiskClass === \"low\" ? \"Entry and breakthrough conditions stay manageable for a stable first release.\" : null,\n        materialProfile && materialProfile.chipForm ? \"Material profile points to \" + String(materialProfile.chipForm).toLowerCase() + \" chip behavior, which matches the current drilling strategy.\" : null,\n      ]);\n      var how = dedupeTextItems([\n        \"Start inside the suggested vc and fn band and qualify the first holes before increasing output.\",\n        metrics.peckNecessityClass === \"none\" ? \"Prefer a continuous G81-style cycle first; only add pecking if chips stop clearing cleanly.\" : null,\n        metrics.peckNecessityClass === \"recommended\" ? \"Start with a light peck strategy because chip control needs more help than a short free-cutting case.\" : null,\n        metrics.peckNecessityClass === \"necessary\" ? \"Plan for a pecking strategy up front because the current chip-evacuation window is too narrow for a casual continuous cycle.\" : null,\n        metrics.entryRiskClass === \"high\" ? \"Reduce feed at entry or use a spot/pilot strategy because the entry surface is not naturally stable.\" : null,\n        metrics.exitRiskClass === \"high\" ? \"Reduce feed shortly before breakthrough if burrs, oblique exit or interruption make exit quality critical.\" : null,\n      ]);\n      var watch = dedupeTextItems([\n        metrics.coolantCapabilityClass === \"weak\" || metrics.coolantCapabilityClass === \"poor\" ? \"This coolant route is the main release limiter at the requested L/D and material behavior.\" : null,\n        metrics.holePassability === \"interrupted\" ? \"Interrupted or cross-hole breakthrough raises the risk of edge chipping, drift and breakout.\" : null,\n        metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\" ? \"Machine load rises quickly in this setup, so keep the shortest possible drill and avoid aggressive first-part release.\" : null,\n        metrics.qualityFeasibilityClass === \"not_credible\" ? \"The requested quality target is not credible under the current conditions without improving the route.\" : null,\n        materialProfile && materialProfile.typicalFailure ? \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure).toLowerCase() + \".\" : null,\n      ]);\n      return { why: why, how: how, watch: watch };\n    }\n    \n    function buildStoryPanels(ctx, top, riskItems, storyData) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      return {\n        why: {\n          tone: \"good\",\n          eyebrow: \"Technical fit\",\n          title: \"Why it fits\",\n          badge: \"Depth: \" + (metrics.rowDepthClass || metrics.requestedDepthClass || \"review\"),\n          highlight: metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\"\n            ? \"Depth class, reach reserve and coolant window support a credible through-drilling release.\"\n            : \"The basic tool fit is there, but coolant support narrows the safe release window for this through-hole case.\",\n          summary: \"Through-hole drilling is driven mainly by diameter fit, depth class, chip evacuation, breakthrough behavior and setup stability rather than blind-hole bottom reserve.\",\n          facts: dedupeTextItems([\n            metrics.requestedDiameterMm != null ? \"D \" + formatDisplayNumber(metrics.requestedDiameterMm, 2) + \" mm\" : null,\n            metrics.requestedDepthRatio != null ? formatDisplayNumber(metrics.requestedDepthRatio, 2) + \"xD\" : null,\n            metrics.requestedCoolantLabel || null,\n          ]),\n          items: storyData.why.slice(0, 3),\n        },\n        how: {\n          tone: \"default\",\n          eyebrow: \"Start strategy\",\n          title: \"How to start\",\n          badge: metrics.peckNecessityClass === \"none\" ? \"G81 preferred\" : metrics.peckNecessityClass === \"recommended\" ? \"Peck recommended\" : \"Peck likely necessary\",\n          highlight: metrics.exitRiskClass === \"high\"\n            ? \"Plan the breakthrough deliberately. Through-hole drilling often fails in the last millimeters, not in the first.\"\n            : \"Keep entry calm, watch chip shape early and qualify the first full breakthrough before increasing output.\",\n          summary: \"The safest first release usually comes from stable chip evacuation, a short drill, calm entry and a controlled breakthrough feed rather than chasing vc first.\",\n          facts: dedupeTextItems([\n            metrics.recipeVcTyp != null ? \"vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min\" : null,\n            metrics.recipeFnTyp != null ? \"fn typ \" + formatDisplayNumber(metrics.recipeFnTyp, 2) + \" mm/rev\" : null,\n            metrics.rpmTyp != null ? \"n \" + formatDisplayNumber(metrics.rpmTyp, 0) + \" rpm\" : null,\n            metrics.feedTypMmMin != null ? \"vf \" + formatDisplayNumber(metrics.feedTypMmMin, 0) + \" mm/min\" : null,\n          ]),\n          items: storyData.how.slice(0, 3),\n        },\n        watch: {\n          tone: riskItems.length > 1 || metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\" ? \"watch\" : \"default\",\n          eyebrow: \"Critical signals\",\n          title: \"Watch-outs\",\n          badge: \"Risk: \" + titleCase(metrics.chipEvacuationSeverityClass || \"medium\"),\n          highlight: metrics.holePassability === \"interrupted\"\n            ? \"Interrupted breakthrough is the main destabilizer in this setup.\"\n            : metrics.coolantCapabilityClass === \"weak\" || metrics.coolantCapabilityClass === \"poor\"\n              ? \"Coolant support is the main release limiter in this setup.\"\n              : metrics.exitRiskClass === \"high\"\n                ? \"Breakthrough quality is the main release limiter in this setup.\"\n                : \"Chip evacuation and setup stability still decide whether this case stays robust in series.\",\n          summary: materialProfile && materialProfile.avoid ? ensureSentence(materialProfile.avoid) : \"Qualify the first parts conservatively before increasing output.\",\n          facts: dedupeTextItems([\n            metrics.chipEvacuationSeverityClass ? \"Chip control: \" + titleCase(metrics.chipEvacuationSeverityClass) : null,\n            metrics.machineLoadSeverityClass ? \"Load: \" + titleCase(metrics.machineLoadSeverityClass) : null,\n            materialProfile && materialProfile.typicalFailure ? \"Typical failure: \" + cleanShortText(materialProfile.typicalFailure) : null,\n          ]),\n          items: storyData.watch.slice(0, 3),\n        },\n      };\n    }\n    \n    function buildRefineData(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n    \n      if (!getAnswer(ctx, \"exit_condition\")) items.push({ questionId: \"exit_condition\", label: \"Confirm exit condition\" });\n      if (metrics.entryRiskClass === \"high\" && !getAnswer(ctx, \"pilot_spot_status\")) items.push({ questionId: \"pilot_spot_status\", label: \"Confirm spot or pilot status\" });\n      if (!getAnswer(ctx, \"setup_stability\")) items.push({ questionId: \"setup_stability\", label: \"Confirm setup stability\" });\n      if ((metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\") && !getAnswer(ctx, \"machine_torque_capability\")) items.push({ questionId: \"machine_torque_capability\", label: \"Confirm torque reserve\" });\n      if (!getAnswer(ctx, \"tolerance_level\")) items.push({ questionId: \"tolerance_level\", label: \"Confirm quality target\" });\n    \n      return {\n        visible: items.length > 0 && (top.score.confidence < 0.9 || top.score.recipeConfidence !== \"exact\" || metrics.qualityFeasibilityClass === \"precision_risk\" || metrics.qualityFeasibilityClass === \"not_credible\"),\n        title: \"Improve recommendation confidence\",\n        description: \"Confirm one missing setup detail to tighten the drilling strategy and reduce estimation around entry, breakthrough or machine limits.\",\n        items: items.slice(0, 2),\n      };\n    }\n    \n    function buildDetailPanels(top, alternativeItems) {\n      var metrics = top.metrics || {};\n      var panels = [];\n    \n      panels.push({\n        eyebrow: \"Technical basis\",\n        title: \"Why this starting band is credible\",\n        summary: top.score.recipeConfidence === \"exact\"\n          ? \"The start values come from a matching through-drilling row and are then converted into rpm and feed speed at the requested diameter.\"\n          : \"The start values use the nearest valid through-drilling row and stay anchored to diameter, depth class and coolant reality.\",\n        facts: dedupeTextItems([\n          metrics.rowDepthClass ? \"Depth class \" + metrics.rowDepthClass : null,\n          metrics.requestedCoolantLabel || null,\n          metrics.recipeVcTyp != null ? \"vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min\" : null,\n          metrics.recipeFnTyp != null ? \"fn typ \" + formatDisplayNumber(metrics.recipeFnTyp, 2) + \" mm/rev\" : null,\n        ]),\n        items: dedupeTextItems([\n          metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\"\n            ? \"Coolant support is credible enough for the requested depth and material window.\"\n            : \"Coolant support stays narrow enough that the first parts matter more than the paper recipe.\",\n          metrics.usableLengthMarginMm != null ? \"Usable-length margin stays at \" + formatDisplayNumber(metrics.usableLengthMarginMm, 2) + \" mm.\" : null,\n          metrics.apmxMarginMm != null ? \"APMX margin stays at \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm.\" : null,\n          metrics.candidateHasTsc ? \"The selected drill can actually support internal coolant if the machine can deliver it.\" : null,\n        ]),\n      });\n    \n      panels.push({\n        eyebrow: \"Release checks\",\n        title: \"What to verify before full release\",\n        summary: \"Only keep increasing output once the first holes confirm chip control, breakthrough quality and the straightness level your follow-up process can accept.\",\n        facts: dedupeTextItems([\n          metrics.chipEvacuationSeverityClass ? \"Chip control \" + titleCase(metrics.chipEvacuationSeverityClass) : null,\n          metrics.exitRiskClass ? \"Breakthrough \" + titleCase(metrics.exitRiskClass) : null,\n          metrics.qualityFeasibilityClass ? \"Quality \" + titleCase(metrics.qualityFeasibilityClass) : null,\n        ]),\n        items: dedupeTextItems([\n          metrics.peckNecessityClass === \"recommended\" || metrics.peckNecessityClass === \"necessary\" ? \"Use pecking only as much as chip evacuation requires. A clean continuous cycle stays more productive when the chip window allows it.\" : \"Start without pecking unless the first chips prove otherwise.\",\n          metrics.entryRiskClass === \"high\" ? \"Stabilize the entry with spotting, a pilot or a reduced entry feed before treating the result as release-ready.\" : null,\n          metrics.exitRiskClass === \"high\" ? \"Reduce feed before breakthrough if burr, oblique exit or interruption matter.\" : null,\n          \"Keep the shortest drill and lowest runout you can realistically hold on the machine.\",\n        ]),\n      });\n    \n      panels.push({\n        type: \"alternatives\",\n        eyebrow: \"Alternatives\",\n        title: \"Alternatives worth checking\",\n        summary: \"If depth, coolant support or quality credibility stay marginal, change route before forcing standard through drilling deeper into a red zone.\",\n        items: dedupeTextItems([\n          metrics.alternativePrimary === \"deep_hole_drilling\" ? JSON.stringify({ badge: \"Process fallback\", label: \"Deep-hole drilling\", reason: \"Move to a dedicated deep-hole route when the requested L/D and coolant reality outrun a standard through-drilling window.\" }) : null,\n          metrics.alternativePrimary === \"reaming\" ? JSON.stringify({ badge: \"Process fallback\", label: \"Drill + ream\", reason: \"Keep drilling for stock removal and use reaming when the requested quality target outruns the credibility of standard drilling alone.\" }) : null,\n        ].concat((alternativeItems || []).map(function mapItem(item) {\n          return JSON.stringify({ badge: \"Tool option\", label: item.label, reason: item.reason });\n        }))).map(function parseItem(text) {\n          try {\n            return JSON.parse(text);\n          } catch (error) {\n            return null;\n          }\n        }).filter(Boolean),\n      });\n    \n      return panels;\n    }\n    \n    function buildSetupNotes(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      return [\n        { area: \"drilling\", message: \"through-hole drilling at \" + (metrics.requestedDepthRatio != null ? formatDisplayNumber(metrics.requestedDepthRatio, 2) + \"xD\" : \"unknown xD\") + \" with row class \" + (metrics.rowDepthClass || \"not confirmed\") },\n        { area: \"coolant\", message: (metrics.requestedCoolantLabel || \"coolant not confirmed\") + \", capability \" + titleCase(metrics.coolantCapabilityClass || \"review\") + \", peck \" + titleCase(metrics.peckNecessityClass || \"review\") },\n        { area: \"entry_exit\", message: \"entry \" + titleCase(metrics.requestedEntryConditionLabel || \"unknown\") + \", exit \" + titleCase(metrics.requestedExitConditionLabel || \"unknown\") + \", hole \" + titleCase(metrics.holePassabilityLabel || \"unknown\") },\n        { area: \"quality\", message: \"target \" + titleCase(metrics.requestedToleranceLevelLabel || \"general\") + \", feasibility \" + titleCase(metrics.qualityFeasibilityClass || \"review\") },\n        { area: \"material\", message: materialProfile ? materialProfile.code + \" - \" + materialProfile.label + \", typical failure \" + cleanShortText(materialProfile.typicalFailure || \"not stated\") : \"material profile not available\" },\n        { area: \"troubleshooting\", message: \"focused troubleshooting loaded for \" + buildTroubleshootingHandles(ctx, top).length + \" likely issue paths\" },\n      ];\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var alternativeItems;\n      var riskItems;\n      var machineChecks;\n      var storyData;\n      var storyPanels;\n      var troubleshooting;\n      var heroBlock;\n      var holeBlock;\n      var kpiBlock;\n      var toleranceBlock;\n      var recipeBlock;\n      var riskBlock;\n      var machineBlock;\n      var setupBlock;\n      var alternativesBlock;\n      var commerceBlock;\n    \n      if (!top || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"drilling_through\",\n          outcome: \"no_match\",\n          summary: \"No safe through-drilling recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current setup is incomplete or incompatible for a safe through-drilling recommendation.\"),\n            noMatchGuidance({\n              message: \"Check diameter, real drilling depth, coolant route, entry and breakthrough condition, interruption risk and setup stability. If the requested L/D or chip window stays too narrow, move to deep-hole drilling first and to drill-plus-ream only when quality is the dominant gap.\",\n              steps: [\n                \"Confirm the exact hole diameter and true drilling depth.\",\n                \"Verify coolant reality, especially if depth moves beyond about 3xD.\",\n                \"Clarify whether entry or breakthrough are angled, interrupted or burr-critical.\",\n                \"Check setup stability, runout and the shortest usable drill length.\",\n                \"Switch to deep-hole drilling when standard through drilling no longer keeps chip evacuation credible.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust drilling setup\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      alternativeItems = buildAlternativeItems(scored);\n      riskItems = buildRiskItems(ctx, top);\n      machineChecks = buildMachineChecks(ctx, top);\n      storyData = buildStoryData(ctx, top);\n      storyPanels = buildStoryPanels(ctx, top, riskItems, storyData);\n      troubleshooting = buildTroubleshootingCards(ctx, top);\n    \n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best fit for \" + (metrics.requestedDiameterMm != null ? formatDisplayNumber(metrics.requestedDiameterMm, 2) + \" mm\" : \"the requested diameter\") + \" Through-Hole Drilling in \" + (getMaterialLabel(ctx) || \"the selected material\") + \".\",\n        headerPills: [\n          { tone: \"good\", text: \"Best fit\" },\n          { tone: top.score.confidence >= 0.88 ? \"good\" : top.score.confidence >= 0.75 ? \"default\" : \"watch\", text: \"Confidence: \" + (top.score.confidence >= 0.88 ? \"High\" : top.score.confidence >= 0.75 ? \"Medium\" : \"Review\") },\n          { tone: metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\" ? \"watch\" : \"default\", text: \"Chip control: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") },\n          { tone: metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\" ? \"good\" : \"watch\", text: \"Coolant: \" + titleCase(metrics.coolantCapabilityClass || \"review\") },\n        ],\n      };\n    \n      holeBlock = holeSummary({\n        diameterMm: metrics.requestedDiameterMm,\n        depthMm: metrics.requestedDepthMm,\n        depthRatio: metrics.requestedDepthRatio,\n        blindThrough: \"through\",\n      });\n    \n      kpiBlock = fitKpis([\n        { key: \"diameter_fit\", label: \"Diameter fit\", value: (top.score.parts.diameter || 0).toFixed(2), status: (top.score.parts.diameter || 0) >= 2.1 ? \"good\" : \"ok\" },\n        { key: \"depth_capability\", label: \"Depth capability\", value: ((top.score.parts.depthClass || 0) + (top.score.parts.reach || 0)).toFixed(2), status: metrics.rowDepthFitScore >= 0.95 ? \"good\" : \"ok\" },\n        { key: \"chip_control\", label: \"Chip control\", value: ((top.score.parts.coolant || 0) + (top.score.parts.chipControl || 0)).toFixed(2), status: metrics.chipEvacuationSeverityClass === \"low\" || metrics.chipEvacuationSeverityClass === \"medium\" ? \"good\" : \"ok\" },\n        { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.8 ? \"good\" : \"ok\" },\n      ]);\n    \n      toleranceBlock = toleranceNotes([\n        \"Quality target: \" + String(metrics.requestedToleranceLevelLabel || \"general\"),\n        \"Quality feasibility: \" + String(metrics.qualityFeasibilityLabel || \"review\"),\n        \"Entry condition: \" + String(metrics.requestedEntryConditionLabel || \"unknown\"),\n        \"Breakthrough condition: \" + String(metrics.requestedExitConditionLabel || \"unknown\"),\n      ]);\n    \n      recipeBlock = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: buildRecipeValues(top),\n      });\n      recipeBlock.data.presentation = {\n        title: \"Start here\",\n        description: \"Use these as the first safe through-drilling values. vc and fn stay row-backed; rpm and feed speed are translated to the requested diameter.\",\n        rowBackedValues: buildRowBackedValues(top),\n        machineValues: buildMachineValues(top),\n        trustCard: buildRecipeTrustCard(top),\n        holePrepCard: buildDepthReachCard(top),\n      };\n    \n      riskBlock = riskNotes(riskItems);\n    \n      machineBlock = machineFeasibility(machineChecks);\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Coolant & setup\",\n          tone: metrics.coolantCapabilityClass === \"strong\" || metrics.coolantCapabilityClass === \"acceptable\"\n            ? (metrics.setupStability === \"strong\" ? \"good\" : \"limited\")\n            : \"high\",\n          badge: metrics.coolantCapabilityClass === \"strong\" ? \"Strong window\" : metrics.coolantCapabilityClass === \"acceptable\" ? \"Workable\" : \"Risk\",\n          value: (metrics.requestedCoolantLabel || \"Coolant route not confirmed\") + \" with \" + titleCase(metrics.setupStability || \"medium\") + \" setup stability.\",\n          note: \"Through-hole drilling stays most credible when chip evacuation, runout and breakthrough control all stay calm together.\",\n          items: dedupeTextItems(machineChecks.map(function mapCheck(item) {\n            return item.label + \": \" + item.note;\n          }).concat([\n            metrics.peckNecessityLabel ? \"Cycle guidance: \" + metrics.peckNecessityLabel + \".\" : null,\n            \"Keep the shortest possible drill and holder stack.\",\n          ])),\n        },\n      };\n    \n      setupBlock = setupNotes(buildSetupNotes(ctx, top));\n      setupBlock.data.presentation = {\n        stories: storyData,\n        storyPanels: storyPanels,\n        refine: buildRefineData(ctx, top),\n        detailPanels: buildDetailPanels(top, alternativeItems),\n        troubleshooting: troubleshooting,\n      };\n    \n      alternativesBlock = alternatives(alternativeItems);\n    \n      commerceBlock = commerceCta({\n        productUrl: candidate.catalog.url,\n        available: candidate.commerce.available,\n        priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n        ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n      });\n      commerceBlock.data.presentation = {\n        eyebrow: \"Order this tool\",\n        availabilityLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Ready to review\",\n        availabilityNote: candidate.ids.sku || \"\",\n      };\n    \n      return createResultViewModel({\n        processId: \"drilling_through\",\n        outcome: top.score.total >= 5 ? \"match\" : \"limited_match\",\n        summary: \"Best through-drilling match based on diameter, depth class, coolant capability, chip evacuation, entry and breakthrough stability.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          holeBlock,\n          kpiBlock,\n          toleranceBlock,\n          recipeBlock,\n          riskBlock,\n          machineBlock,\n          setupBlock,\n          alternativesBlock,\n          commerceBlock,\n        ],\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust drilling setup\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/drilling-through/questions.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { getQuestionDefinition } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function cloneQuestion(questionId, overrides) {\n      return createQuestionDef(Object.assign({}, getQuestionDefinition(questionId), overrides || {}));\n    }\n    \n    function getQuestions() {\n      return [\n        cloneQuestion(\"feature_diameter_mm\", {\n          label: \"Which hole diameter do you need?\",\n          helpText: \"Why it matters: the requested diameter is the primary fit key for the drill candidate and the recipe row.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"feature_depth_mm\", {\n          label: \"How deep does the through-hole need to drill?\",\n          helpText: \"Why it matters: the actual drilling depth drives the requested xD ratio, depth-class fit, usable-length margin and the chip-evacuation window.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"coolant_capability\", {\n          label: \"Which coolant support is actually available?\",\n          helpText: \"Why it matters: coolant support directly affects chip evacuation, breakthrough stability and how aggressively the start band can be released.\",\n          type: \"chips\",\n          options: [\n            { value: \"through\", label: \"Internal coolant\" },\n            { value: \"external\", label: \"External coolant\" },\n            { value: \"mql\", label: \"MQL / mist\" },\n            { value: \"dry\", label: \"Dry\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"entry_condition\", {\n          label: \"What does the entry surface look like?\",\n          helpText: \"Why it matters: non-flat entry surfaces raise walking, chipping and straightness risk, and may require spotting or a reduced entry feed.\",\n          options: [\n            { value: \"flat\", label: \"Flat\" },\n            { value: \"angled\", label: \"Angled\" },\n            { value: \"convex\", label: \"Convex\" },\n            { value: \"concave\", label: \"Concave\" },\n            { value: \"uneven\", label: \"Uneven\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"hole_passability\", {\n          label: \"Is the hole solid all the way through or interrupted?\",\n          helpText: \"Why it matters: interrupted or cross-hole breakthrough changes chip control, edge stability and the risk of breakout or tool damage.\",\n          options: [\n            { value: \"solid\", label: \"Solid / whole material\" },\n            { value: \"interrupted\", label: \"Interrupted / cross-hole\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"material_condition_class\", {\n          label: \"How does the selected material behave in practice?\",\n          helpText: \"Why it matters: the Step 1 ISO subgroup stays the baseline, but drilling still needs one extra clue for chip behavior, adhesiveness or work-hardening in the real workpiece.\",\n          options: [\n            { value: \"standard\", label: \"Standard\" },\n            { value: \"tough_long_chipping\", label: \"Tough / long-chipping\" },\n            { value: \"sticky_bue\", label: \"Sticky / built-up edge\" },\n            { value: \"work_hardening\", label: \"Work-hardening\" },\n            { value: \"hard_abrasive\", label: \"Hard / abrasive\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"priority\", {\n          label: \"What matters most?\",\n          helpText: \"Why it matters: this biases the ranking between a standard recommendation, tighter quality, higher process security or higher output.\",\n          group: \"advanced\",\n          required: false,\n          options: [\n            { value: \"balanced\", label: \"Standard\" },\n            { value: \"precision\", label: \"Precise\" },\n            { value: \"safety\", label: \"Process safety\" },\n            { value: \"productivity\", label: \"Productivity\" },\n          ],\n        }),\n        cloneQuestion(\"exit_condition\", {\n          label: \"Is the breakthrough straight, oblique or burr-critical?\",\n          helpText: \"Why it matters: through-hole drilling often fails at breakthrough, so burr-sensitive or oblique exits need more conservative release rules.\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          options: [\n            { value: \"clear_exit\", label: \"Straight exit\" },\n            { value: \"oblique_exit\", label: \"Oblique exit\" },\n            { value: \"burr_critical\", label: \"Burr-critical exit\" },\n            { value: \"interrupted_exit\", label: \"Interrupted exit\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"pilot_spot_status\", {\n          label: \"Is there already a spot or pilot hole?\",\n          helpText: \"Why it matters: spot or pilot guidance can stabilize angled entry, longer drills and higher straightness demands.\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          options: [\n            { value: \"none\", label: \"No\" },\n            { value: \"spot_only\", label: \"Spot only\" },\n            { value: \"pilot_hole\", label: \"Pilot hole\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"setup_stability\", {\n          label: \"How stable are holder, machine and clamping?\",\n          helpText: \"Why it matters: stability and runout directly affect straightness, surface quality, edge life and breakthrough behavior.\",\n          group: \"machine\",\n          expertOnly: true,\n          required: false,\n          options: [\n            { value: \"strong\", label: \"Strong\" },\n            { value: \"medium\", label: \"Normal\" },\n            { value: \"weak\", label: \"Weak\" },\n          ],\n        }),\n        cloneQuestion(\"machine_torque_capability\", {\n          label: \"Is spindle power or torque a concern?\",\n          helpText: \"Why it matters: larger diameters, deeper drilling and hard materials can hit torque limits before the recipe band becomes productive.\",\n          group: \"machine\",\n          expertOnly: true,\n          required: false,\n          options: [\n            { value: \"high\", label: \"No issue\" },\n            { value: \"medium\", label: \"Some limit\" },\n            { value: \"low\", label: \"Clearly limited\" },\n          ],\n        }),\n        cloneQuestion(\"tolerance_level\", {\n          label: \"How demanding is the hole-quality target?\",\n          helpText: \"Why it matters: straightness, tolerance and finish requirements decide how conservative the recommendation and breakthrough strategy should stay.\",\n          group: \"safety\",\n          expertOnly: true,\n          required: false,\n          options: [\n            { value: \"general\", label: \"General\" },\n            { value: \"tight\", label: \"Tight\" },\n            { value: \"high_precision\", label: \"High precision\" },\n          ],\n        }),\n      ];\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/drilling-through/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp01(value) {\n      if (!Number.isFinite(value)) return 0;\n      return value <= 0 ? 0 : value >= 1 ? 1 : value;\n    }\n    \n    function roundValue(value, digits) {\n      var factor = Math.pow(10, digits == null ? 2 : digits);\n      return value == null || !Number.isFinite(value) ? null : Math.round(value * factor) / factor;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function normalizeCoolantCapability(value) {\n      switch (String(value || \"\").toLowerCase()) {\n        case \"through\": return \"through\";\n        case \"external\": return \"external\";\n        case \"mql\": return \"mist\";\n        case \"dry\": return \"dry\";\n        default: return \"unknown\";\n      }\n    }\n    \n    function getDepthClassFromRatio(ratio) {\n      if (ratio == null || !Number.isFinite(ratio) || ratio <= 0) return null;\n      if (ratio <= 3) return \"3xD\";\n      if (ratio <= 5) return \"5xD\";\n      if (ratio <= 8) return \"8xD\";\n      if (ratio <= 10) return \"10xD\";\n      return \"12xD\";\n    }\n    \n    function depthClassCapacity(value) {\n      var match = String(value || \"\").match(/^(\\d+(?:\\.\\d+)?)xD$/i);\n      return match ? Number(match[1]) : null;\n    }\n    \n    function collectMaterialCodes(row) {\n      var constraints = row && row.constraints ? row.constraints : {};\n      return []\n        .concat(constraints.materialCodes || [])\n        .concat(constraints.secondaryMaterialCodes || [])\n        .map(function mapCode(item) { return String(item || \"\").trim().toUpperCase(); })\n        .filter(Boolean);\n    }\n    \n    function materialMatchClass(row, materialCode) {\n      var requested = String(materialCode || \"\").trim().toUpperCase();\n      var family = requested ? requested.charAt(0) : null;\n      var rowCodes = collectMaterialCodes(row);\n      if (!requested || !rowCodes.length) return \"exact\";\n      if (rowCodes.indexOf(requested) >= 0) return \"exact\";\n      if (family && rowCodes.some(function someCode(code) { return code === family || code.charAt(0) === family; })) return \"near\";\n      return \"none\";\n    }\n    \n    function mapMaterialCondition(value) {\n      switch (String(value || \"\").toLowerCase()) {\n        case \"tough_long_chipping\":\n          return { code: \"tough_long_chipping\", label: \"Tough / long-chipping\" };\n        case \"sticky_bue\":\n          return { code: \"sticky_bue\", label: \"Sticky / built-up edge\" };\n        case \"work_hardening\":\n          return { code: \"work_hardening\", label: \"Work-hardening\" };\n        case \"hard_abrasive\":\n          return { code: \"hard_abrasive\", label: \"Hard / abrasive\" };\n        case \"unknown\":\n          return { code: \"unknown\", label: \"Unknown\" };\n        default:\n          return { code: \"standard\", label: \"Standard\" };\n      }\n    }\n    \n    function getMaterialDifficulty(materialGroup, materialConditionCode, materialProfile) {\n      var score = 0;\n      if (materialGroup === \"M\" || materialGroup === \"S\") score += 2;\n      if (materialGroup === \"H\") score += 3;\n      if (materialConditionCode === \"tough_long_chipping\" || materialConditionCode === \"sticky_bue\") score += 2;\n      if (materialConditionCode === \"work_hardening\" || materialConditionCode === \"hard_abrasive\") score += 2;\n      if (materialProfile && String(materialProfile.workHardening || \"\").toLowerCase().indexOf(\"high\") >= 0) score += 1;\n      if (materialProfile && String(materialProfile.buildUpEdgeTendency || \"\").toLowerCase().indexOf(\"high\") >= 0) score += 1;\n      if (materialProfile && String(materialProfile.abrasiveness || \"\").toLowerCase().indexOf(\"high\") >= 0) score += 1;\n      return score;\n    }\n    \n    function deriveCoolantCapability(materialGroup, requestedCoolant, candidateHasTsc, requestedRatio, materialConditionCode, materialProfile) {\n      var difficult = getMaterialDifficulty(materialGroup, materialConditionCode, materialProfile) >= 3;\n      var score = 0.4;\n    \n      switch (requestedCoolant) {\n        case \"through\":\n          score = candidateHasTsc ? 1 : 0.18;\n          break;\n        case \"external\":\n          if (requestedRatio == null || requestedRatio <= 3) score = difficult ? 0.58 : 0.78;\n          else if (requestedRatio <= 5) score = difficult ? 0.38 : 0.6;\n          else if (requestedRatio <= 8) score = difficult ? 0.24 : 0.42;\n          else score = difficult ? 0.12 : 0.28;\n          break;\n        case \"mist\":\n          if (requestedRatio != null && requestedRatio <= 2 && !difficult) score = 0.54;\n          else if (requestedRatio != null && requestedRatio <= 3) score = 0.36;\n          else score = 0.22;\n          break;\n        case \"dry\":\n          if ((materialGroup === \"K\" || materialGroup === \"H\") && (requestedRatio == null || requestedRatio <= 3)) score = 0.52;\n          else score = 0.12;\n          break;\n        default:\n          score = difficult ? 0.32 : 0.46;\n          break;\n      }\n    \n      return {\n        code: score >= 0.85 ? \"strong\" : score >= 0.6 ? \"acceptable\" : score >= 0.35 ? \"weak\" : \"poor\",\n        label: score >= 0.85\n          ? \"Coolant window is strong for through drilling.\"\n          : score >= 0.6\n            ? \"Coolant window is workable for this depth and material.\"\n            : score >= 0.35\n              ? \"Coolant window is narrow for reliable chip evacuation.\"\n              : \"Coolant window is weak for this drilling load.\",\n        fitScore: clamp01(score),\n      };\n    }\n    \n    function deriveChipEvacuationSeverity(materialGroup, materialConditionCode, materialProfile, requestedRatio, coolantCapability, holePassability) {\n      var level = 0;\n      var chipForm = materialProfile && String(materialProfile.chipForm || \"\").toLowerCase();\n      var workHardening = materialProfile && String(materialProfile.workHardening || \"\").toLowerCase();\n      var bue = materialProfile && String(materialProfile.buildUpEdgeTendency || \"\").toLowerCase();\n    \n      if (requestedRatio != null) {\n        if (requestedRatio > 3) level += 1;\n        if (requestedRatio > 5) level += 1;\n        if (requestedRatio > 8) level += 1;\n      }\n      if (holePassability === \"interrupted\") level += 1;\n      if (coolantCapability.code === \"weak\") level += 1;\n      if (coolantCapability.code === \"poor\") level += 2;\n      if (materialConditionCode === \"tough_long_chipping\" || materialConditionCode === \"sticky_bue\") level += 1;\n      if (materialConditionCode === \"work_hardening\" && (requestedRatio == null || requestedRatio > 3 || coolantCapability.code !== \"strong\")) level += 1;\n      if (chipForm === \"long\" && ((requestedRatio != null && requestedRatio > 3) || holePassability === \"interrupted\" || coolantCapability.code !== \"strong\")) level += 1;\n      if (workHardening.indexOf(\"high\") >= 0 && ((requestedRatio != null && requestedRatio > 3) || coolantCapability.code === \"weak\" || coolantCapability.code === \"poor\")) level += 1;\n      if (bue.indexOf(\"high\") >= 0 && (coolantCapability.code !== \"strong\" || materialConditionCode === \"sticky_bue\" || materialGroup === \"N\")) level += 1;\n      if ((materialGroup === \"M\" && requestedRatio != null && requestedRatio > 3) || (materialGroup === \"S\" && requestedRatio != null && requestedRatio > 2)) level += 1;\n      if (materialGroup === \"K\" || materialGroup === \"H\" || chipForm === \"short\" || chipForm === \"powder\") level -= 1;\n      if (coolantCapability.code === \"strong\" && requestedRatio != null && requestedRatio <= 3 && holePassability !== \"interrupted\") level -= 1;\n      if (materialProfile && Number(materialProfile.machinability) >= 75) level -= 1;\n      if (level < 0) level = 0;\n      if (level > 3) level = 3;\n    \n      return {\n        code: [\"low\", \"medium\", \"high\", \"critical\"][level],\n        label: [\"Low chip-evacuation risk\", \"Medium chip-evacuation risk\", \"High chip-evacuation risk\", \"Critical chip-evacuation risk\"][level],\n        fitScore: [1, 0.74, 0.42, 0.12][level],\n        level: level,\n      };\n    }\n    \n    function deriveEntryRisk(entryCondition, pilotSpotStatus) {\n      var level = 1;\n      switch (String(entryCondition || \"\").toLowerCase()) {\n        case \"flat\":\n          level = 0;\n          break;\n        case \"angled\":\n        case \"convex\":\n        case \"concave\":\n        case \"uneven\":\n          level = 2;\n          break;\n        default:\n          level = 1;\n          break;\n      }\n      if (pilotSpotStatus === \"spot_only\") level -= 1;\n      if (pilotSpotStatus === \"pilot_hole\") level -= 2;\n      if (level < 0) level = 0;\n      if (level > 2) level = 2;\n      return {\n        code: [\"low\", \"medium\", \"high\"][level],\n        label: [\"Stable entry\", \"Review entry\", \"High entry risk\"][level],\n        fitScore: [1, 0.72, 0.38][level],\n        level: level,\n      };\n    }\n    \n    function deriveExitRisk(exitCondition, holePassability, materialGroup, materialProfile) {\n      var level = 0;\n      var chipForm = materialProfile && String(materialProfile.chipForm || \"\").toLowerCase();\n    \n      switch (String(exitCondition || \"\").toLowerCase()) {\n        case \"clear_exit\":\n          level = 0;\n          break;\n        case \"oblique_exit\":\n        case \"burr_critical\":\n        case \"interrupted_exit\":\n          level = 2;\n          break;\n        default:\n          level = 1;\n          break;\n      }\n      if (holePassability === \"interrupted\") level += 1;\n      if ((materialGroup === \"N\" || materialGroup === \"M\" || chipForm === \"long\") && String(exitCondition || \"\").toLowerCase() !== \"clear_exit\") level += 1;\n      if (level > 2) level = 2;\n    \n      return {\n        code: [\"low\", \"medium\", \"high\"][level],\n        label: [\"Stable breakthrough\", \"Watch breakthrough\", \"High breakthrough risk\"][level],\n        fitScore: [1, 0.72, 0.34][level],\n        level: level,\n      };\n    }\n    \n    function deriveLoadSeverity(materialGroup, requestedRatio, materialConditionCode, coolantCapability, torqueCapability, setupStability, materialProfile) {\n      var level = 0;\n      if (requestedRatio != null) {\n        if (requestedRatio > 3) level += 1;\n        if (requestedRatio > 5) level += 1;\n      }\n      if (materialGroup === \"M\" || materialGroup === \"S\") level += 1;\n      if (materialGroup === \"H\") level += 2;\n      if (materialConditionCode === \"work_hardening\" || materialConditionCode === \"hard_abrasive\") level += 1;\n      if (materialConditionCode === \"sticky_bue\") level += 1;\n      if (coolantCapability.code === \"weak\") level += 1;\n      if (coolantCapability.code === \"poor\") level += 2;\n      if (String(torqueCapability || \"\").toLowerCase() === \"medium\") level += 1;\n      if (String(torqueCapability || \"\").toLowerCase() === \"low\") level += 2;\n      if (String(setupStability || \"\").toLowerCase() === \"weak\") level += 2;\n      if (materialProfile && String(materialProfile.abrasiveness || \"\").toLowerCase().indexOf(\"very\") >= 0) level += 1;\n      if (materialGroup === \"K\" && requestedRatio != null && requestedRatio <= 3) level -= 1;\n      if (level < 0) level = 0;\n      if (level > 3) level = 3;\n    \n      return {\n        code: [\"light\", \"normal\", \"high\", \"critical\"][level],\n        label: [\"Light machine load\", \"Normal machine load\", \"High machine load\", \"Critical machine load\"][level],\n        fitScore: [1, 0.8, 0.52, 0.18][level],\n        level: level,\n      };\n    }\n    \n    function derivePeckClass(requestedRatio, coolantCapability, chipSeverity, holePassability) {\n      var code;\n      if ((requestedRatio == null || requestedRatio <= 3) && chipSeverity.code === \"low\" && holePassability !== \"interrupted\" && (coolantCapability.code === \"strong\" || coolantCapability.code === \"acceptable\")) {\n        code = \"none\";\n      } else if ((requestedRatio != null && requestedRatio > 8) || chipSeverity.code === \"critical\" || (holePassability === \"interrupted\" && (coolantCapability.code === \"weak\" || coolantCapability.code === \"poor\"))) {\n        code = \"necessary\";\n      } else {\n        code = \"recommended\";\n      }\n      return {\n        code: code,\n        label: code === \"none\" ? \"No peck preferred\" : code === \"recommended\" ? \"Pecking recommended\" : \"Pecking likely necessary\",\n        fitScore: code === \"none\" ? 1 : code === \"recommended\" ? 0.68 : 0.3,\n      };\n    }\n    \n    function deriveQualityFeasibility(toleranceLevel, chipSeverity, entryRisk, exitRisk, setupStability) {\n      var stabilityPenalty = String(setupStability || \"\").toLowerCase() === \"strong\" ? 0 : String(setupStability || \"\").toLowerCase() === \"weak\" ? 2 : 1;\n      var totalRisk = chipSeverity.level + entryRisk.level + exitRisk.level + stabilityPenalty;\n      var code = \"standard\";\n    \n      switch (String(toleranceLevel || \"\").toLowerCase()) {\n        case \"high_precision\":\n          code = totalRisk <= 1 ? \"good\" : totalRisk <= 3 ? \"precision_risk\" : \"not_credible\";\n          break;\n        case \"tight\":\n          code = totalRisk <= 2 ? \"good\" : totalRisk <= 4 ? \"precision_risk\" : \"not_credible\";\n          break;\n        default:\n          code = totalRisk <= 3 ? \"standard\" : totalRisk <= 5 ? \"precision_risk\" : \"not_credible\";\n          break;\n      }\n    \n      return {\n        code: code,\n        label: code === \"good\"\n          ? \"Quality target looks credible.\"\n          : code === \"standard\"\n            ? \"Standard drilling quality looks credible.\"\n            : code === \"precision_risk\"\n              ? \"Quality target is possible, but the setup window is narrow.\"\n              : \"Quality target is not credible without improving the setup window.\",\n        fitScore: code === \"good\" ? 1 : code === \"standard\" ? 0.84 : code === \"precision_risk\" ? 0.46 : 0.12,\n      };\n    }\n    \n    function getMaterialLabel(ctx) {\n      return ctx && ctx.material && ctx.material.subgroupCode\n        ? ctx.material.subgroupCode + (ctx.material.subgroupLabel && ctx.material.subgroupLabel !== ctx.material.subgroupCode ? \" - \" + ctx.material.subgroupLabel : \"\")\n        : null;\n    }\n    \n    function isThroughCompatible(row) {\n      var blindThrough = row && row.constraints ? row.constraints.blindThrough : null;\n      return !blindThrough || blindThrough === \"through\" || blindThrough === \"either\";\n    }\n    \n    function coolantMatchScore(rowCoolant, requestedCoolant) {\n      var normalizedRowCoolant = String(rowCoolant || \"\").toLowerCase();\n      var normalizedRequested = String(requestedCoolant || \"\").toLowerCase();\n      if (!normalizedRequested || normalizedRequested === \"unknown\") return 0.6;\n      if (!normalizedRowCoolant || normalizedRowCoolant === \"unknown\") return 0.55;\n      if (normalizedRowCoolant === normalizedRequested) return 1;\n      if (normalizedRequested === \"through\") return normalizedRowCoolant === \"external\" ? 0.42 : 0.25;\n      if (normalizedRequested === \"external\") return normalizedRowCoolant === \"through\" ? 0.78 : normalizedRowCoolant === \"mist\" ? 0.52 : 0.34;\n      if (normalizedRequested === \"mist\") return normalizedRowCoolant === \"external\" ? 0.55 : normalizedRowCoolant === \"through\" ? 0.45 : 0.28;\n      if (normalizedRequested === \"dry\") return normalizedRowCoolant === \"external\" ? 0.42 : normalizedRowCoolant === \"through\" ? 0.38 : 0.3;\n      return 0.5;\n    }\n    \n    function resolveDrillRow(candidate, ctx, requestedDepthRatio, requestedCoolant) {\n      var rows = candidate && candidate.rows ? candidate.rows.drilling || [] : [];\n      var processId = ctx && ctx.process ? ctx.process.id : null;\n      var materialCode = ctx && ctx.material ? ctx.material.subgroupCode : null;\n      var best = null;\n      var requestedDepthClass = getDepthClassFromRatio(requestedDepthRatio);\n      var requestedCapacity = depthClassCapacity(requestedDepthClass);\n    \n      rows.forEach(function eachRow(row) {\n        var processIds = row && row.constraints ? row.constraints.processIds || [] : [];\n        var materialClass;\n        var rowDepthClass;\n        var rowCapacity;\n        var depthFitScore;\n        var coolantScore;\n        var score;\n    \n        if (processId && processIds.length && processIds.indexOf(processId) < 0) return;\n        if (!isThroughCompatible(row)) return;\n    \n        materialClass = materialMatchClass(row, materialCode);\n        if (materialClass === \"none\") return;\n    \n        rowDepthClass = row && row.familyData ? row.familyData.holeDepthClass : null;\n        rowCapacity = depthClassCapacity(rowDepthClass);\n        if (requestedCapacity != null && rowCapacity != null) {\n          depthFitScore = rowCapacity >= requestedCapacity ? clamp01(0.8 + Math.min(0.2, (rowCapacity - requestedCapacity) * 0.06)) : clamp01(rowCapacity / requestedCapacity);\n        } else if (requestedCapacity != null && rowCapacity == null) {\n          depthFitScore = 0.78;\n        } else {\n          depthFitScore = 0.8;\n        }\n    \n        coolantScore = coolantMatchScore(row && row.constraints ? row.constraints.coolantMode : null, requestedCoolant);\n        score = (materialClass === \"exact\" ? 4 : 2.4) + (depthFitScore * 3.2) + (coolantScore * 2.2);\n    \n        if (!best || score > best.score) {\n          best = {\n            row: row,\n            score: score,\n            materialClass: materialClass,\n            depthFitScore: depthFitScore,\n            coolantFitScore: coolantScore,\n            requestedDepthClass: requestedDepthClass,\n            rowDepthClass: rowDepthClass,\n          };\n        }\n      });\n    \n      if (!best) {\n        return {\n          row: null,\n          source: \"none\",\n          depthFitScore: 0,\n          coolantFitScore: 0,\n          requestedDepthClass: requestedDepthClass,\n          rowDepthClass: null,\n          materialClass: \"none\",\n        };\n      }\n    \n      return {\n        row: best.row,\n        source: best.materialClass === \"exact\" && best.depthFitScore >= 0.95 && best.coolantFitScore >= 0.95\n          ? \"exact\"\n          : best.materialClass !== \"none\" && best.depthFitScore >= 0.7\n            ? \"near\"\n            : \"estimated\",\n        depthFitScore: best.depthFitScore,\n        coolantFitScore: best.coolantFitScore,\n        requestedDepthClass: best.requestedDepthClass,\n        rowDepthClass: best.rowDepthClass,\n        materialClass: best.materialClass,\n      };\n    }\n    \n    function computeRpm(vc, diameter) {\n      if (vc == null || diameter == null || diameter <= 0) return null;\n      return (1000 * vc) / (Math.PI * diameter);\n    }\n    \n    function computeFeed(fn, rpm) {\n      if (fn == null || rpm == null) return null;\n      return fn * rpm;\n    }\n    \n    function computeMrr(diameter, fn, vc) {\n      if (diameter == null || fn == null || vc == null) return null;\n      return (diameter * fn * vc) / 4;\n    }\n    \n    function computeCycleTimeSec(depth, feedMmMin) {\n      if (depth == null || feedMmMin == null || feedMmMin <= 0) return null;\n      return (depth / feedMmMin) * 60;\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"drilling_through\", ctx, toolkits));\n      var materialProfile = ctx && ctx.material ? ctx.material.profile : null;\n      var materialGroup = ctx && ctx.material ? ctx.material.isoGroup : null;\n      var diameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var requestedRatio = diameter != null && depth != null && diameter > 0 ? depth / diameter : null;\n      var requestedCoolant = normalizeCoolantCapability(getAnswer(ctx, \"coolant_capability\"));\n      var holePassability = toNullableString(getAnswer(ctx, \"hole_passability\")) || \"unknown\";\n      var materialCondition = mapMaterialCondition(getAnswer(ctx, \"material_condition_class\"));\n      var setupStability = toNullableString(getAnswer(ctx, \"setup_stability\")) || \"medium\";\n      var torqueCapability = toNullableString(getAnswer(ctx, \"machine_torque_capability\")) || \"medium\";\n      var pilotSpotStatus = toNullableString(getAnswer(ctx, \"pilot_spot_status\")) || \"unknown\";\n      var toleranceLevel = toNullableString(getAnswer(ctx, \"tolerance_level\")) || \"general\";\n      var coolantCapability = deriveCoolantCapability(materialGroup, requestedCoolant, requestedCoolant === \"through\", requestedRatio, materialCondition.code, materialProfile);\n      var chipSeverity = deriveChipEvacuationSeverity(materialGroup, materialCondition.code, materialProfile, requestedRatio, coolantCapability, holePassability);\n      var entryRisk = deriveEntryRisk(getAnswer(ctx, \"entry_condition\"), pilotSpotStatus);\n      var exitRisk = deriveExitRisk(getAnswer(ctx, \"exit_condition\"), holePassability, materialGroup, materialProfile);\n      var loadSeverity = deriveLoadSeverity(materialGroup, requestedRatio, materialCondition.code, coolantCapability, torqueCapability, setupStability, materialProfile);\n      var peckClass = derivePeckClass(requestedRatio, coolantCapability, chipSeverity, holePassability);\n      var qualityFeasibility = deriveQualityFeasibility(toleranceLevel, chipSeverity, entryRisk, exitRisk, setupStability);\n    \n      derived.requested_diameter_mm = diameter;\n      derived.requested_depth_mm = depth;\n      derived.requested_depth_ratio = requestedRatio;\n      derived.requested_depth_class = getDepthClassFromRatio(requestedRatio);\n      derived.coolant_mode = requestedCoolant;\n      derived.coolant_capability_class = coolantCapability.code;\n      derived.coolant_capability_label = coolantCapability.label;\n      derived.chip_evacuation_severity_class = chipSeverity.code;\n      derived.chip_evacuation_severity_label = chipSeverity.label;\n      derived.entry_stability_risk_class = entryRisk.code;\n      derived.entry_stability_risk_label = entryRisk.label;\n      derived.exit_breakthrough_risk_class = exitRisk.code;\n      derived.exit_breakthrough_risk_label = exitRisk.label;\n      derived.material_condition_label = materialCondition.label;\n      derived.machine_load_severity_class = loadSeverity.code;\n      derived.machine_load_severity_label = loadSeverity.label;\n      derived.peck_necessity_class = peckClass.code;\n      derived.peck_necessity_label = peckClass.label;\n      derived.quality_feasibility_class = qualityFeasibility.code;\n      derived.quality_feasibility_label = qualityFeasibility.label;\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"drilling_through\", ctx);\n      var materialProfile = ctx && ctx.material ? ctx.material.profile : null;\n      var materialGroup = ctx && ctx.material ? ctx.material.isoGroup : null;\n      var requestedRatio = toNullableNumber(ctx && ctx.derived ? ctx.derived.requested_depth_ratio : null);\n      var requestedCoolant = normalizeCoolantCapability(getAnswer(ctx, \"coolant_capability\"));\n      var holePassability = toNullableString(getAnswer(ctx, \"hole_passability\")) || \"unknown\";\n      var materialCondition = mapMaterialCondition(getAnswer(ctx, \"material_condition_class\"));\n      var setupStability = toNullableString(getAnswer(ctx, \"setup_stability\")) || \"medium\";\n      var toleranceLevel = toNullableString(getAnswer(ctx, \"tolerance_level\")) || \"general\";\n    \n      if ((requestedCoolant === \"external\" || requestedCoolant === \"mist\" || requestedCoolant === \"dry\") && requestedRatio != null && requestedRatio > 3) {\n        issues.push({\n          field: \"coolant_capability\",\n          message: materialGroup === \"M\" || materialGroup === \"S\" || materialCondition.code === \"tough_long_chipping\" || materialCondition.code === \"work_hardening\"\n            ? \"External, mist or dry coolant beyond about 3xD is especially risky here and needs a conservative drilling strategy.\"\n            : \"External, mist or dry coolant beyond about 3xD narrows the chip window and needs a conservative drilling strategy.\",\n          severity: \"warning\",\n          code: \"coolant_depth_warning\",\n        });\n      }\n      if (holePassability === \"interrupted\" && requestedRatio != null && requestedRatio >= 3 && requestedCoolant !== \"through\") {\n        issues.push({\n          field: \"hole_passability\",\n          message: \"Interrupted through-holes with limited coolant support raise breakage and chip-control risk.\",\n          severity: \"warning\",\n          code: \"interrupted_hole_warning\",\n        });\n      }\n      if (String(getAnswer(ctx, \"entry_condition\") || \"\").toLowerCase() !== \"flat\") {\n        issues.push({\n          field: \"entry_condition\",\n          message: \"Non-flat entry surfaces usually need spotting, piloting or a reduced entry feed.\",\n          severity: \"warning\",\n          code: \"entry_surface_warning\",\n        });\n      }\n      if ([\"oblique_exit\", \"burr_critical\", \"interrupted_exit\"].indexOf(String(getAnswer(ctx, \"exit_condition\") || \"\").toLowerCase()) >= 0) {\n        issues.push({\n          field: \"exit_condition\",\n          message: \"Breakthrough strategy matters here. Reduce feed before exit and qualify burr or breakout carefully.\",\n          severity: \"warning\",\n          code: \"breakthrough_warning\",\n        });\n      }\n      if (setupStability === \"weak\" && (toleranceLevel === \"tight\" || toleranceLevel === \"high_precision\")) {\n        issues.push({\n          field: \"setup_stability\",\n          message: \"A weak setup does not support a tight drilling-quality target credibly.\",\n          severity: \"warning\",\n          code: \"quality_stability_warning\",\n        });\n      }\n      if (materialProfile && String(materialProfile.preferredCoolantMode || \"\").toLowerCase() === \"through\" && requestedCoolant !== \"through\" && requestedRatio != null && requestedRatio > 3) {\n        issues.push({\n          field: \"coolant_capability\",\n          message: \"The selected material profile strongly prefers internal coolant for this depth range.\",\n          severity: \"warning\",\n          code: \"material_coolant_preference\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"drilling_through\", pool);\n    }\n    \n    function score(pool, ctx, kernel) {\n      var materialProfile = ctx && ctx.material ? ctx.material.profile : null;\n      var materialGroup = ctx && ctx.material ? ctx.material.isoGroup : null;\n      var materialLabel = getMaterialLabel(ctx);\n      var diameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var requestedRatio = diameter != null && depth != null && diameter > 0 ? depth / diameter : null;\n      var requestedDepthClass = getDepthClassFromRatio(requestedRatio);\n      var requestedCoolant = normalizeCoolantCapability(getAnswer(ctx, \"coolant_capability\"));\n      var holePassability = toNullableString(getAnswer(ctx, \"hole_passability\")) || \"unknown\";\n      var materialCondition = mapMaterialCondition(getAnswer(ctx, \"material_condition_class\"));\n      var entryCondition = toNullableString(getAnswer(ctx, \"entry_condition\")) || \"unknown\";\n      var exitCondition = toNullableString(getAnswer(ctx, \"exit_condition\")) || \"unknown\";\n      var setupStability = toNullableString(getAnswer(ctx, \"setup_stability\")) || \"medium\";\n      var torqueCapability = toNullableString(getAnswer(ctx, \"machine_torque_capability\")) || \"medium\";\n      var pilotSpotStatus = toNullableString(getAnswer(ctx, \"pilot_spot_status\")) || \"unknown\";\n      var toleranceLevel = toNullableString(getAnswer(ctx, \"tolerance_level\")) || \"general\";\n      var priority = toNullableString(getAnswer(ctx, \"priority\")) || \"balanced\";\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var diameterFit = diameter != null ? kernel.diameterFit(candidate, diameter) : 0;\n        var reachScore = depth != null ? kernel.reachFit(candidate, depth) : 0;\n        var usableLength = candidate && candidate.common ? toNullableNumber(candidate.common.usableLengthMm) : null;\n        var apmxLength = candidate && candidate.common ? toNullableNumber(candidate.common.apmxMm) : null;\n        var resolvedRow = resolveDrillRow(candidate, ctx, requestedRatio, requestedCoolant);\n        var recipe = resolvedRow.row ? resolvedRow.row.recipe : null;\n        var candidateDiameter = candidate && candidate.common ? toNullableNumber(candidate.common.diameterMm) : diameter;\n        var coolantCapability = deriveCoolantCapability(materialGroup, requestedCoolant, Boolean(candidate && candidate.common && candidate.common.coolantTsc), requestedRatio, materialCondition.code, materialProfile);\n        var chipSeverity = deriveChipEvacuationSeverity(materialGroup, materialCondition.code, materialProfile, requestedRatio, coolantCapability, holePassability);\n        var entryRisk = deriveEntryRisk(entryCondition, pilotSpotStatus);\n        var exitRisk = deriveExitRisk(exitCondition, holePassability, materialGroup, materialProfile);\n        var loadSeverity = deriveLoadSeverity(materialGroup, requestedRatio, materialCondition.code, coolantCapability, torqueCapability, setupStability, materialProfile);\n        var peckClass = derivePeckClass(requestedRatio, coolantCapability, chipSeverity, holePassability);\n        var qualityFeasibility = deriveQualityFeasibility(toleranceLevel, chipSeverity, entryRisk, exitRisk, setupStability);\n        var rpmMin = computeRpm(recipe && recipe.vc ? recipe.vc.min : null, candidateDiameter);\n        var rpmTyp = computeRpm(recipe && recipe.vc ? recipe.vc.typ : null, candidateDiameter);\n        var rpmMax = computeRpm(recipe && recipe.vc ? recipe.vc.max : null, candidateDiameter);\n        var feedMin = computeFeed(recipe && recipe.fn ? recipe.fn.min : null, rpmMin);\n        var feedTyp = computeFeed(recipe && recipe.fn ? recipe.fn.typ : null, rpmTyp);\n        var feedMax = computeFeed(recipe && recipe.fn ? recipe.fn.max : null, rpmMax);\n        var mrrTyp = computeMrr(candidateDiameter, recipe && recipe.fn ? recipe.fn.typ : null, recipe && recipe.vc ? recipe.vc.typ : null);\n        var cycleTimeSec = computeCycleTimeSec(depth, feedTyp);\n        var usableLengthMarginMm = usableLength != null && depth != null ? usableLength - depth : null;\n        var apmxMarginMm = apmxLength != null && depth != null ? apmxLength - depth : null;\n        var coolantScore = clamp01((coolantCapability.fitScore * 0.7) + (resolvedRow.coolantFitScore * 0.3));\n        var chipControlScore = chipSeverity.fitScore;\n        var entryScore = entryRisk.fitScore;\n        var exitScore = exitRisk.fitScore;\n        var setupScore = clamp01((loadSeverity.fitScore * 0.6) + (String(setupStability || \"\").toLowerCase() === \"strong\" ? 0.4 : String(setupStability || \"\").toLowerCase() === \"weak\" ? 0.12 : 0.26));\n        var qualityScore = qualityFeasibility.fitScore;\n        var priorityBias = priority === \"safety\"\n          ? clamp01((coolantScore + chipControlScore + setupScore) / 3)\n          : priority === \"precision\"\n            ? clamp01((qualityScore + entryScore + exitScore) / 3)\n            : priority === \"productivity\"\n              ? clamp01(((recipe && recipe.vc && recipe.vc.typ ? 0.65 : 0.35) + coolantScore + chipControlScore) / 3)\n              : clamp01((qualityScore + coolantScore + chipControlScore) / 3);\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidenceMap;\n        var confidence;\n        var severityPenalty;\n        var reasons;\n        var metrics;\n        var alternativePrimary = null;\n    \n        if (diameter != null && diameterFit < 0.6) hardRejectReason = \"Tool diameter is too far from the requested through-hole size.\";\n        if (!hardRejectReason && usableLengthMarginMm != null && usableLengthMarginMm < 0) hardRejectReason = \"Usable length is shorter than the requested through-hole depth.\";\n        if (!hardRejectReason && apmxMarginMm != null && apmxMarginMm < 0) hardRejectReason = \"Maximum drill depth is shorter than the requested through-hole depth.\";\n        if (!hardRejectReason && !resolvedRow.row) hardRejectReason = \"No through-drilling row is available for the selected process and material.\";\n        if (!hardRejectReason && resolvedRow.depthFitScore < 0.75) hardRejectReason = \"The available depth class is shorter than the requested xD range.\";\n    \n        severityPenalty = chipSeverity.code === \"critical\" ? 0.55 : chipSeverity.code === \"high\" ? 0.25 : 0;\n        if (qualityFeasibility.code === \"not_credible\") severityPenalty += 0.35;\n        if (exitRisk.code === \"high\" && exitCondition === \"interrupted_exit\") severityPenalty += 0.15;\n        if (loadSeverity.code === \"critical\") severityPenalty += 0.25;\n    \n        if ((requestedRatio != null && requestedRatio > 8 && requestedCoolant !== \"through\") || chipSeverity.code === \"critical\") {\n          alternativePrimary = \"deep_hole_drilling\";\n        } else if (qualityFeasibility.code === \"not_credible\" && toleranceLevel === \"high_precision\") {\n          alternativePrimary = \"reaming\";\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.1,\n          process: kernel.processFit(candidate, ctx) * 1.1,\n          diameter: diameterFit * 2.5,\n          depthClass: resolvedRow.depthFitScore * 1.45,\n          reach: reachScore * 1.6,\n          coolant: coolantScore * 1.35,\n          chipControl: chipControlScore * 1.45,\n          entry: entryScore * 0.7,\n          exit: exitScore * 0.8,\n          setup: setupScore * 0.9,\n          quality: qualityScore * 0.9,\n          rowMatch: (resolvedRow.source === \"exact\" ? 1 : resolvedRow.source === \"near\" ? 0.8 : 0.45) * 0.8,\n          priorityBias: priorityBias * 0.55,\n          riskPenalty: -(severityPenalty + (kernel.risk(candidate, ctx) || 0)),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidenceMap = { exact: 0.95, near: 0.84, estimated: 0.68, none: 0.42 };\n        confidence = confidenceMap[resolvedRow.source] || 0.42;\n        if (qualityFeasibility.code === \"not_credible\") confidence = Math.min(confidence, 0.56);\n        if (hardRejectReason) confidence = 0;\n    \n        reasons = [\n          requestedDepthClass && resolvedRow.rowDepthClass\n            ? \"Depth class covers the requested \" + requestedDepthClass + \" through-hole window.\"\n            : \"Through-hole process and material fit are available.\",\n          coolantCapability.code === \"strong\" || coolantCapability.code === \"acceptable\"\n            ? \"Coolant support stays workable for chip evacuation in this material.\"\n            : \"Coolant support is the main release limiter in this setup.\",\n          entryRisk.code === \"low\" && exitRisk.code === \"low\"\n            ? \"Entry and breakthrough conditions stay stable for a standard drilling release.\"\n            : \"Entry or breakthrough conditions need a more conservative first-part strategy.\",\n          chipSeverity.code === \"low\" || chipSeverity.code === \"medium\"\n            ? \"Chip evacuation stays within a controllable range for through drilling.\"\n            : \"Chip evacuation is one of the main risks to qualify before raising output.\",\n        ].filter(Boolean).slice(0, 4);\n    \n        metrics = {\n          materialGroup: materialGroup,\n          materialLabel: materialLabel,\n          materialCondition: materialCondition.code,\n          materialConditionLabel: materialCondition.label,\n          requestedDiameterMm: diameter,\n          requestedDepthMm: depth,\n          requestedDepthRatio: roundValue(requestedRatio, 2),\n          requestedDepthClass: requestedDepthClass,\n          requestedCoolantMode: requestedCoolant,\n          requestedCoolantLabel: requestedCoolant === \"through\" ? \"Internal coolant\" : requestedCoolant === \"external\" ? \"External coolant\" : requestedCoolant === \"mist\" ? \"MQL / mist\" : requestedCoolant === \"dry\" ? \"Dry\" : \"Unknown coolant\",\n          requestedEntryCondition: entryCondition,\n          requestedEntryConditionLabel: entryCondition ? entryCondition.replace(/_/g, \" \") : null,\n          requestedExitCondition: exitCondition,\n          requestedExitConditionLabel: exitCondition ? exitCondition.replace(/_/g, \" \") : null,\n          requestedToleranceLevel: toleranceLevel,\n          requestedToleranceLevelLabel: toleranceLevel ? toleranceLevel.replace(/_/g, \" \") : null,\n          holePassability: holePassability,\n          holePassabilityLabel: holePassability ? holePassability.replace(/_/g, \" \") : null,\n          priority: priority,\n          priorityLabel: priority ? priority.replace(/_/g, \" \") : null,\n          setupStability: setupStability,\n          torqueCapability: torqueCapability,\n          pilotSpotStatus: pilotSpotStatus,\n          recipeOperationId: resolvedRow.row && resolvedRow.row.constraints && resolvedRow.row.constraints.processIds && resolvedRow.row.constraints.processIds[0] || \"drilling_through\",\n          rowCoolantMode: resolvedRow.row && resolvedRow.row.constraints ? resolvedRow.row.constraints.coolantMode : null,\n          rowDepthClass: resolvedRow.rowDepthClass,\n          recipeVcMin: recipe && recipe.vc ? recipe.vc.min : null,\n          recipeVcTyp: recipe && recipe.vc ? recipe.vc.typ : null,\n          recipeVcMax: recipe && recipe.vc ? recipe.vc.max : null,\n          recipeFnMin: recipe && recipe.fn ? recipe.fn.min : null,\n          recipeFnTyp: recipe && recipe.fn ? recipe.fn.typ : null,\n          recipeFnMax: recipe && recipe.fn ? recipe.fn.max : null,\n          rpmMin: roundValue(rpmMin, 0),\n          rpmTyp: roundValue(rpmTyp, 0),\n          rpmMax: roundValue(rpmMax, 0),\n          feedMinMmMin: roundValue(feedMin, 0),\n          feedTypMmMin: roundValue(feedTyp, 0),\n          feedMaxMmMin: roundValue(feedMax, 0),\n          mrrTyp: roundValue(mrrTyp, 1),\n          cycleTimeSec: roundValue(cycleTimeSec, 1),\n          usableLengthMarginMm: roundValue(usableLengthMarginMm, 2),\n          apmxMarginMm: roundValue(apmxMarginMm, 2),\n          candidateDiameterMm: candidateDiameter,\n          candidateUsableLengthMm: usableLength,\n          candidateApmxMm: apmxLength,\n          candidateHasTsc: Boolean(candidate && candidate.common && candidate.common.coolantTsc),\n          coolantCapabilityClass: coolantCapability.code,\n          coolantCapabilityLabel: coolantCapability.label,\n          chipEvacuationSeverityClass: chipSeverity.code,\n          chipEvacuationSeverityLabel: chipSeverity.label,\n          entryRiskClass: entryRisk.code,\n          entryRiskLabel: entryRisk.label,\n          exitRiskClass: exitRisk.code,\n          exitRiskLabel: exitRisk.label,\n          machineLoadSeverityClass: loadSeverity.code,\n          machineLoadSeverityLabel: loadSeverity.label,\n          peckNecessityClass: peckClass.code,\n          peckNecessityLabel: peckClass.label,\n          qualityFeasibilityClass: qualityFeasibility.code,\n          qualityFeasibilityLabel: qualityFeasibility.label,\n          rowDepthFitScore: roundValue(resolvedRow.depthFitScore, 2),\n          rowCoolantFitScore: roundValue(resolvedRow.coolantFitScore, 2),\n          alternativeProcessFlag: Boolean(alternativePrimary),\n          alternativePrimary: alternativePrimary,\n        };\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: resolvedRow.source,\n          reasons: reasons,\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/face-milling/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/face-milling/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/face-milling/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/face-milling/presenter.js\");\n    exports.default = createStubProcessModule(\"face_milling\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/face-milling/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").replace(/-/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(2);\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = String(item || \"\").replace(/\\s+/g, \" \").trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative face-milling option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        metrics.widthFitClass === \"undersized\" ? {\n          severity: \"warning\",\n          title: \"Coverage width\",\n          message: \"The cutter is smaller than the preferred face-milling width window, so pass count and entry / exit quality need more attention.\",\n        } : metrics.widthFitClass === \"oversized\" ? {\n          severity: \"warning\",\n          title: \"Cutter size\",\n          message: \"The cutter is wider than the ideal face-milling window and needs more attention around access, clamps and entry position.\",\n        } : null,\n        metrics.axialForceConflictClass === \"high\" ? {\n          severity: \"warning\",\n          title: \"Axial workpiece load\",\n          message: \"This surface reads as axially weak for a low-angle or productivity-led face-milling route.\",\n        } : null,\n        metrics.wiperNeedClass === \"strong\" ? {\n          severity: \"warning\",\n          title: \"Finish route\",\n          message: \"A finish-critical face should not rely on generic roughing release values alone. Keep wiper or finishing logic visible.\",\n        } : null,\n        metrics.toolConceptFitClass === \"poor\" || (metrics.requestedAccessClass === \"small_confined_area\" && metrics.toolConceptDesired !== \"indexable_face_mill\") ? {\n          severity: \"warning\",\n          title: \"Access concept\",\n          message: \"The current access suggests a smaller modular or small-head face route more than a standard open-surface face mill.\",\n        } : null,\n      ].filter(Boolean).slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"coverage\", label: \"Coverage layout\", result: metrics.widthFitClass === \"optimal\" || metrics.widthFitClass === \"acceptable\" ? \"pass\" : \"limited\", note: \"State: \" + (metrics.widthFitLabel || \"Review\") + \".\" },\n        { key: \"ap\", label: \"ap window\", result: metrics.recipeApFitClass === \"good\" || metrics.recipeApFitClass === \"light\" ? \"pass\" : metrics.recipeApFitClass === \"conditional\" ? \"limited\" : \"fail\", note: \"Requested stock removal must stay inside the recipe ap window.\" },\n        { key: \"force\", label: \"Workpiece load\", result: metrics.axialForceConflictClass === \"low\" ? \"pass\" : metrics.axialForceConflictClass === \"medium\" ? \"limited\" : \"fail\", note: \"Axial load: \" + (metrics.axialForceConflictLabel || \"Review\") + \".\" },\n        { key: \"machine\", label: \"Machine window\", result: metrics.machineWindowClass === \"strong\" ? \"pass\" : \"limited\", note: \"Torque window: \" + titleCase(metrics.machineWindowClass || \"review\") + \".\" },\n      ];\n    }\n    \n    function buildFeatureItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"length\", label: \"Face length\", value: metrics.requestedFaceLengthMm != null ? formatDisplayNumber(metrics.requestedFaceLengthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"width\", label: \"Effective width\", value: metrics.effectiveCuttingWidthMm != null ? formatDisplayNumber(metrics.effectiveCuttingWidthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"stock\", label: \"Stock removal\", value: metrics.requestedStockRemovalMm != null ? formatDisplayNumber(metrics.requestedStockRemovalMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"goal\", label: \"Operation goal\", value: metrics.requestedOperationGoalLabel || \"Review\" },\n        { key: \"boundary\", label: \"Boundary\", value: metrics.requestedBoundaryLabel || \"Review\" },\n        { key: \"access\", label: \"Access\", value: metrics.requestedAccessLabel || \"Review\" },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"coverage\", label: \"Cutter diameter vs width\", actual: metrics.candidateDiameterMm != null ? formatDisplayNumber(metrics.candidateDiameterMm, 2) + \" mm\" : null, target: metrics.effectiveCuttingWidthMm != null ? formatDisplayNumber(metrics.effectiveCuttingWidthMm, 2) + \" mm\" : null, result: metrics.widthFitClass === \"optimal\" || metrics.widthFitClass === \"acceptable\" ? \"fit\" : \"near\" },\n        { key: \"ap_recipe\", label: \"Stock removal vs recipe ap\", actual: metrics.requestedStockRemovalMm != null ? formatDisplayNumber(metrics.requestedStockRemovalMm, 2) + \" mm\" : null, target: metrics.recipeApUpperMm != null ? \"<= \" + formatDisplayNumber(metrics.recipeApUpperMm, 2) + \" mm\" : null, result: metrics.recipeApFitClass === \"good\" || metrics.recipeApFitClass === \"light\" ? \"fit\" : metrics.recipeApFitClass === \"conditional\" ? \"near\" : \"mismatch\" },\n        { key: \"reach\", label: \"Usable length vs ap\", actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null, target: metrics.requestedStockRemovalMm != null ? formatDisplayNumber(metrics.requestedStockRemovalMm, 2) + \" mm\" : null, result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\" },\n        { key: \"apmx\", label: \"APMX vs ap\", actual: metrics.candidateApmxMm != null ? formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm\" : null, target: metrics.requestedStockRemovalMm != null ? formatDisplayNumber(metrics.requestedStockRemovalMm, 2) + \" mm\" : null, result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"fit\" : \"mismatch\" },\n      ];\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"coverage\", label: \"Coverage\", value: metrics.widthFitLabel || \"Review\", status: metrics.widthFitClass === \"optimal\" ? \"good\" : metrics.widthFitClass === \"acceptable\" ? \"ok\" : \"weak\" },\n        { key: \"angle\", label: \"Lead-angle bias\", value: metrics.enteringAnglePreferenceLabel || \"Review\", status: metrics.enteringAnglePreferenceClass === \"45_general\" || metrics.enteringAnglePreferenceClass === \"near90_preferred\" ? \"good\" : \"ok\" },\n        { key: \"concept\", label: \"Tool concept\", value: metrics.toolConceptDesiredLabel || \"Review\", status: metrics.toolConceptFitClass === \"strong\" ? \"good\" : metrics.toolConceptFitClass === \"usable\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatDisplayNumber(top.score.confidence, 2) || \"n/a\", status: top.score.confidence >= 0.82 ? \"good\" : top.score.confidence >= 0.65 ? \"ok\" : \"weak\" },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n      });\n      block.data.presentation = {\n        title: \"Start here\",\n        description: \"Face-milling release values only stay believable together with cutter coverage, calm entry / exit behavior and the right force direction for the workpiece.\",\n        rowBackedValues: [\n          { label: \"Coverage\", value: metrics.widthFitLabel || \"Review\", tone: \"text\" },\n          { label: \"Angle\", value: metrics.enteringAnglePreferenceLabel || \"Review\", tone: \"text\" },\n          { label: \"Wiper\", value: metrics.wiperNeedLabel || \"Review\", tone: \"text\" },\n          { label: \"Pitch\", value: metrics.pitchStabilityLabel || \"Review\", tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"ap typ\", value: formatDisplayNumber(metrics.recipeApTyp, 2) || \"n/a\", unit: \"mm\" },\n        ],\n        machineValues: [\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n        ],\n        trustCard: {\n          title: \"Process credibility\",\n          tone: metrics.widthFitClass === \"optimal\" || metrics.widthFitClass === \"acceptable\" ? \"good\" : \"watch\",\n          badge: metrics.widthFitLabel || \"Review\",\n          value: \"Concept: \" + (metrics.toolConceptDesiredLabel || \"Review\"),\n          note: \"Feed stays a start value only. Entry / exit position, pass layout and the actual lead-angle route decide whether the face really runs cleanly.\",\n          items: dedupeTextItems([\n            metrics.estimatedPassCount != null ? \"Estimated passes: \" + metrics.estimatedPassCount + \".\" : null,\n            metrics.requestedBoundaryLabel ? \"Boundary: \" + metrics.requestedBoundaryLabel + \".\" : null,\n            metrics.requestedFinishTargetLabel ? \"Finish target: \" + metrics.requestedFinishTargetLabel + \".\" : null,\n          ]),\n        },\n      };\n      return block;\n    }\n    \n    function buildSetupBlock(top, riskItems) {\n      var metrics = top.metrics || {};\n      var block = setupNotes([\n        { area: \"boundary\", message: \"Boundary: \" + (metrics.requestedBoundaryLabel || \"Review\") },\n        { area: \"concept\", message: \"Preferred concept: \" + (metrics.toolConceptDesiredLabel || \"Review\") },\n        { area: \"continuity\", message: \"Path continuity: \" + (metrics.pathContinuityLabel || \"Review\") },\n      ]);\n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Fit\",\n            highlight: \"This result is driven mainly by cutter coverage, stock-removal fit, the preferred lead-angle logic and whether the surface size still matches the chosen face-mill concept.\",\n            items: dedupeTextItems([\n              metrics.widthFitClass === \"optimal\" || metrics.widthFitClass === \"acceptable\" ? \"Coverage still lands inside a workable face-milling window.\" : null,\n              metrics.recipeApFitClass === \"good\" ? \"Requested stock removal still fits the current recipe window.\" : null,\n              metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            ]).slice(0, 3),\n          },\n          how: {\n            title: \"How to start\",\n            tone: \"default\",\n            badge: metrics.enteringAnglePreferenceLabel || \"Route\",\n            highlight: \"Hold the cutter slightly off-center, keep the path in engagement as continuously as the surface allows, and separate roughing from finish logic once surface quality matters.\",\n            items: dedupeTextItems([\n              metrics.pathContinuityClass === \"strong\" ? \"Keep the toolpath continuous instead of breaking the face into too many isolated passes.\" : null,\n              metrics.estimatedPassCount != null ? \"Current width suggests about \" + metrics.estimatedPassCount + \" pass(es).\" : null,\n              metrics.wiperNeedClass === \"strong\" ? \"Carry a dedicated wiper / finishing route if this face really is finish-critical.\" : null,\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: \"Face milling looks simple, but width coverage, wall / clamp proximity and axial workpiece load can change the real route more than the raw vc and fz values do.\",\n            items: dedupeTextItems(riskItems.map(function mapRisk(item) {\n              return item.title + \": \" + item.message;\n            })).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"Coverage and pass layout\",\n            tone: metrics.widthFitClass === \"optimal\" ? \"good\" : metrics.widthFitClass === \"acceptable\" ? \"default\" : \"watch\",\n            badge: metrics.widthFitLabel || \"Review\",\n            value: \"Face width and cutter diameter define whether the process stays in a clean face-milling window or drifts into a multi-pass compromise.\",\n            note: dedupeTextItems([\n              metrics.coverageRatio != null ? \"Coverage ratio \" + formatDisplayNumber(metrics.coverageRatio, 2) : null,\n              metrics.estimatedPassCount != null ? \"Estimated passes \" + metrics.estimatedPassCount : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.effectiveCuttingWidthMm != null ? \"Effective cutting width: \" + formatDisplayNumber(metrics.effectiveCuttingWidthMm, 2) + \" mm.\" : null,\n              metrics.faceLongAxisMm != null ? \"Long axis: \" + formatDisplayNumber(metrics.faceLongAxisMm, 2) + \" mm.\" : null,\n              metrics.pathContinuityLabel ? \"Path continuity priority: \" + metrics.pathContinuityLabel + \".\" : null,\n            ]),\n          },\n          {\n            title: \"Lead angle and surface route\",\n            tone: metrics.axialForceConflictClass === \"high\" || metrics.wiperNeedClass === \"strong\" ? \"watch\" : \"default\",\n            badge: metrics.enteringAnglePreferenceLabel || \"Review\",\n            value: \"The lead-angle choice here is a process-owned bias: 45 deg as the default generalist, near-90 near boundaries, and low-angle only if the surface can tolerate axial load.\",\n            note: dedupeTextItems([\n              metrics.requestedVariableAllowanceLabel ? \"Allowance: \" + metrics.requestedVariableAllowanceLabel : null,\n              metrics.requestedFinishTargetLabel ? \"Finish target: \" + metrics.requestedFinishTargetLabel : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.requestedAxialWeaknessLabel ? \"Axial weakness: \" + metrics.requestedAxialWeaknessLabel + \".\" : null,\n              metrics.wiperNeedLabel ? \"Wiper need: \" + metrics.wiperNeedLabel + \".\" : null,\n              metrics.pitchStabilityLabel ? \"Pitch bias: \" + metrics.pitchStabilityLabel + \".\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Boundary and clamp interference\",\n            tone: metrics.requestedBoundary !== \"clear\" ? \"watch\" : \"default\",\n            category: \"Boundary\",\n            cause: \"Wall or clamp proximity can flip a general 45-degree face route into a near-90 review case, especially once ap or allowance variation rises.\",\n            actions: dedupeTextItems([\n              \"Review whether near-90 logic is cleaner than a general 45-degree face cutter here.\",\n              \"Keep the cutter slightly off-center and avoid entry / exit events directly into the clamp-side boundary.\",\n              metrics.maxToolDiameterMm != null ? \"Respect the stated maximum cutter diameter before trying to widen coverage.\" : null,\n            ]),\n          },\n          {\n            title: \"Surface marks and axial load\",\n            tone: metrics.wiperNeedClass === \"strong\" || metrics.axialForceConflictClass === \"high\" ? \"watch\" : \"default\",\n            category: \"Surface quality\",\n            cause: \"Poor surface quality on a face is often a combined problem of pass layout, missing finishing / wiper logic and a workpiece that does not like axial load.\",\n            actions: dedupeTextItems([\n              \"Split roughing and finishing when the face is truly finish-critical.\",\n              \"Reduce the productivity bias first if the component starts to flex axially.\",\n              \"Use a finishing-capable face route instead of only pushing coarse roughing release values.\",\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var riskItems;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"face_milling\",\n          outcome: \"no_match\",\n          summary: \"No credible face-milling recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current face-milling inputs do not support a credible recommendation.\"),\n            noMatchGuidance({\n              message: \"Check the effective face width, stock removal, wall / clamp proximity, access class and whether the face should really be roughing-first or a finishing-aware route with wiper logic.\",\n              steps: [\n                \"Confirm the effective cutting width and the full stock-removal amount.\",\n                \"Clarify whether the face runs close to a sidewall or a clamp boundary.\",\n                \"Review whether the workpiece is axially weak before pushing low-angle productivity logic.\",\n                \"Separate open-surface indexable face milling from small-area modular face-head cases.\",\n                \"Keep finishing or wiper logic visible if the face is surface-critical.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust face-milling inputs\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      riskItems = buildRiskItems(top);\n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best face-milling fit for \" + (metrics.effectiveCuttingWidthMm != null ? formatDisplayNumber(metrics.effectiveCuttingWidthMm, 2) + \" mm effective width\" : \"the stated face width\") + \" and \" + (metrics.requestedStockRemovalMm != null ? formatDisplayNumber(metrics.requestedStockRemovalMm, 2) + \" mm ap\" : \"the stated ap\") + \".\",\n        headerPills: [\n          { tone: metrics.widthFitClass === \"optimal\" ? \"good\" : metrics.widthFitClass === \"acceptable\" ? \"default\" : \"watch\", text: \"Coverage: \" + (metrics.widthFitLabel || \"Review\") },\n          { tone: metrics.enteringAnglePreferenceClass === \"45_general\" || metrics.enteringAnglePreferenceClass === \"near90_preferred\" ? \"good\" : \"default\", text: \"Angle: \" + (metrics.enteringAnglePreferenceLabel || \"Review\") },\n          { tone: metrics.axialForceConflictClass === \"low\" ? \"good\" : metrics.axialForceConflictClass === \"medium\" ? \"default\" : \"watch\", text: \"Axial load: \" + (metrics.axialForceConflictLabel || \"Review\") },\n          { tone: metrics.wiperNeedClass === \"none\" ? \"good\" : metrics.wiperNeedClass === \"useful\" ? \"default\" : \"watch\", text: \"Finish: \" + (metrics.wiperNeedLabel || \"Review\") },\n        ],\n      };\n    \n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine fit\",\n          tone: metrics.machineWindowClass === \"strong\" ? \"good\" : \"default\",\n          badge: titleCase(metrics.machineWindowClass || \"review\"),\n          value: \"Boundary: \" + (metrics.requestedBoundaryLabel || \"Review\"),\n          note: \"Face milling rewards a calm load path more than raw headline feed. Coverage, lead-angle choice and axial workpiece load all matter before feed becomes meaningful.\",\n          items: dedupeTextItems([\n            metrics.pathContinuityLabel ? \"Path continuity: \" + metrics.pathContinuityLabel + \".\" : null,\n            metrics.pitchStabilityLabel ? \"Pitch bias: \" + metrics.pitchStabilityLabel + \".\" : null,\n            metrics.requestedAccessLabel ? \"Access: \" + metrics.requestedAccessLabel + \".\" : null,\n          ]),\n        },\n      };\n    \n      return createResultViewModel({\n        processId: \"face_milling\",\n        outcome: top.score.total >= 8 ? \"match\" : \"limited_match\",\n        summary: \"Best face-milling result based on cutter coverage, stock-removal fit, boundary condition and the most credible face-mill concept.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          buildMillingBundleRecommendation(candidate),\n          featureSummary(buildFeatureItems(top)),\n          geometryFit(buildGeometryItems(top)),\n          fitKpis(buildFitItems(top)),\n          recipeBlock,\n          machineBlock,\n          buildSetupBlock(top, riskItems),\n          riskNotes(riskItems),\n          alternatives(buildAlternativeItems(scored)),\n          commerceCta(Object.assign({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }, buildMillingCompositeCommerceData(candidate) || {})),\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust face-milling inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/face-milling/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"face_milling\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/face-milling/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) { return Math.max(min, Math.min(max, value)); }\n    function avg(values) {\n      var filtered = (values || []).filter(function keep(value) { return value != null && Number.isFinite(value); });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) { return total + value; }, 0) / filtered.length;\n    }\n    function sumParts(parts) { return Object.keys(parts || {}).reduce(function sum(total, key) { return total + (Number(parts[key]) || 0); }, 0); }\n    function scoreToken(value, map, fallback) { return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback); }\n    function label(value, map, fallback) { return map[value] || fallback || \"Review\"; }\n    \n    var OP_LABELS = { roughing: \"Roughing\", \"semi-finishing\": \"Semi-finishing\", finishing: \"Finishing\" };\n    var BOUNDARY_LABELS = { clear: \"Clear\", near_sidewall: \"Near sidewall\", near_clamps: \"Near clamps\", near_wall_and_clamps: \"Near wall and clamps\" };\n    var AXIAL_LABELS = { normal: \"Normal\", somewhat_weak: \"Somewhat weak\", thin_axially_weak: \"Thin / axially weak\" };\n    var ACCESS_LABELS = { open_large_surface: \"Open large surface\", normal_surface: \"Normal surface\", small_confined_area: \"Small / confined area\" };\n    var FINISH_LABELS = { general: \"General\", good: \"Good\", fine: \"Fine\", wiper_critical: \"Wiper-critical\" };\n    var ALLOWANCE_LABELS = { uniform: \"Uniform\", moderate: \"Moderate\", variable_casting_allowance: \"Variable casting allowance\" };\n    var CONCEPT_LABELS = { indexable_face_mill: \"Indexable face mill\", small_face_head_or_modular: \"Small face head / modular\", either: \"Either\" };\n    var WIDTH_LABELS = { optimal: \"Optimal\", acceptable: \"Acceptable\", undersized: \"Undersized\", oversized: \"Oversized\", unknown: \"Unknown\" };\n    var ANGLE_LABELS = { \"45_general\": \"45 deg general\", near90_preferred: \"Near-90 preferred\", \"60to75_special\": \"60-75 deg special\", round_or_hfm_possible: \"Round / high-feed possible\" };\n    var FORCE_LABELS = { low: \"Low\", medium: \"Medium\", high: \"High\" };\n    var WIPER_LABELS = { none: \"None\", useful: \"Useful\", strong: \"Strong\" };\n    var PITCH_LABELS = { coarse_ok: \"Coarse OK\", normal: \"Normal\", close_pitch_possible: \"Close pitch possible\", differential_pitch_helpful: \"Differential pitch helpful\" };\n    var PATH_LABELS = { strong: \"Strong\", normal: \"Normal\", low: \"Low\" };\n    \n    function normalizeConceptPreference(value) {\n      if (value === \"indexable_only\") return \"indexable_face_mill\";\n      if (value === \"small_head_or_modular\" || value === \"solid_like_small_head_only\") return \"small_face_head_or_modular\";\n      return \"either\";\n    }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var helix = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neck = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var text = [candidate.catalog && candidate.catalog.productTitle, candidate.catalog && candidate.catalog.variantTitle, candidate.ids && candidate.ids.sku].join(\" \").toLowerCase();\n      if (text.indexOf(\"multi-master\") >= 0 || text.indexOf(\"multimaster\") >= 0 || text.indexOf(\"head\") >= 0 || text.indexOf(\"modular\") >= 0 || text.indexOf(\"mini\") >= 0) return \"small_face_head_or_modular\";\n      if (text.indexOf(\"face mill\") >= 0 || text.indexOf(\"facemill\") >= 0 || text.indexOf(\"plan\") >= 0 || text.indexOf(\"cutter\") >= 0 || text.indexOf(\"coromill\") >= 0 || text.indexOf(\"body\") >= 0) return \"indexable_face_mill\";\n      if (diameter != null && diameter >= 32) return \"indexable_face_mill\";\n      if (diameter != null && diameter <= 20) return \"small_face_head_or_modular\";\n      if (helix != null && helix >= 32 && neck != null && diameter != null && neck < diameter) return \"small_face_head_or_modular\";\n      return \"either\";\n    }\n    \n    function conceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var explicitDesired = explicitConcept !== \"either\" ? explicitConcept : desiredConcept;\n      var score = 0.78;\n      if (explicitDesired === \"either\" || candidateConcept === \"either\") score = 0.84;\n      else if (candidateConcept === explicitDesired) score = explicitConcept === \"either\" ? 0.94 : 1;\n      else if (explicitDesired === \"indexable_face_mill\") score = 0.34;\n      else if (explicitDesired === \"small_face_head_or_modular\") score = 0.38;\n      return { score: score, className: score >= 0.92 ? \"strong\" : score >= 0.74 ? \"usable\" : score >= 0.5 ? \"conditional\" : \"poor\" };\n    }\n    \n    function coverageFit(candidateDiameter, effectiveWidth) {\n      var ratio;\n      var score;\n      var className;\n      var passCount;\n      if (candidateDiameter == null || effectiveWidth == null || effectiveWidth <= 0) return { score: 0.5, className: \"unknown\", label: WIDTH_LABELS.unknown, ratio: null, passCount: null };\n      ratio = candidateDiameter / effectiveWidth;\n      passCount = Math.max(1, Math.ceil(effectiveWidth / Math.max(candidateDiameter * 0.65, 1)));\n      if (ratio >= 1.15 && ratio <= 1.7) { score = 1 - Math.abs(ratio - 1.4) * 0.12; className = \"optimal\"; }\n      else if (ratio >= 0.9 && ratio < 1.15) { score = clamp(0.84 + ((ratio - 0.9) / 0.25) * 0.12, 0, 1); className = \"acceptable\"; }\n      else if (ratio > 1.7 && ratio <= 2.2) { score = clamp(0.82 - ((ratio - 1.7) / 0.5) * 0.18, 0.12, 1); className = \"acceptable\"; }\n      else if (ratio >= 0.6 && ratio < 0.9) { score = clamp(0.44 + ((ratio - 0.6) / 0.3) * 0.26, 0.12, 1); className = \"undersized\"; }\n      else if (ratio > 2.2) { score = ratio <= 3 ? clamp(0.42 - ((ratio - 2.2) / 0.8) * 0.16, 0.12, 1) : 0.18; className = \"oversized\"; }\n      else { score = 0.18; className = \"undersized\"; }\n      return { score: score, className: className, label: WIDTH_LABELS[className], ratio: ratio, passCount: passCount };\n    }\n    \n    function bandFit(requested, band, tolerance) {\n      var min = toNullableNumber(band && band.min);\n      var typ = toNullableNumber(band && band.typ);\n      var max = toNullableNumber(band && band.max);\n      var upper = max != null ? max : (typ != null ? typ : min);\n      var overflow;\n      var score;\n      if (requested == null) return { score: 0.5, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (upper == null) return { score: 0.56, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (requested > upper) {\n        overflow = upper > 0 ? (requested - upper) / upper : 1;\n        score = clamp(0.62 - overflow * 0.84, 0.12, 0.62);\n        return { score: score, className: overflow <= (tolerance == null ? 0.45 : tolerance) ? \"conditional\" : \"over\", hardFail: overflow > (tolerance == null ? 0.45 : tolerance), min: min, typ: typ, max: max, upper: upper };\n      }\n      if (typ != null && requested > typ) return { score: clamp(1 - ((requested - typ) / Math.max((upper - typ) || typ || 1, 1)) * 0.24, 0.78, 1), className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (min != null && requested < min) return { score: 0.88, className: \"light\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      return { score: 0.96, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 5) return 1;\n      if (margin >= 2) return 0.88;\n      if (margin >= 0.5) return 0.74;\n      if (margin >= 0) return 0.58;\n      if (margin >= -1) return 0.18;\n      return 0;\n    }\n    \n    function maxDiameterFit(candidateDiameter, maxToolDiameter) {\n      var margin;\n      if (maxToolDiameter == null) return { score: 0.78, className: \"open\", hardFail: false, margin: null };\n      if (candidateDiameter == null) return { score: 0.52, className: \"unknown\", hardFail: false, margin: null };\n      margin = maxToolDiameter - candidateDiameter;\n      if (margin < 0) return { score: 0, className: \"over\", hardFail: true, margin: margin };\n      return { score: marginScore(margin), className: margin >= 1 ? \"good\" : margin >= 0 ? \"tight\" : \"over\", hardFail: false, margin: margin };\n    }\n    \n    function deriveDesiredConcept(effectiveWidth, accessClass, boundaryClass, operationGoal, priority, maxToolDiameter) {\n      var indexable = 0;\n      var small = 0;\n      if (accessClass === \"open_large_surface\") indexable += 3;\n      if (accessClass === \"normal_surface\") { indexable += 2; small += 1; }\n      if (accessClass === \"small_confined_area\") small += 4;\n      if (effectiveWidth != null && effectiveWidth <= 30) small += 3;\n      else if (effectiveWidth != null && effectiveWidth <= 50) { small += 2; indexable += 1; }\n      else indexable += 2;\n      if (boundaryClass !== \"none\") small += 1;\n      if (operationGoal === \"finishing\") small += 1;\n      if (priority === \"productivity\") indexable += 2;\n      if (maxToolDiameter != null && maxToolDiameter <= 25) small += 1;\n      return small >= indexable + 1 ? \"small_face_head_or_modular\" : \"indexable_face_mill\";\n    }\n    \n    function enteringAnglePreference(apRatio, boundaryClass, priority, operationGoal, axialWeakness, variableAllowance) {\n      if (boundaryClass !== \"none\" || variableAllowance === \"variable_casting_allowance\" || (apRatio != null && apRatio >= 0.11)) return { className: \"near90_preferred\", label: ANGLE_LABELS.near90_preferred, score: 0.92 };\n      if (priority === \"productivity\" && operationGoal !== \"finishing\" && axialWeakness !== \"thin_axially_weak\" && apRatio != null && apRatio <= 0.07) return { className: \"round_or_hfm_possible\", label: ANGLE_LABELS.round_or_hfm_possible, score: 0.84 };\n      if (operationGoal === \"roughing\" && boundaryClass === \"none\" && apRatio != null && apRatio >= 0.08 && apRatio <= 0.16) return { className: \"60to75_special\", label: ANGLE_LABELS[\"60to75_special\"], score: 0.8 };\n      return { className: \"45_general\", label: ANGLE_LABELS[\"45_general\"], score: 0.95 };\n    }\n    \n    function axialForceConflict(axialWeakness, enteringAngleClass) {\n      var score = scoreToken(axialWeakness, { normal: 1, somewhat_weak: 0.8, thin_axially_weak: 0.58 }, 0.8);\n      if (enteringAngleClass === \"round_or_hfm_possible\") score = clamp(score - 0.32, 0, 1);\n      else if (enteringAngleClass === \"60to75_special\") score = clamp(score - 0.14, 0, 1);\n      else if (enteringAngleClass === \"near90_preferred\") score = clamp(score + 0.08, 0, 1);\n      score = clamp(score, 0, 1);\n      return { score: score, className: score >= 0.82 ? \"low\" : score >= 0.56 ? \"medium\" : \"high\", label: label(score >= 0.82 ? \"low\" : score >= 0.56 ? \"medium\" : \"high\", FORCE_LABELS) };\n    }\n    \n    function wiperNeed(operationGoal, finishTarget) {\n      if (finishTarget === \"wiper_critical\" || operationGoal === \"finishing\") return { className: \"strong\", label: WIPER_LABELS.strong, score: 1 };\n      if (finishTarget === \"fine\" || finishTarget === \"good\" || operationGoal === \"semi-finishing\") return { className: \"useful\", label: WIPER_LABELS.useful, score: 0.82 };\n      return { className: \"none\", label: WIPER_LABELS.none, score: 0.56 };\n    }\n    \n    function finishRoute(operationGoal, finishTarget, candidateConcept) {\n      if (operationGoal === \"roughing\") return { score: 1, className: \"roughing_native\" };\n      if (operationGoal === \"semi-finishing\") return { score: candidateConcept === \"small_face_head_or_modular\" ? 0.9 : 0.82, className: \"semi_finish_capable\" };\n      return { score: finishTarget === \"wiper_critical\" ? (candidateConcept === \"small_face_head_or_modular\" ? 0.7 : 0.62) : (candidateConcept === \"small_face_head_or_modular\" ? 0.78 : 0.72), className: finishTarget === \"wiper_critical\" ? \"finish_sensitive\" : \"finish_review\" };\n    }\n    \n    function pitchStability(pitchPreference, priority, materialCondition, operationGoal, accessClass) {\n      var className = pitchPreference;\n      var score;\n      if (!className || className === \"unknown\" || className === \"normal\") {\n        if (priority === \"productivity\" && accessClass === \"open_large_surface\" && materialCondition !== \"sticky_bue\") className = \"close_pitch_possible\";\n        else if (operationGoal === \"finishing\") className = \"differential_pitch_helpful\";\n        else if (materialCondition === \"sticky_bue\") className = \"coarse_ok\";\n        else className = \"normal\";\n      }\n      score = scoreToken(className, { coarse_ok: 0.72, normal: 0.78, close_pitch_possible: 0.84, differential_pitch_helpful: 0.82 }, 0.78);\n      return { className: className, label: PITCH_LABELS[className], score: score };\n    }\n    \n    function pathContinuity(faceLength, effectiveWidth, passCount, operationGoal) {\n      var ratio = faceLength != null && effectiveWidth != null && effectiveWidth > 0 ? faceLength / effectiveWidth : null;\n      if ((ratio != null && ratio >= 1.5) || (passCount != null && passCount > 1) || operationGoal === \"finishing\") return { className: \"strong\", label: PATH_LABELS.strong, score: 0.92 };\n      if (ratio != null && ratio < 0.8) return { className: \"low\", label: PATH_LABELS.low, score: 0.6 };\n      return { className: \"normal\", label: PATH_LABELS.normal, score: 0.76 };\n    }\n    \n    function materialSeverity(ctx, materialCondition) {\n      var materialCode = String(ctx && ctx.materialCode || \"\").toUpperCase();\n      var base = scoreToken(materialCode.charAt(0), { P: 0.18, M: 0.46, K: 0.16, N: 0.22, S: 0.7, H: 0.56 }, 0.28);\n      var score = clamp(base + scoreToken(materialCondition, { standard: 0, tough_long_chipping: 0.1, sticky_bue: 0.12, work_hardening: 0.16, hard_abrasive: 0.18, unknown: 0.06 }, 0.06), 0, 1);\n      return { score: score, className: score >= 0.72 ? \"severe\" : score >= 0.5 ? \"difficult\" : score >= 0.28 ? \"normal\" : \"easy\" };\n    }\n    \n    function coolantFit(coolantCapability, materialState, candidate) {\n      var tsc = candidate.common && candidate.common.coolantTsc === true;\n      var score = scoreToken(coolantCapability, { through: tsc ? 1 : 0.8, external: 0.78, dry: materialState.className === \"severe\" ? 0.34 : 0.52, unknown: 0.62 }, 0.62);\n      if (materialState.className === \"severe\" && coolantCapability === \"external\") score = clamp(score - 0.08, 0, 1);\n      return { score: score, className: score >= 0.86 ? \"strong\" : score >= 0.68 ? \"usable\" : score >= 0.48 ? \"conditional\" : \"weak\" };\n    }\n    \n    function machineWindow(machineTorqueCapability, priority) {\n      var score = scoreToken(machineTorqueCapability, { high: 0.92, medium: 0.78, low: 0.62 }, 0.74);\n      if (priority === \"productivity\") score = clamp(score - 0.04, 0, 1);\n      return { score: score, className: score >= 0.86 ? \"strong\" : score >= 0.68 ? \"usable\" : \"limited\" };\n    }\n    \n    function estimatedAePct(recipe, coverage) {\n      var aeTyp = toNullableNumber(recipe && recipe.aePct && recipe.aePct.typ);\n      if (aeTyp == null) return null;\n      if (coverage.className === \"undersized\") return Math.min(aeTyp, 65);\n      if (coverage.className === \"oversized\") return Math.max(aeTyp * 0.75, 20);\n      return aeTyp;\n    }\n    \n    function rpm(vc, diameter) { return vc == null || diameter == null || diameter <= 0 ? null : (1000 * vc) / Math.PI / diameter; }\n    function feed(fz, n, z) { return fz == null || n == null || z == null || z <= 0 ? null : fz * n * z; }\n    function mrr(ap, ae, vf) { return ap == null || ae == null || vf == null ? null : (ap * ae * vf) / 1000; }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"face_milling\", ctx, toolkits));\n      var faceLength = toNullableNumber(getAnswer(ctx, \"face_size_l_mm\"));\n      var faceWidth = toNullableNumber(getAnswer(ctx, \"face_size_w_mm\"));\n      var values = [faceLength, faceWidth].filter(function keep(value) { return value != null && value > 0; });\n      if (values.length) {\n        derived.face_long_axis_mm = values.length === 2 ? Math.max(faceLength, faceWidth) : values[0];\n        derived.face_effective_width_mm = values.length === 2 ? Math.min(faceLength, faceWidth) : values[0];\n      }\n      if (faceLength != null && faceWidth != null) derived.face_area_mm2 = faceLength * faceWidth;\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"face_milling\", ctx);\n      var operationGoal = getAnswer(ctx, \"condition_stage\") || \"roughing\";\n      var boundary = getAnswer(ctx, \"face_sidewall_proximity\") || \"clear\";\n      var axialWeakness = getAnswer(ctx, \"face_axial_weakness_class\") || \"normal\";\n      var priority = getAnswer(ctx, \"priority\") || \"balanced\";\n      if (operationGoal === \"finishing\" && priority === \"productivity\") issues.push({ field: \"priority\", message: \"Finish-critical face milling usually needs a more quality-led route than pure productivity bias.\", severity: \"warning\", code: \"face_finish_vs_productivity\" });\n      if (axialWeakness === \"thin_axially_weak\") issues.push({ field: \"face_axial_weakness_class\", message: \"Thin or axially weak faces should not default to low-angle productivity logic without reviewing workpiece load.\", severity: \"warning\", code: \"face_axial_force_conflict\" });\n      if (boundary !== \"clear\" && operationGoal === \"finishing\") issues.push({ field: \"face_sidewall_proximity\", message: \"Boundary proximity near a wall or clamp is one of the main reasons to review a near-90 face-milling route.\", severity: \"warning\", code: \"face_boundary_finish_review\" });\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"face_milling\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var faceLength = toNullableNumber(getAnswer(ctx, \"face_size_l_mm\"));\n      var faceWidth = toNullableNumber(getAnswer(ctx, \"face_size_w_mm\"));\n      var values = [faceLength, faceWidth].filter(function keep(value) { return value != null && value > 0; });\n      var longAxis = values.length === 2 ? Math.max(faceLength, faceWidth) : (values[0] || null);\n      var effectiveWidth = values.length === 2 ? Math.min(faceLength, faceWidth) : (values[0] || null);\n      var stockRemoval = toNullableNumber(getAnswer(ctx, \"stock_removal_mm\"));\n      var boundaryValue = getAnswer(ctx, \"face_sidewall_proximity\") || \"clear\";\n      var operationGoal = getAnswer(ctx, \"condition_stage\") || \"roughing\";\n      var axialWeakness = getAnswer(ctx, \"face_axial_weakness_class\") || \"normal\";\n      var materialCondition = getAnswer(ctx, \"material_condition_class\") || \"standard\";\n      var accessClass = getAnswer(ctx, \"face_area_access_class\") || \"normal_surface\";\n      var priority = getAnswer(ctx, \"priority\") || \"balanced\";\n      var maxToolDiameter = toNullableNumber(getAnswer(ctx, \"max_tool_diameter_mm\"));\n      var finishTarget = getAnswer(ctx, \"face_surface_finish_target\") || \"general\";\n      var explicitConcept = normalizeConceptPreference(getAnswer(ctx, \"face_tool_concept_preference\"));\n      var pitchPreference = getAnswer(ctx, \"face_pitch_preference\") || \"normal\";\n      var coolantCapability = getAnswer(ctx, \"coolant_capability\") || \"unknown\";\n      var machineTorqueCapability = getAnswer(ctx, \"machine_torque_capability\") || \"medium\";\n      var variableAllowance = getAnswer(ctx, \"face_variable_allowance_class\") || \"uniform\";\n      var boundaryClass = boundaryValue === \"clear\" ? \"none\" : boundaryValue === \"near_wall_and_clamps\" ? \"high\" : \"near\";\n      var materialState = materialSeverity(ctx, materialCondition);\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var recipe = recipeResult.recipe || {};\n        var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var usableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var apmx = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var flutes = getCandidateFluteCount(candidate);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var coverage = coverageFit(diameter, effectiveWidth);\n        var apRatio = stockRemoval != null && diameter != null && diameter > 0 ? stockRemoval / diameter : null;\n        var apBand = bandFit(stockRemoval, recipe.ap, 0.45);\n        var maxFit = maxDiameterFit(diameter, maxToolDiameter);\n        var desiredConcept = explicitConcept === \"either\" ? deriveDesiredConcept(effectiveWidth, accessClass, boundaryClass, operationGoal, priority, maxToolDiameter) : explicitConcept;\n        var concept = conceptFit(candidateConcept, desiredConcept, explicitConcept);\n        var enteringAngle = enteringAnglePreference(apRatio, boundaryClass, priority, operationGoal, axialWeakness, variableAllowance);\n        var axialForce = axialForceConflict(axialWeakness, enteringAngle.className);\n        var wiper = wiperNeed(operationGoal, finishTarget);\n        var finishRouteState = finishRoute(operationGoal, finishTarget, candidateConcept);\n        var pitch = pitchStability(pitchPreference, priority, materialCondition, operationGoal, accessClass);\n        var path = pathContinuity(longAxis, effectiveWidth, coverage.passCount, operationGoal);\n        var coolant = coolantFit(coolantCapability, materialState, candidate);\n        var machine = machineWindow(machineTorqueCapability, priority);\n        var reachMargin = usableLength != null && stockRemoval != null ? usableLength - stockRemoval : null;\n        var apmxMargin = apmx != null && stockRemoval != null ? apmx - stockRemoval : null;\n        var reach = avg([marginScore(reachMargin), marginScore(apmxMargin)]);\n        var operationGoalScore = scoreToken(operationGoal, { roughing: 1, \"semi-finishing\": 0.9, finishing: 0.78 }, 0.86);\n        var estimatedAe = estimatedAePct(recipe, coverage);\n        var aeMm = diameter != null && estimatedAe != null ? (diameter * estimatedAe) / 100 : null;\n        var n = rpm(toNullableNumber(recipe.vc && recipe.vc.typ), diameter);\n        var vf = feed(toNullableNumber(recipe.fz && recipe.fz.typ), n, flutes);\n        var q = mrr(stockRemoval, aeMm, vf);\n        var riskPenalty;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidence;\n    \n        if (!rows.length) hardRejectReason = \"No valid face-milling row is available for this material and process context.\";\n        if (!hardRejectReason && maxFit.hardFail) hardRejectReason = \"Tool diameter exceeds the stated maximum cutter size.\";\n        if (!hardRejectReason && apBand.hardFail) hardRejectReason = \"Requested stock removal exceeds the current face-milling recipe window.\";\n        if (!hardRejectReason && reachMargin != null && reachMargin < 0) hardRejectReason = \"Usable length is shorter than the requested face-milling ap.\";\n        if (!hardRejectReason && apmxMargin != null && apmxMargin < 0) hardRejectReason = \"APMX is shorter than the requested face-milling ap.\";\n    \n        riskPenalty = clamp((coverage.className === \"undersized\" ? 0.14 : 0) + (coverage.className === \"oversized\" ? 0.1 : 0) + (axialForce.className === \"high\" ? 0.18 : axialForce.className === \"medium\" ? 0.07 : 0) + (boundaryClass === \"high\" ? 0.12 : boundaryClass === \"near\" ? 0.04 : 0) + (wiper.className === \"strong\" && operationGoal === \"finishing\" ? 0.12 : 0) + (concept.className === \"poor\" ? 0.12 : concept.className === \"conditional\" ? 0.05 : 0), 0, 1);\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.08,\n          process: kernel.processFit(candidate, ctx) * 1.12,\n          coverage: coverage.score * 1.48,\n          operationGoal: operationGoalScore * 0.86,\n          apFit: apBand.score * 1.32,\n          reach: reach * 0.82,\n          enteringAngle: enteringAngle.score * 1.18,\n          toolConcept: concept.score * 1.16,\n          boundary: scoreToken(boundaryClass, { none: 1, near: 0.76, high: 0.54 }, 0.76) * 0.88,\n          axialForce: axialForce.score * 0.92,\n          finishRoute: finishRouteState.score * 0.84,\n          pitch: pitch.score * 0.42,\n          coolant: coolant.score * 0.34,\n          machine: machine.score * 0.52,\n          pathContinuity: path.score * 0.46,\n          riskPenalty: -riskPenalty,\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.82 : recipeResult.source === \"estimated\" ? 0.68 : 0.5;\n        confidence -= coverage.className === \"undersized\" ? 0.08 : coverage.className === \"oversized\" ? 0.05 : 0;\n        confidence -= axialForce.className === \"high\" ? 0.08 : axialForce.className === \"medium\" ? 0.03 : 0;\n        confidence -= wiper.className === \"strong\" && operationGoal === \"finishing\" ? 0.06 : 0;\n        confidence -= concept.className === \"poor\" ? 0.1 : concept.className === \"conditional\" ? 0.04 : 0;\n        confidence = clamp(confidence, 0, 0.97);\n        if (hardRejectReason) confidence = 0;\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            coverage.className === \"optimal\" ? \"Cutter coverage lands inside a strong face-milling window for the effective surface width.\" : coverage.className === \"acceptable\" ? \"Cutter coverage stays workable for the requested face width.\" : \"Coverage is the main compromise in this recommendation.\",\n            enteringAngle.className === \"near90_preferred\" ? \"Boundary proximity, larger ap or variable allowance point toward a near-90 face-milling logic.\" : enteringAngle.className === \"round_or_hfm_possible\" ? \"The case still allows a more productivity-led low-angle face-milling route, but only while ap stays light.\" : \"A general 45-degree face-milling logic remains the most credible baseline here.\",\n            concept.className === \"strong\" ? \"The preferred tool concept lines up well with the current surface size and access class.\" : \"Tool concept stays a trade-off between open-surface productivity and confined-area access.\",\n            wiper.className === \"strong\" ? \"Surface quality expectations make a dedicated finishing or wiper-aware route important.\" : wiper.className === \"useful\" ? \"Semi-finish expectations still reward a cleaner finishing-capable face-milling route.\" : \"The case remains roughing-first rather than finish-critical.\",\n            path.className === \"strong\" ? \"Continuous engagement and a calm entry / exit strategy matter here as much as the raw vc and fz release values.\" : \"Path continuity still matters, but the main score moves come from coverage, ap and the boundary condition.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, {\n          requestedFaceLengthMm: faceLength,\n          requestedFaceWidthMm: faceWidth,\n          effectiveCuttingWidthMm: effectiveWidth,\n          faceLongAxisMm: longAxis,\n          faceAreaMm2: faceLength != null && faceWidth != null ? faceLength * faceWidth : null,\n          requestedStockRemovalMm: stockRemoval,\n          requestedOperationGoal: operationGoal,\n          requestedOperationGoalLabel: label(operationGoal, OP_LABELS),\n          requestedBoundary: boundaryValue,\n          requestedBoundaryLabel: label(boundaryValue, BOUNDARY_LABELS),\n          requestedAxialWeakness: axialWeakness,\n          requestedAxialWeaknessLabel: label(axialWeakness, AXIAL_LABELS),\n          requestedAccessClass: accessClass,\n          requestedAccessLabel: label(accessClass, ACCESS_LABELS),\n          requestedPriority: priority,\n          requestedFinishTarget: finishTarget,\n          requestedFinishTargetLabel: label(finishTarget, FINISH_LABELS),\n          requestedVariableAllowanceClass: variableAllowance,\n          requestedVariableAllowanceLabel: label(variableAllowance, ALLOWANCE_LABELS),\n          candidateDiameterMm: diameter,\n          candidateUsableLengthMm: usableLength,\n          candidateApmxMm: apmx,\n          candidateFluteCount: flutes,\n          coverageRatio: coverage.ratio,\n          widthFitClass: coverage.className,\n          widthFitLabel: coverage.label,\n          estimatedPassCount: coverage.passCount,\n          apRatio: apRatio,\n          recipeVcMin: toNullableNumber(recipe.vc && recipe.vc.min),\n          recipeVcTyp: toNullableNumber(recipe.vc && recipe.vc.typ),\n          recipeVcMax: toNullableNumber(recipe.vc && recipe.vc.max),\n          recipeFzMin: toNullableNumber(recipe.fz && recipe.fz.min),\n          recipeFzTyp: toNullableNumber(recipe.fz && recipe.fz.typ),\n          recipeFzMax: toNullableNumber(recipe.fz && recipe.fz.max),\n          recipeApMin: apBand.min,\n          recipeApTyp: apBand.typ,\n          recipeApMax: apBand.max,\n          recipeApUpperMm: apBand.upper,\n          recipeAePctMin: toNullableNumber(recipe.aePct && recipe.aePct.min),\n          recipeAePctTyp: toNullableNumber(recipe.aePct && recipe.aePct.typ),\n          recipeAePctMax: toNullableNumber(recipe.aePct && recipe.aePct.max),\n          recipeApFitClass: apBand.className,\n          reachMarginMm: reachMargin,\n          apmxMarginMm: apmxMargin,\n          maxToolDiameterMm: maxToolDiameter,\n          maxToolDiameterMarginMm: maxFit.margin,\n          toolConceptGuess: candidateConcept,\n          toolConceptDesired: desiredConcept,\n          toolConceptDesiredLabel: label(desiredConcept, CONCEPT_LABELS),\n          toolConceptFitClass: concept.className,\n          enteringAnglePreferenceClass: enteringAngle.className,\n          enteringAnglePreferenceLabel: enteringAngle.label,\n          axialForceConflictClass: axialForce.className,\n          axialForceConflictLabel: axialForce.label,\n          wiperNeedClass: wiper.className,\n          wiperNeedLabel: wiper.label,\n          finishRouteClass: finishRouteState.className,\n          pitchStabilityClass: pitch.className,\n          pitchStabilityLabel: pitch.label,\n          pathContinuityClass: path.className,\n          pathContinuityLabel: path.label,\n          machineWindowClass: machine.className,\n          coolantSupportClass: coolant.className,\n          estimatedAePctReq: estimatedAe,\n          rpmTyp: n,\n          feedTypMmMin: vf,\n          mrrTyp: q,\n          selectedRecipeSource: recipeResult.source,\n          selectedRecipeRow: recipeResult.debug && recipeResult.debug.selectedRecipeRow,\n          selectedVcRow: recipeResult.debug && recipeResult.debug.selectedVcRow,\n          selectedFzRow: recipeResult.debug && recipeResult.debug.selectedFzRow,\n        });\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/face-turning/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/face-turning/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/face-turning/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/face-turning/presenter.js\");\n    exports.default = createStubProcessModule(\"face_turning\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/face-turning/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, recipeStartValues, riskNotes, setupNotes } = __bundle.require(\"core/result-blocks.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.checks)) return data.checks.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        return true;\n      });\n    }\n    \n    function titleCase(value) {\n      return String(value || \"\")\n        .split(/[_\\s-]+/)\n        .filter(Boolean)\n        .map(function mapPart(part) {\n          return part.charAt(0).toUpperCase() + part.slice(1);\n        })\n        .join(\" \");\n    }\n    \n    function formatNumber(value, digits) {\n      return value == null ? \"n/a\" : Number(value).toFixed(digits == null ? 2 : digits);\n    }\n    \n    function formatMm(value, digits) {\n      return value == null ? \"n/a\" : formatNumber(value, digits == null ? 2 : digits) + \" mm\";\n    }\n    \n    function formatUm(value, digits) {\n      return value == null ? \"n/a\" : formatNumber(value, digits == null ? 1 : digits) + \" um\";\n    }\n    \n    function statusFromRisk(riskClass) {\n      return riskClass === \"low\" ? \"good\" : riskClass === \"medium\" ? \"ok\" : \"weak\";\n    }\n    \n    function buildFeatureItems(metrics) {\n      return [\n        { key: \"phase\", label: \"Operation phase\", value: titleCase(metrics.requestedOperationPhase) },\n        { key: \"material\", label: \"Material refinement\", value: titleCase(metrics.requestedMaterialRefinement) },\n        { key: \"diameter\", label: \"Workpiece diameter\", value: formatMm(metrics.requestedWorkpieceDiameterMm) },\n        { key: \"ap\", label: \"Depth of cut ap\", value: formatMm(metrics.requestedApMm) },\n        { key: \"rigidity\", label: \"Face rigidity\", value: titleCase(metrics.requestedFaceRigidityClass) },\n        { key: \"center\", label: \"Center requirement\", value: titleCase(metrics.requestedCenterFinishRequired) },\n        { key: \"mode\", label: \"Face-turning mode\", value: titleCase(metrics.requestedSpecialFaceMode) },\n      ];\n    }\n    \n    function buildGeometryItems(metrics) {\n      var items = [\n        {\n          key: \"polarity\",\n          label: \"Geometry tendency\",\n          actual: titleCase(metrics.candidatePolarity),\n          target: titleCase(metrics.positiveNegativeBias),\n          result: metrics.polarityFitScore >= 0.85 ? \"fit\" : \"near\",\n        },\n        {\n          key: \"special_mode\",\n          label: \"Insert / mode fit\",\n          actual: metrics.candidateShapeCode ? String(metrics.candidateShapeCode) : \"n/a\",\n          target: titleCase(metrics.requestedSpecialFaceMode),\n          result: metrics.specialModeFitScore >= 0.85 ? \"fit\" : metrics.specialModeFitScore >= 0.6 ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"nose_radius\",\n          label: \"Nose radius\",\n          actual: formatMm(metrics.noseRadiusMm, 2),\n          target: metrics.requestedNoseRadiusLimitMm != null ? \"<= \" + formatMm(metrics.requestedNoseRadiusLimitMm, 2) : titleCase(metrics.requestedSurfacePriority),\n          result: metrics.noseRadiusFitScore >= 0.85 ? \"fit\" : metrics.noseRadiusFitScore >= 0.6 ? \"near\" : \"mismatch\",\n        },\n      ];\n    \n      if (metrics.theoreticalRoughnessUm != null || metrics.requestedTargetRoughnessUm != null) {\n        items.push({\n          key: \"roughness\",\n          label: \"Theoretical roughness\",\n          actual: formatUm(metrics.theoreticalRoughnessUm, 1),\n          target: metrics.requestedTargetRoughnessUm != null ? formatUm(metrics.requestedTargetRoughnessUm, 1) : \"not specified\",\n          result: metrics.requestedTargetRoughnessUm == null || metrics.theoreticalRoughnessUm <= metrics.requestedTargetRoughnessUm ? \"fit\" : \"near\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"score\", label: \"Fit score\", value: formatNumber(top.score.total, 2), status: top.score.total >= 6 ? \"good\" : \"ok\" },\n        { key: \"radial_force\", label: \"Radial-force conflict\", value: titleCase(metrics.radialForceConflict), status: statusFromRisk(metrics.radialForceConflict) },\n        { key: \"center_zone\", label: \"Center-zone risk\", value: titleCase(metrics.centerZoneRisk), status: statusFromRisk(metrics.centerZoneRisk) },\n        { key: \"finish\", label: \"Finish feasibility\", value: titleCase(metrics.finishFeasibility), status: metrics.finishFeasibility === \"strong\" ? \"good\" : metrics.finishFeasibility === \"conditional\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatNumber(top.score.confidence, 2), status: top.score.confidence >= 0.78 ? \"good\" : \"ok\" },\n      ];\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n        { key: \"f\", label: \"f\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n        { key: \"ap\", label: \"ap\", min: top.recipe && top.recipe.ap.min, typ: top.recipe && top.recipe.ap.typ, max: top.recipe && top.recipe.ap.max, unit: \"mm\" },\n        { key: \"n\", label: \"n\", min: null, typ: metrics.rpmTyp, max: null, unit: \"rpm\" },\n        { key: \"vf\", label: \"vf\", min: null, typ: metrics.feedSpeedMmMin, max: null, unit: \"mm/min\" },\n        { key: \"Q\", label: \"Q\", min: null, typ: metrics.mrrCm3Min, max: null, unit: \"cm3/min\" },\n        { key: \"Rth\", label: \"Rth\", min: null, typ: metrics.theoreticalRoughnessUm, max: null, unit: \"um\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildMachineChecks(candidate, metrics) {\n      var checks = [];\n    \n      if (metrics.requestedCoolantClass) {\n        checks.push({\n          key: \"coolant\",\n          label: \"Coolant support\",\n          result: metrics.coolingSupportClass === \"strong\" || metrics.coolingSupportClass === \"adequate\"\n            ? \"pass\"\n            : metrics.coolingSupportClass === \"limited\"\n              ? \"limited\"\n              : \"fail\",\n          note: metrics.requestedCoolantClass === \"internal\" || metrics.requestedCoolantClass === \"high_pressure\"\n            ? (candidate.common.coolantTsc ? \"Tool supports through-coolant delivery.\" : \"Machine asks for through coolant but the candidate does not expose it.\")\n            : null,\n        });\n      }\n    \n      checks.push({\n        key: \"setup_quality\",\n        label: \"Center height / setup\",\n        result: metrics.requestedToolSetUpQuality === \"controlled\" ? \"pass\" : \"limited\",\n        note: metrics.requestedToolSetUpQuality === \"controlled\"\n          ? \"Center-height and plan-parallel setup are expected to be under control.\"\n          : \"Center height and tool parallelity should be checked carefully before center-critical face turning.\",\n      });\n    \n      if (metrics.requestedSpecialFaceMode === \"bidirectional\") {\n        checks.push({\n          key: \"bidirectional\",\n          label: \"Bidirectional fit\",\n          result: metrics.bidirectionalFit === \"possible\" ? \"limited\" : \"fail\",\n          note: metrics.bidirectionalFit === \"possible\"\n            ? \"Candidate shape is at least plausible for a forward/reverse special case.\"\n            : \"Bidirectional face turning is a special-case requirement and this candidate is not a clear default fit.\",\n        });\n      }\n    \n      return checks;\n    }\n    \n    function buildSetupItems(metrics) {\n      var items = [\n        { area: \"geometry\", message: \"Preferred geometry bias: \" + titleCase(metrics.positiveNegativeBias) + \".\" },\n        { area: \"center\", message: \"Center-zone requirement: \" + titleCase(metrics.requestedCenterFinishRequired) + \" with setup quality \" + titleCase(metrics.requestedToolSetUpQuality) + \".\" },\n        { area: \"stability\", message: \"Radial-force conflict is currently \" + titleCase(metrics.radialForceConflict) + \" on a \" + titleCase(metrics.requestedFaceRigidityClass) + \" face.\" },\n        { area: \"special\", message: \"Cutting-material route: \" + titleCase(metrics.specialMaterialRoute) + \".\" },\n      ];\n    \n      if (metrics.requestedWiperAllowed && metrics.requestedWiperAllowed !== \"unknown\") {\n        items.push({ area: \"surface\", message: \"Wiper suitability: \" + titleCase(metrics.wiperSuitabilityClass) + \".\" });\n      }\n      if (metrics.requestedSpecialFaceMode && metrics.requestedSpecialFaceMode !== \"standard\") {\n        items.push({ area: \"mode\", message: \"Special face mode: \" + titleCase(metrics.requestedSpecialFaceMode) + \".\" });\n      }\n      return items;\n    }\n    \n    function buildRiskItems(metrics) {\n      var items = [];\n    \n      if (metrics.radialForceConflict === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Radial forces\",\n          message: \"Face turning generates high radial cutting forces here and can deflect a weak face or ring-like component.\",\n        });\n      }\n      if (metrics.centerZoneRisk === \"high\" || metrics.centerZoneRisk === \"critical\") {\n        items.push({\n          severity: metrics.centerZoneRisk === \"critical\" ? \"critical\" : \"warning\",\n          title: \"Center zone\",\n          message: \"Center-critical face turning needs careful center-height control or a nub / burr can remain at the center.\",\n        });\n      }\n      if (metrics.finishFeasibility === \"weak\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Surface conflict\",\n          message: \"The requested plan-face finish needs a smaller feed, a different nose radius, a wiper-capable setup or tighter setup control.\",\n        });\n      }\n      if (metrics.requestedWiperAllowed === \"yes\" && (metrics.wiperSuitabilityClass === \"weak\" || metrics.wiperSuitabilityClass === \"avoid\")) {\n        items.push({\n          severity: \"warning\",\n          title: \"Wiper limitation\",\n          message: \"Wiper geometry is not a universal default for face turning and loses value in unstable or special-mode setups.\",\n        });\n      }\n      if (metrics.requestedWiperAllowed === \"yes\" && String(metrics.candidateShapeCode || \"\").toUpperCase() === \"D\") {\n        items.push({\n          severity: \"warning\",\n          title: \"D-style insert note\",\n          message: \"Some D-style insert wiper concepts do not keep the same two-sided face-turning benefit as they do in diameter turning.\",\n        });\n      }\n      if (metrics.chipControlRisk === \"high\" || metrics.chipControlRisk === \"critical\") {\n        items.push({\n          severity: metrics.chipControlRisk === \"critical\" ? \"critical\" : \"warning\",\n          title: \"Chip control\",\n          message: \"Material behavior, ap and feed point to chip-control or built-up-edge risk in this face-turning case.\",\n        });\n      }\n      if (metrics.specialMaterialRoute !== \"carbide_default\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Special route\",\n          message: \"This material/application window may justify a non-standard cutting-material route.\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildResultView(scored) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var metrics = top.metrics || {};\n    \n      return createResultViewModel({\n        processId: \"face_turning\",\n        outcome: top.score.total >= 6 ? \"match\" : \"limited_match\",\n        summary: \"Best face turning result based on phase fit, radial-force control, center-zone behavior and surface/process balance.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 4),\n          }),\n          featureSummary(buildFeatureItems(metrics)),\n          geometryFit(buildGeometryItems(metrics)),\n          fitKpis(buildFitItems(top)),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: buildRecipeValues(top),\n          }),\n          machineFeasibility(buildMachineChecks(candidate, metrics)),\n          riskNotes(buildRiskItems(metrics)),\n          setupNotes(buildSetupItems(metrics)),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative face-turning option\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust face-turning inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/face-turning/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"face_turning\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/face-turning/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function getOperationPhase(ctx) {\n      return toNullableString(getAnswer(ctx, \"operation_phase\") || getAnswer(ctx, \"goal_stage\")) || \"semi-finishing\";\n    }\n    \n    function getMaterialRefinement(ctx) {\n      return toNullableString(getAnswer(ctx, \"material_refinement\") || getAnswer(ctx, \"material_condition_class\")) || \"standard\";\n    }\n    \n    function getSurfacePriority(ctx) {\n      return toNullableString(getAnswer(ctx, \"surface_vs_productivity\")) || \"balanced\";\n    }\n    \n    function getFaceRigidityClass(ctx) {\n      return toNullableString(getAnswer(ctx, \"face_rigidity_class\")) || \"normal\";\n    }\n    \n    function getCenterFinishRequired(ctx) {\n      return toNullableString(getAnswer(ctx, \"center_finish_required\")) || \"center_uncritical\";\n    }\n    \n    function getCoolantClass(ctx) {\n      return toNullableString(getAnswer(ctx, \"coolant_class\")) || \"unknown\";\n    }\n    \n    function getSpecialFaceMode(ctx) {\n      return toNullableString(getAnswer(ctx, \"special_face_mode\")) || \"standard\";\n    }\n    \n    function getToolSetUpQuality(ctx) {\n      return toNullableString(getAnswer(ctx, \"tool_set_up_quality\")) || \"uncertain\";\n    }\n    \n    function getIsoGroup(ctx) {\n      return toNullableString(ctx && ctx.material && ctx.material.isoGroup) || null;\n    }\n    \n    function stageFitScore(requestedStage, row) {\n      var rowStage = row && row.constraints ? toNullableString(row.constraints.conditionStage) : null;\n      if (!rowStage || !requestedStage) return 0.75;\n      if (rowStage === requestedStage) return 1;\n      if ((rowStage === \"roughing\" && requestedStage === \"semi-finishing\") || (rowStage === \"semi-finishing\" && requestedStage === \"roughing\")) {\n        return 0.72;\n      }\n      if ((rowStage === \"finishing\" && requestedStage === \"semi-finishing\") || (rowStage === \"semi-finishing\" && requestedStage === \"finishing\")) {\n        return 0.82;\n      }\n      return 0.38;\n    }\n    \n    function selectBestRow(rows, requestedStage) {\n      var exact = (rows || []).find(function findExact(row) {\n        return row && row.constraints && row.constraints.conditionStage === requestedStage;\n      });\n      return exact || (rows || [])[0] || null;\n    }\n    \n    function getCandidatePolarity(candidate) {\n      var clearanceCode = toNullableString(candidate && candidate.turning && candidate.turning.turnClearanceCode);\n      if (!clearanceCode) return \"unknown\";\n      return clearanceCode.toUpperCase() === \"N\" ? \"negative\" : \"positive\";\n    }\n    \n    function inferPolarityBias(faceRigidityClass, interruption, phase, surfacePriority, materialRefinement, isoGroup) {\n      var positiveNeed = 0;\n      var negativeNeed = 0;\n    \n      positiveNeed += { normal: 0, lightly_unstable: 1.1, strongly_unstable: 2.2 }[faceRigidityClass] || 0;\n      if (surfacePriority === \"surface\") positiveNeed += 1;\n      if (materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") positiveNeed += 1;\n      if (isoGroup === \"N\") positiveNeed += 0.8;\n    \n      if (interruption === \"heavy\") negativeNeed += 2;\n      if (phase === \"roughing\") negativeNeed += 1;\n      if (surfacePriority === \"productivity\") negativeNeed += 1;\n      if (isoGroup === \"K\") negativeNeed += 0.8;\n    \n      if (positiveNeed >= negativeNeed + 1) return \"positive_preferred\";\n      if (negativeNeed >= positiveNeed + 1) return \"negative_preferred\";\n      return \"balanced\";\n    }\n    \n    function polarityFitScore(bias, candidatePolarity) {\n      if (bias === \"balanced\") return candidatePolarity === \"unknown\" ? 0.65 : 0.82;\n      if (candidatePolarity === \"unknown\") return 0.55;\n      if (bias === \"positive_preferred\") return candidatePolarity === \"positive\" ? 1 : 0.38;\n      return candidatePolarity === \"negative\" ? 1 : 0.38;\n    }\n    \n    function classifyRadialForceConflict(faceRigidityClass, centerFinishRequired, phase, candidatePolarity, noseRadiusMm) {\n      var risk = 0;\n    \n      risk += { normal: 0.3, lightly_unstable: 1.1, strongly_unstable: 2.1 }[faceRigidityClass] || 0.6;\n      risk += { functional_to_center: 1.2, clean_to_center: 0.7, center_uncritical: 0 }[centerFinishRequired] || 0.4;\n      risk += { roughing: 0.9, \"semi-finishing\": 0.45, finishing: 0.1 }[phase] || 0.3;\n      if (candidatePolarity === \"negative\") risk += 0.8;\n      if (candidatePolarity === \"positive\") risk -= 0.25;\n      if (noseRadiusMm != null && noseRadiusMm >= 0.8) risk += 0.45;\n      if (noseRadiusMm != null && noseRadiusMm <= 0.4 && faceRigidityClass !== \"normal\") risk -= 0.15;\n    \n      if (risk >= 3.1) return \"high\";\n      if (risk >= 1.6) return \"medium\";\n      return \"low\";\n    }\n    \n    function radialForceScore(radialForceConflict) {\n      return { low: 1, medium: 0.68, high: 0.3 }[radialForceConflict] || 0.55;\n    }\n    \n    function classifyCenterZoneRisk(centerFinishRequired, toolSetUpQuality, faceRigidityClass, phase, specialFaceMode) {\n      var risk = 0;\n    \n      risk += { functional_to_center: 1.8, clean_to_center: 1.1, center_uncritical: 0.2 }[centerFinishRequired] || 0.5;\n      risk += { controlled: -0.35, uncertain: 1 }[toolSetUpQuality] || 0.8;\n      risk += { normal: 0, lightly_unstable: 0.55, strongly_unstable: 1.15 }[faceRigidityClass] || 0.4;\n      if (phase === \"roughing\") risk += 0.25;\n      if (specialFaceMode === \"bidirectional\") risk += 0.55;\n      if (specialFaceMode === \"confined\" || specialFaceMode === \"special_tool\") risk += 0.25;\n    \n      if (risk >= 3.1) return \"critical\";\n      if (risk >= 1.9) return \"high\";\n      if (risk >= 0.9) return \"medium\";\n      return \"low\";\n    }\n    \n    function centerZoneScore(centerZoneRisk) {\n      return { low: 1, medium: 0.7, high: 0.38, critical: 0.16 }[centerZoneRisk] || 0.55;\n    }\n    \n    function shapeModeScore(shapeCode, specialFaceMode) {\n      var code = String(shapeCode || \"\").toUpperCase();\n      var standardMap = { C: 0.95, W: 0.92, S: 0.88, T: 0.86, D: 0.78, V: 0.7, R: 0.6 };\n      var confinedMap = { V: 1, D: 0.96, T: 0.9, C: 0.78, W: 0.72, S: 0.6, R: 0.3 };\n      var bidirectionalMap = { D: 0.94, T: 0.9, C: 0.68, W: 0.62, V: 0.58, S: 0.5, R: 0.28 };\n      var specialMap = { D: 0.9, T: 0.86, C: 0.76, W: 0.72, V: 0.64, S: 0.55, R: 0.3 };\n      var table = standardMap;\n    \n      if (specialFaceMode === \"confined\") table = confinedMap;\n      if (specialFaceMode === \"bidirectional\") table = bidirectionalMap;\n      if (specialFaceMode === \"special_tool\") table = specialMap;\n      return Object.prototype.hasOwnProperty.call(table, code) ? table[code] : 0.65;\n    }\n    \n    function noseRadiusFitScore(noseRadiusMm, noseRadiusLimitMm, surfacePriority, phase, faceRigidityClass, centerFinishRequired, specialFaceMode) {\n      if (noseRadiusMm == null) return 0.55;\n      if (noseRadiusLimitMm != null) {\n        if (noseRadiusMm > noseRadiusLimitMm) return 0;\n        if (noseRadiusMm >= noseRadiusLimitMm * 0.75) return 1;\n        return clamp(0.7 + noseRadiusMm / Math.max(noseRadiusLimitMm, 0.01) * 0.3, 0.7, 0.98);\n      }\n      if (faceRigidityClass === \"strongly_unstable\" || centerFinishRequired === \"functional_to_center\") {\n        return noseRadiusMm <= 0.4 ? 1 : noseRadiusMm <= 0.8 ? 0.62 : 0.28;\n      }\n      if (surfacePriority === \"surface\" && phase === \"finishing\") {\n        if (noseRadiusMm >= 0.4 && noseRadiusMm <= 0.8) return 1;\n        if (noseRadiusMm < 0.4) return 0.74;\n        return 0.72;\n      }\n      if (surfacePriority === \"productivity\" && phase === \"roughing\" && specialFaceMode === \"standard\") {\n        if (noseRadiusMm >= 0.8) return 1;\n        if (noseRadiusMm >= 0.4) return 0.78;\n        return 0.5;\n      }\n      return noseRadiusMm >= 0.4 && noseRadiusMm <= 0.8 ? 0.9 : 0.7;\n    }\n    \n    function classifyChipControlRisk(materialRefinement, coolantClass, phase, interruption, apMm, fnTyp) {\n      var ratio = apMm != null && fnTyp != null && fnTyp > 0 ? apMm / fnTyp : null;\n      var risk = 0;\n    \n      if (materialRefinement === \"tough_long_chipping\") risk += 1.2;\n      if (materialRefinement === \"sticky_bue\") risk += 1.1;\n      if (materialRefinement === \"work_hardening\") risk += 1.1;\n      if (phase === \"finishing\") risk += 0.35;\n      if (coolantClass === \"dry\" || coolantClass === \"unknown\") risk += 0.7;\n      if (interruption === \"heavy\") risk -= 0.2;\n    \n      if (ratio != null) {\n        if (ratio < 4 || ratio > 18) risk += 1;\n        else if (ratio < 5 || ratio > 15) risk += 0.45;\n      }\n    \n      if (risk >= 2.6) return \"critical\";\n      if (risk >= 1.7) return \"high\";\n      if (risk >= 0.8) return \"medium\";\n      return \"low\";\n    }\n    \n    function chipRiskScore(chipControlRisk) {\n      return { low: 1, medium: 0.72, high: 0.42, critical: 0.15 }[chipControlRisk] || 0.6;\n    }\n    \n    function classifyCoolingSupport(materialRefinement, coolantClass, hasThroughCoolant, isoGroup) {\n      var demand = 0;\n      var supply = 0;\n    \n      if (isoGroup === \"M\" || isoGroup === \"S\" || isoGroup === \"N\") demand += 1;\n      if (materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") demand += 1;\n    \n      supply += { dry: 0, external: 0.8, internal: 1.2, high_pressure: 1.5, unknown: 0.4 }[coolantClass] || 0.4;\n      if ((coolantClass === \"internal\" || coolantClass === \"high_pressure\") && hasThroughCoolant) supply += 0.3;\n      if ((coolantClass === \"internal\" || coolantClass === \"high_pressure\") && !hasThroughCoolant) supply -= 0.3;\n    \n      if (supply >= demand + 0.7) return \"strong\";\n      if (supply >= demand) return \"adequate\";\n      if (supply >= demand - 0.6) return \"limited\";\n      return \"weak\";\n    }\n    \n    function coolingScore(coolingSupportClass) {\n      return { strong: 1, adequate: 0.82, limited: 0.55, weak: 0.22 }[coolingSupportClass] || 0.6;\n    }\n    \n    function classifyWiperSuitability(surfacePriority, phase, faceRigidityClass, specialFaceMode, wiperAllowed, toolSetUpQuality, candidateShapeCode, centerFinishRequired) {\n      if (wiperAllowed === \"no\") return \"avoid\";\n      if (phase === \"roughing\") return \"weak\";\n      if (specialFaceMode === \"bidirectional\") return \"weak\";\n      if (faceRigidityClass === \"strongly_unstable\") return \"weak\";\n      if (toolSetUpQuality !== \"controlled\" && centerFinishRequired === \"functional_to_center\") return \"weak\";\n      if (String(candidateShapeCode || \"\").toUpperCase() === \"D\" && centerFinishRequired !== \"center_uncritical\") return \"usable\";\n      if (surfacePriority === \"surface\" && phase === \"finishing\" && specialFaceMode === \"standard\" && toolSetUpQuality === \"controlled\") {\n        return \"strong\";\n      }\n      if (surfacePriority !== \"productivity\") return \"usable\";\n      return \"weak\";\n    }\n    \n    function computeTheoreticalRoughnessUm(fnTyp, noseRadiusMm) {\n      if (fnTyp == null || noseRadiusMm == null || noseRadiusMm <= 0) return null;\n      return fnTyp * fnTyp / (8 * noseRadiusMm) * 1000;\n    }\n    \n    function classifyFinishFeasibility(surfacePriority, phase, radialForceConflict, centerZoneRisk, wiperSuitabilityClass, roughnessUm, targetRoughnessUm, toolSetUpQuality) {\n      var roughnessFit = roughnessUm == null || targetRoughnessUm == null ? \"unknown\" : (roughnessUm <= targetRoughnessUm ? \"good\" : (roughnessUm <= targetRoughnessUm * 1.35 ? \"near\" : \"poor\"));\n    \n      if (surfacePriority === \"productivity\" && phase === \"roughing\") return \"weak\";\n      if (centerZoneRisk === \"critical\") return \"weak\";\n      if (radialForceConflict === \"high\" && surfacePriority === \"surface\") return \"weak\";\n      if (wiperSuitabilityClass === \"avoid\") return \"weak\";\n      if (roughnessFit === \"good\" && phase === \"finishing\" && toolSetUpQuality === \"controlled\" && (radialForceConflict === \"low\" || radialForceConflict === \"medium\")) {\n        return \"strong\";\n      }\n      if (roughnessFit === \"poor\") return \"weak\";\n      return \"conditional\";\n    }\n    \n    function finishScore(finishFeasibility, surfacePriority) {\n      var base = { strong: 1, conditional: 0.68, weak: 0.28 }[finishFeasibility] || 0.55;\n      if (surfacePriority === \"surface\") return base;\n      if (surfacePriority === \"balanced\") return clamp(base + 0.05, 0, 1);\n      return clamp(base + 0.12, 0, 1);\n    }\n    \n    function classifySpecialMaterialRoute(isoGroup, materialRefinement, phase, surfacePriority) {\n      if (isoGroup === \"H\" || materialRefinement === \"hard\") return \"cbn_pcbn_route\";\n      if (isoGroup === \"N\" && (surfacePriority === \"surface\" || phase === \"finishing\")) return \"pcd_route\";\n      if (phase === \"finishing\" && surfacePriority === \"surface\" && (isoGroup === \"P\" || isoGroup === \"M\" || isoGroup === \"K\")) return \"cermet_possible\";\n      return \"carbide_default\";\n    }\n    \n    function classifyBidirectionalFit(specialFaceMode, candidateShapeCode) {\n      var code = String(candidateShapeCode || \"\").toUpperCase();\n    \n      if (specialFaceMode !== \"bidirectional\") return \"not_needed\";\n      if (code === \"D\" || code === \"T\") return \"possible\";\n      if (code === \"C\" || code === \"W\") return \"conflict\";\n      return \"conflict\";\n    }\n    \n    function buildReasonList(metrics) {\n      return [\n        metrics.stageFitScore >= 0.85 ? \"Stage and recipe window line up with the requested face-turning phase.\" : \"The selected row is workable, but not ideal for the requested face-turning phase.\",\n        metrics.polarityFitScore >= 0.85 ? \"Insert geometry follows the preferred force-reduction or robustness tendency.\" : \"Insert geometry is usable, but the positive/negative force tendency is a compromise.\",\n        metrics.radialForceConflict === \"low\" || metrics.radialForceConflict === \"medium\"\n          ? \"Radial cutting-force load stays within a controlled face-turning range.\"\n          : \"Radial cutting forces are the main constraint for this face-turning setup.\",\n        metrics.centerZoneRisk === \"low\" || metrics.centerZoneRisk === \"medium\"\n          ? \"Center-zone behavior is manageable for the requested plan-facing requirement.\"\n          : \"Finishing through the center needs extra setup control in this case.\",\n        metrics.finishFeasibility === \"strong\"\n          ? \"Surface quality is credible with the current feed and nose-radius window.\"\n          : \"Surface quality depends strongly on feed, radius, wiper and setup discipline.\",\n      ].slice(0, 5);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"face_turning\", ctx, toolkits));\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var faceRigidityClass = getFaceRigidityClass(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var surfacePriority = getSurfacePriority(ctx);\n      var centerFinishRequired = getCenterFinishRequired(ctx);\n    \n      derived.condition_stage = phase;\n      derived.material_refinement = materialRefinement;\n      derived.positive_negative_bias = inferPolarityBias(faceRigidityClass, interruption, phase, surfacePriority, materialRefinement, getIsoGroup(ctx));\n      derived.center_zone_criticality = centerFinishRequired === \"functional_to_center\"\n        ? \"high\"\n        : centerFinishRequired === \"clean_to_center\"\n          ? \"medium\"\n          : \"low\";\n      derived.special_cutting_material_route = classifySpecialMaterialRoute(getIsoGroup(ctx), materialRefinement, phase, surfacePriority);\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"face_turning\", ctx);\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var coolantClass = getCoolantClass(ctx);\n      var surfacePriority = getSurfacePriority(ctx);\n      var faceRigidityClass = getFaceRigidityClass(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var centerFinishRequired = getCenterFinishRequired(ctx);\n      var specialFaceMode = getSpecialFaceMode(ctx);\n      var targetRoughnessUm = toNullableNumber(getAnswer(ctx, \"target_roughness\"));\n      var toolSetUpQuality = getToolSetUpQuality(ctx);\n      var diameterMm = toNullableNumber(getAnswer(ctx, \"workpiece_diameter_mm\"));\n      var apMm = toNullableNumber(getAnswer(ctx, \"ap_mm\"));\n      var wiperAllowed = toNullableString(getAnswer(ctx, \"wiper_allowed\")) || \"unknown\";\n    \n      if ((materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") && (coolantClass === \"dry\" || coolantClass === \"unknown\")) {\n        issues.push({\n          field: \"coolant_class\",\n          message: \"Face turning in BUE- or work-hardening-prone materials benefits strongly from better coolant support.\",\n          severity: \"warning\",\n          code: \"face_turning_coolant_support\",\n        });\n      }\n      if (phase === \"finishing\" && interruption === \"heavy\") {\n        issues.push({\n          field: \"cut_interruption\",\n          message: \"Heavy interruption is a weak fit for finish-oriented face turning.\",\n          severity: \"warning\",\n          code: \"face_turning_finish_interruption\",\n        });\n      }\n      if (surfacePriority === \"productivity\" && faceRigidityClass === \"strongly_unstable\") {\n        issues.push({\n          field: \"face_rigidity_class\",\n          message: \"Strongly unstable plan faces rarely support aggressive productivity-biased face turning.\",\n          severity: \"warning\",\n          code: \"face_turning_rigidity_productivity\",\n        });\n      }\n      if (centerFinishRequired !== \"center_uncritical\" && toolSetUpQuality !== \"controlled\") {\n        issues.push({\n          field: \"tool_set_up_quality\",\n          message: \"Center-sensitive face turning needs well-controlled center height and tool parallelity.\",\n          severity: \"warning\",\n          code: \"face_turning_center_setup\",\n        });\n      }\n      if (wiperAllowed === \"yes\" && specialFaceMode === \"bidirectional\") {\n        issues.push({\n          field: \"wiper_allowed\",\n          message: \"Bidirectional face-turning setups do not automatically keep the same wiper benefit as standard plan facing.\",\n          severity: \"warning\",\n          code: \"face_turning_wiper_bidirectional\",\n        });\n      }\n      if (targetRoughnessUm != null && targetRoughnessUm < 1 && phase !== \"finishing\") {\n        issues.push({\n          field: \"target_roughness\",\n          message: \"Sub-micron roughness targets usually require a finishing-focused face-turning strategy.\",\n          severity: \"warning\",\n          code: \"face_turning_roughness_phase_conflict\",\n        });\n      }\n      if (diameterMm != null && apMm != null && diameterMm > 0 && apMm / diameterMm > 0.2) {\n        issues.push({\n          field: \"ap_mm\",\n          message: \"Requested depth of cut is very high relative to the stated face-turning diameter.\",\n          severity: \"warning\",\n          code: \"face_turning_high_ap_ratio\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"face_turning\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var turningTools = toolkits.turning;\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var diameterMm = toNullableNumber(getAnswer(ctx, \"workpiece_diameter_mm\"));\n      var apMm = toNullableNumber(getAnswer(ctx, \"ap_mm\"));\n      var surfacePriority = getSurfacePriority(ctx);\n      var faceRigidityClass = getFaceRigidityClass(ctx);\n      var centerFinishRequired = getCenterFinishRequired(ctx);\n      var coolantClass = getCoolantClass(ctx);\n      var specialFaceMode = getSpecialFaceMode(ctx);\n      var targetRoughnessUm = toNullableNumber(getAnswer(ctx, \"target_roughness\"));\n      var wiperAllowed = toNullableString(getAnswer(ctx, \"wiper_allowed\")) || \"unknown\";\n      var noseRadiusLimitMm = toNullableNumber(getAnswer(ctx, \"nose_radius_limit\"));\n      var toolSetUpQuality = getToolSetUpQuality(ctx);\n      var isoGroup = getIsoGroup(ctx);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = turningTools.resolveRows(candidate, ctx);\n        var row = selectBestRow(rows, phase);\n        var recipeResult = turningTools.resolveRecipe(candidate, ctx);\n        var recipe = row && row.recipe ? row.recipe : recipeResult.recipe;\n        var recipeSource = recipeResult.source;\n        var insertIcMm = toNullableNumber(candidate.turning.turnSizeIcMm) || toNullableNumber(candidate.common.diameterMm);\n        var noseRadiusMm = toNullableNumber(candidate.turning.turnNoseRadiusMm);\n        var candidatePolarity = getCandidatePolarity(candidate);\n        var candidateShapeCode = toNullableString(candidate.turning.turnShapeCode) || \"?\";\n        var stageFit = stageFitScore(phase, row);\n        var polarityBias = inferPolarityBias(faceRigidityClass, interruption, phase, surfacePriority, materialRefinement, isoGroup);\n        var polarityFit = polarityFitScore(polarityBias, candidatePolarity);\n        var radialForceConflict = classifyRadialForceConflict(faceRigidityClass, centerFinishRequired, phase, candidatePolarity, noseRadiusMm);\n        var radialForceFit = radialForceScore(radialForceConflict);\n        var centerZoneRisk = classifyCenterZoneRisk(centerFinishRequired, toolSetUpQuality, faceRigidityClass, phase, specialFaceMode);\n        var centerZoneFit = centerZoneScore(centerZoneRisk);\n        var specialModeFit = shapeModeScore(candidateShapeCode, specialFaceMode);\n        var noseFit = noseRadiusFitScore(noseRadiusMm, noseRadiusLimitMm, surfacePriority, phase, faceRigidityClass, centerFinishRequired, specialFaceMode);\n        var recipeFnTyp = recipe && recipe.fn ? toNullableNumber(recipe.fn.typ) : null;\n        var recipeVcTyp = recipe && recipe.vc ? toNullableNumber(recipe.vc.typ) : null;\n        var chipControlRisk = classifyChipControlRisk(materialRefinement, coolantClass, phase, interruption, apMm, recipeFnTyp);\n        var chipControlFit = chipRiskScore(chipControlRisk);\n        var coolingSupportClass = classifyCoolingSupport(materialRefinement, coolantClass, Boolean(candidate.common.coolantTsc), isoGroup);\n        var coolingFit = coolingScore(coolingSupportClass);\n        var wiperSuitabilityClass = classifyWiperSuitability(surfacePriority, phase, faceRigidityClass, specialFaceMode, wiperAllowed, toolSetUpQuality, candidateShapeCode, centerFinishRequired);\n        var theoreticalRoughnessUm = computeTheoreticalRoughnessUm(recipeFnTyp, noseRadiusMm);\n        var finishFeasibility = classifyFinishFeasibility(surfacePriority, phase, radialForceConflict, centerZoneRisk, wiperSuitabilityClass, theoreticalRoughnessUm, targetRoughnessUm, toolSetUpQuality);\n        var finishFit = finishScore(finishFeasibility, surfacePriority);\n        var specialMaterialRoute = classifySpecialMaterialRoute(isoGroup, materialRefinement, phase, surfacePriority);\n        var bidirectionalFit = classifyBidirectionalFit(specialFaceMode, candidateShapeCode);\n        var insertSizeFit = 0.72;\n        var rpmTyp = diameterMm != null && diameterMm > 0 && recipeVcTyp != null ? recipeVcTyp * 1000 / (Math.PI * diameterMm) : null;\n        var feedSpeedMmMin = recipeFnTyp != null && rpmTyp != null ? recipeFnTyp * rpmTyp : null;\n        var mrrCm3Min = apMm != null && recipeFnTyp != null && recipeVcTyp != null ? apMm * recipeFnTyp * recipeVcTyp : null;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidenceBase;\n        var confidence;\n        var metrics;\n    \n        if (rows.length === 0 && candidate.stage === \"detail\") {\n          hardRejectReason = \"No turning row is available for face turning.\";\n        }\n        if (!hardRejectReason && noseRadiusLimitMm != null && noseRadiusMm != null && noseRadiusMm > noseRadiusLimitMm) {\n          hardRejectReason = \"Insert nose radius exceeds the allowed face-turning contour radius.\";\n        }\n    \n        if (apMm != null && insertIcMm != null && insertIcMm > 0) {\n          insertSizeFit = apMm <= insertIcMm * 0.45 ? 1 : apMm <= insertIcMm * 0.8 ? 0.74 : 0.45;\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          rowMatch: row ? 1 : 0,\n          stage: stageFit * 1.2,\n          insertSize: insertSizeFit,\n          polarity: polarityFit * 1.05,\n          specialMode: specialModeFit * 0.9,\n          noseRadius: noseFit * 1.1,\n          radialForce: radialForceFit * 1.35,\n          centerZone: centerZoneFit * 1.2,\n          chipControl: chipControlFit * 0.95,\n          cooling: coolingFit * 0.85,\n          finish: finishFit * (surfacePriority === \"surface\" ? 1.2 : 0.9),\n          riskPenalty: -(kernel.risk(candidate, ctx) || 0),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidenceBase = { exact: 0.92, near: 0.8, estimated: 0.66, none: 0.48 }[recipeSource] || 0.48;\n        confidence = confidenceBase;\n        if (radialForceConflict === \"high\") confidence -= 0.16;\n        if (centerZoneRisk === \"high\") confidence -= 0.12;\n        if (centerZoneRisk === \"critical\") confidence -= 0.22;\n        if (chipControlRisk === \"high\") confidence -= 0.06;\n        if (chipControlRisk === \"critical\") confidence -= 0.12;\n        if (specialFaceMode === \"bidirectional\" && bidirectionalFit === \"conflict\") confidence -= 0.08;\n        confidence = hardRejectReason ? 0 : clamp(confidence, 0.2, 0.98);\n    \n        metrics = Object.assign({}, turningTools.getSharedMetrics(candidate, ctx), {\n          requestedOperationPhase: phase,\n          requestedMaterialRefinement: materialRefinement,\n          requestedWorkpieceDiameterMm: diameterMm,\n          requestedApMm: apMm,\n          requestedSurfacePriority: surfacePriority,\n          requestedFaceRigidityClass: faceRigidityClass,\n          requestedCutInterruption: interruption,\n          requestedCenterFinishRequired: centerFinishRequired,\n          requestedCoolantClass: coolantClass,\n          requestedSpecialFaceMode: specialFaceMode,\n          requestedTargetRoughnessUm: targetRoughnessUm,\n          requestedWiperAllowed: wiperAllowed,\n          requestedNoseRadiusLimitMm: noseRadiusLimitMm,\n          requestedToolSetUpQuality: toolSetUpQuality,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          insertIcMm: insertIcMm,\n          noseRadiusMm: noseRadiusMm,\n          candidatePolarity: candidatePolarity,\n          candidateShapeCode: candidateShapeCode,\n          positiveNegativeBias: polarityBias,\n          radialForceConflict: radialForceConflict,\n          centerZoneRisk: centerZoneRisk,\n          chipControlRisk: chipControlRisk,\n          coolingSupportClass: coolingSupportClass,\n          wiperSuitabilityClass: wiperSuitabilityClass,\n          finishFeasibility: finishFeasibility,\n          specialMaterialRoute: specialMaterialRoute,\n          bidirectionalFit: bidirectionalFit,\n          theoreticalRoughnessUm: theoreticalRoughnessUm,\n          stageFitScore: stageFit,\n          polarityFitScore: polarityFit,\n          insertSizeFitScore: insertSizeFit,\n          specialModeFitScore: specialModeFit,\n          noseRadiusFitScore: noseFit,\n          rpmTyp: rpmTyp,\n          feedSpeedMmMin: feedSpeedMmMin,\n          mrrCm3Min: mrrCm3Min,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeSource,\n          reasons: buildReasonList(metrics),\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/forming-blind/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/forming-blind/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/forming-blind/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/forming-blind/presenter.js\");\n    exports.default = createStubProcessModule(\"forming_blind\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/forming-blind/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, threadIdentity, toleranceNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { getTroubleshootingEntries } = __bundle.require(\"core/troubleshooting-library.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function toNullableString(value) {\n      if (value == null) return null;\n      value = String(value).trim();\n      return value || null;\n    }\n    \n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function clamp01(value) {\n      if (!Number.isFinite(value)) return 0;\n      return value <= 0 ? 0 : value >= 1 ? 1 : value;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function ensureSentence(value) {\n      var text = String(value || \"\").trim();\n      if (!text) return null;\n      return /[.!?]$/.test(text) ? text : text + \".\";\n    }\n    \n    function cleanShortText(value) {\n      return String(value || \"\").replace(/\\s+/g, \" \").trim();\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = cleanShortText(item);\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + String((priceCents / 100).toFixed(0));\n    }\n    \n    function getMaterialProfile(ctx) {\n      return ctx && ctx.material ? ctx.material.profile : null;\n    }\n    \n    function getMaterialLabel(ctx) {\n      var profile = getMaterialProfile(ctx);\n      return profile ? profile.code + \" - \" + profile.label : (ctx && ctx.material ? ctx.material.subgroupCode : null);\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative form tap\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildTroubleshootingHandles(ctx, top) {\n      var metrics = top.metrics || {};\n      var handles = [];\n      switch (metrics.problemHistory) {\n        case \"cold_welding\":\n          handles.push(\"thread-flanks-with-built-up-edge-or-smearing\");\n          break;\n        case \"high_torque\":\n          handles.push(\"tap-breaks-in-hole\", \"spindle-at-power-limit-or-stalls\");\n          break;\n        case \"gauge_tight\":\n        case \"gauge_loose\":\n          handles.push(\"thread-out-of-tolerance-core-hole-too-small-large\");\n          break;\n        case \"breakage\":\n        case \"bottom_contact\":\n          handles.push(\"tap-breaks-in-hole\");\n          break;\n      }\n      if (metrics.underOverFormRisk && metrics.underOverFormRisk !== \"nominal\" && metrics.underOverFormRisk !== \"unknown\") handles.push(\"thread-out-of-tolerance-core-hole-too-small-large\");\n      if (metrics.blindFitRisk === \"critical\") handles.push(\"tap-breaks-in-hole\");\n      if (metrics.lubricationAdequacy === \"poor\") handles.push(\"thread-flanks-with-built-up-edge-or-smearing\");\n      if (metrics.formingSeverity === \"high\") handles.push(\"spindle-at-power-limit-or-stalls\");\n      if (!handles.length) {\n        // Blind-hole forming stays highly sensitive to predrill accuracy and torque\n        // near reversal, even in a nominal setup window.\n        handles.push(\"thread-out-of-tolerance-core-hole-too-small-large\");\n        handles.push(\"tap-breaks-in-hole\");\n      }\n      return Array.from(new Set(handles)).slice(0, 2);\n    }\n    \n    function buildTroubleshootingCards(ctx, top) {\n      return getTroubleshootingEntries(buildTroubleshootingHandles(ctx, top)).map(function mapEntry(entry) {\n        var focusFlags = [];\n        if (entry.rootWorkholding) focusFlags.push(\"workholding\");\n        if (entry.rootMachinePower) focusFlags.push(\"machine power\");\n        if (entry.rootPreprocessing) focusFlags.push(\"pre-processing\");\n        return {\n          title: entry.problem,\n          tone: entry.problemCategory === \"Process Stability\" || entry.rootMachinePower ? \"high\" : \"watch\",\n          eyebrow: \"Focused response\",\n          category: entry.problemCategory || \"Troubleshooting\",\n          wear: entry.dominantToolWear || null,\n          checkFirst: focusFlags,\n          cause: ensureSentence(entry.cause),\n          actions: (entry.actions || []).slice(0, 4).map(cleanShortText).filter(Boolean),\n          note: entry.alternativeProcess ? ensureSentence(entry.alternativeProcess) : null,\n          items: [],\n        };\n      });\n    }\n    \n    function buildRiskItems(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n      if (metrics.formabilitySuitabilityClass === \"conditional\" || metrics.formabilitySuitabilityClass === \"poor\") items.push({ severity: \"warning\", title: \"Material formability\", message: metrics.formabilityLabel || \"Material formability narrows the blind-hole forming window.\" });\n      if (metrics.lubricationAdequacy === \"poor\") items.push({ severity: \"warning\", title: \"Lubrication\", message: \"Lubrication is weak for blind-hole thread forming. Do not release this setup aggressively until torque, reversal and gauge behavior are qualified.\" });\n      if (metrics.underOverFormRisk === \"overforming-risk\") items.push({ severity: \"warning\", title: \"Core-hole too small\", message: \"The actual core hole trends below the recommendation, which raises torque, over-forming risk and bottom-side stress in the blind hole.\" });\n      if (metrics.underOverFormRisk === \"underformed-risk\") items.push({ severity: \"warning\", title: \"Core-hole too large\", message: \"The actual core hole trends above the recommendation, which can weaken thread engagement and gauge fit.\" });\n      if (metrics.blindFitRisk === \"tight\") items.push({ severity: \"warning\", title: \"Bottom reserve\", message: \"The lead can still run in, but the reserve stays tight near the bore bottom. Qualify the last full threads carefully before raising output.\" });\n      if (metrics.blindFitRisk === \"critical\") items.push({ severity: \"warning\", title: \"Bottom reserve critical\", message: \"The available reserve looks too short for a comfortable blind-hole forming window. Review lead length, required full thread length and process choice before release.\" });\n      if (metrics.pitchFormingLimitWarning) items.push({ severity: \"warning\", title: \"Pitch above typical forming range\", message: \"This pitch sits above the usual practical forming range and should be treated as a specialist case.\" });\n      if (metrics.formingSeverity === \"high\") items.push({ severity: \"warning\", title: \"Process severity\", message: \"The combined material, core-hole, lubrication and blind-hole reserve window is narrow. Qualify conservatively before increasing output.\" });\n      if (metrics.lubricationAdequacy !== \"poor\" && getAnswer(ctx, \"coolant_lubrication_mode\") === \"external_emulsion\") items.push({ severity: \"info\", title: \"Lubrication reserve\", message: \"External emulsion is workable here, but oil often gives a wider safety window in blind-hole thread forming.\" });\n      return items.slice(0, 4);\n    }\n    \n    function buildMachineChecks(ctx, top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"sync_mode\",\n          label: \"Sync tapping mode\",\n          result: metrics.machineMode && metrics.machineMode.indexOf(\"Rigid\") >= 0 ? \"pass\" : metrics.machineMode && metrics.machineMode.indexOf(\"Synchro\") >= 0 ? \"pass\" : \"limited\",\n          note: metrics.machineMode || \"Machine mode not confirmed.\",\n        },\n        {\n          key: \"lubrication\",\n          label: \"Lubrication quality\",\n          result: metrics.lubricationAdequacy === \"good\" ? \"pass\" : metrics.lubricationAdequacy === \"acceptable\" ? \"limited\" : \"fail\",\n          note: metrics.coolantMode || \"Lubrication mode not confirmed.\",\n        },\n      ];\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n        { key: \"fn\", label: \"Feed\", min: metrics.requestedPitchMm, typ: metrics.requestedPitchMm, max: metrics.requestedPitchMm, unit: \"mm/rev\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildRowBackedValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { label: \"Operation\", value: titleCase(metrics.recipeOperationId || \"forming through\"), tone: \"text\" },\n        { label: \"Pre-drill\", value: formatDisplayNumber(metrics.predrillRecommendedMm, 2) || \"n/a\", unit: \"mm\" },\n        { label: \"Coolant\", value: titleCase(metrics.rowCoolantMode || metrics.coolantMode || \"unknown\"), tone: \"text\" },\n        { label: \"vc min\", value: formatDisplayNumber(metrics.recipeVcMin, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"vc max\", value: formatDisplayNumber(metrics.recipeVcMax, 0) || \"n/a\", unit: \"m/min\" },\n      ];\n    }\n    \n    function buildMachineValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { label: \"N\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n        { label: \"VF\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n        { label: \"Severity\", value: titleCase(metrics.formingSeverity || \"medium\"), tone: \"text\" },\n        { label: \"Bottom\", value: titleCase(metrics.blindFitRisk || \"review\"), tone: \"text\" },\n      ];\n    }\n    \n    function buildRecipeTrustCard(top) {\n      var confidence = top.score.recipeConfidence;\n      return {\n        title: \"Starting-band basis\",\n        tone: confidence === \"exact\" ? \"good\" : confidence === \"near\" ? \"limited\" : \"default\",\n        badge: confidence === \"exact\" ? \"Exact valid forming data\" : confidence === \"near\" ? \"Nearest valid forming data\" : \"Estimated\",\n        value: confidence === \"exact\" ? \"Start values come from a matching blind-hole forming row.\" : confidence === \"near\" ? \"Start values come from the closest valid blind-hole forming row.\" : \"Start values rely more heavily on candidate geometry and blind-hole process rules.\",\n        note: \"Feed stays locked to thread pitch. Core-hole accuracy and reserve to the bore bottom stay the bigger release checks in blind-hole thread forming.\",\n        items: [],\n      };\n    }\n    \n    function buildHolePrepCard(top) {\n      var metrics = top.metrics || {};\n      var tone = metrics.blindFitRisk === \"safe\" ? \"good\" : metrics.blindFitRisk === \"tight\" ? \"limited\" : metrics.blindFitRisk === \"critical\" ? \"high\" : \"default\";\n      var badge = metrics.blindFitRisk === \"safe\" ? \"Stable\" : metrics.blindFitRisk === \"tight\" ? \"Tight\" : metrics.blindFitRisk === \"critical\" ? \"Critical\" : \"Review\";\n      return {\n        title: \"Blind-hole fit\",\n        tone: tone,\n        badge: badge,\n        value: metrics.blindFitRisk === \"safe\"\n          ? \"Lead length and stated reserve leave a stable run-in window above the bore bottom.\"\n          : metrics.blindFitRisk === \"tight\"\n            ? \"The run-in window is workable, but the reserve stays tight near the bore bottom.\"\n            : metrics.blindFitRisk === \"critical\"\n              ? \"The available reserve looks too short for a comfortable blind-hole forming window.\"\n              : \"Bottom reserve is not confirmed yet, so blind-hole fit stays less certain.\",\n        note: metrics.bottomReserveMarginMm != null ? \"Estimated reserve margin versus lead: \" + formatDisplayNumber(metrics.bottomReserveMarginMm, 2) + \" mm.\" : \"Confirm the real reserve or total hole depth if bottom-contact risk matters.\",\n        items: dedupeTextItems([\n          metrics.requiredFullThreadLengthMm != null ? \"Full thread length: \" + formatDisplayNumber(metrics.requiredFullThreadLengthMm, 2) + \" mm.\" : null,\n          metrics.tapChamferLengthMm != null ? \"Lead length: \" + formatDisplayNumber(metrics.tapChamferLengthMm, 2) + \" mm.\" : null,\n          metrics.actualBottomReserveMm != null ? \"Stated reserve: \" + formatDisplayNumber(metrics.actualBottomReserveMm, 2) + \" mm.\" : null,\n          metrics.requiredDepthRatio != null ? \"Depth ratio: \" + formatDisplayNumber(metrics.requiredDepthRatio, 2) + \" xD.\" : null,\n        ]).slice(0, 4),\n      };\n    }\n    \n    function buildStoryData(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var why = dedupeTextItems([\n        metrics.requestedThreadIdentity ? \"Thread identity matched to \" + metrics.requestedThreadIdentity + \".\" : null,\n        metrics.formabilityLabel ? metrics.formabilityLabel + \".\" : null,\n        metrics.blindFitRisk === \"safe\" ? \"Lead length and stated reserve stay in a stable blind-hole window.\" : null,\n        metrics.blindFitRisk === \"tight\" ? \"Lead length still fits, but the reserve to the bore bottom stays tight.\" : null,\n        metrics.predrillRecommendedMm != null ? \"Core-hole guidance aligns to \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm for the selected forming tap.\" : null,\n        metrics.requiredDepthRatio != null ? \"Required engagement sits at \" + formatDisplayNumber(metrics.requiredDepthRatio, 2) + \"xD, so the recommendation balances length reserve and forming load.\" : null,\n      ]);\n      var how = dedupeTextItems([\n        \"Start inside the suggested vc band and keep the feed locked exactly to thread pitch through reversal.\",\n        metrics.lubricationAdequacy === \"good\" ? \"Keep lubrication stable and generous, because blind-hole thread forming depends on a continuous lubricating film.\" : \"Do not stretch the output until lubrication quality is fully under control.\",\n        metrics.predrillRecommendedMm != null ? \"Qualify the first holes against the recommended core-hole diameter before increasing output.\" : null,\n        metrics.blindFitRisk !== \"safe\" ? \"Check the last full threads and reversal behavior on the first parts because reserve to the bore bottom is one of the main release checks.\" : \"Confirm calm reversal near the bore bottom before raising output.\",\n      ]);\n      var watch = dedupeTextItems([\n        metrics.underOverFormRisk === \"overforming-risk\" ? \"A small core hole will raise torque quickly and can over-form the profile in the blind hole.\" : null,\n        metrics.underOverFormRisk === \"underformed-risk\" ? \"A large core hole can leave the formed profile weak or gauge-loose.\" : null,\n        metrics.blindFitRisk === \"critical\" ? \"Reserve to the bore bottom looks too short for a comfortable blind-hole forming release.\" : null,\n        metrics.lubricationAdequacy === \"poor\" ? \"Weak lubrication raises cold-welding, smearing and torque risk in blind-hole thread forming.\" : null,\n        metrics.pitchFormingLimitWarning ? \"This pitch sits above the usual practical forming range and should be treated conservatively.\" : null,\n        materialProfile && materialProfile.typicalFailure ? \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure).toLowerCase() + \".\" : null,\n      ]);\n      return { why: why, how: how, watch: watch };\n    }\n    \n    function buildStoryPanels(ctx, top, riskItems, storyData) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      return {\n        why: {\n          tone: \"good\",\n          eyebrow: \"Technical fit\",\n          title: \"Why it fits\",\n          badge: \"Formability: \" + titleCase(metrics.formabilitySuitabilityClass || \"review\"),\n          highlight: metrics.formabilitySuitabilityClass === \"good\" ? \"Material, blind-hole lead fit and core-hole window support a stable blind-hole thread-forming release.\" : \"This case can still be formed, but the material and blind-hole reserve window need tighter control than a standard green case.\",\n          summary: \"Blind-hole thread forming is chipless, so suitability is driven more by material formability, core-hole accuracy, lead length and reserve to the bore bottom than by chip evacuation.\",\n          facts: dedupeTextItems([\n            metrics.requestedThreadIdentity ? metrics.requestedThreadIdentity : null,\n            metrics.predrillRecommendedMm != null ? \"Predrill \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm\" : null,\n            metrics.actualBottomReserveMm != null ? \"Reserve \" + formatDisplayNumber(metrics.actualBottomReserveMm, 2) + \" mm\" : null,\n          ]),\n          items: storyData.why.slice(0, 3),\n        },\n        how: {\n          tone: \"default\",\n          eyebrow: \"Start strategy\",\n          title: \"How to start\",\n          badge: \"Feed = pitch\",\n          highlight: \"Keep the feed synchronized to pitch and do not try to compensate torque by forcing the feed upward near reversal.\",\n          summary: \"Blind-hole thread forming likes stable lubrication, correct core-hole size and a calm first-part qualification more than aggressive first-shot productivity.\",\n          facts: dedupeTextItems([\n            metrics.recipeVcTyp != null ? \"vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min\" : null,\n            metrics.rpmTyp != null ? \"n \" + formatDisplayNumber(metrics.rpmTyp, 0) + \" rpm\" : null,\n            metrics.feedTypMmMin != null ? \"vf \" + formatDisplayNumber(metrics.feedTypMmMin, 0) + \" mm/min\" : null,\n          ]),\n          items: storyData.how.slice(0, 3),\n        },\n        watch: {\n          tone: riskItems.length > 1 || metrics.formingSeverity === \"high\" ? \"watch\" : \"default\",\n          eyebrow: \"Critical signals\",\n          title: \"Watch-outs\",\n          badge: \"Risk: \" + titleCase(metrics.formingSeverity || \"medium\"),\n          highlight: metrics.blindFitRisk === \"critical\" || metrics.blindFitRisk === \"tight\"\n            ? \"Reserve to the bore bottom is the main release limiter in this setup.\"\n            : metrics.underOverFormRisk === \"overforming-risk\" || metrics.underOverFormRisk === \"underformed-risk\"\n              ? \"Core-hole accuracy is the main release limiter in this setup.\"\n              : metrics.lubricationAdequacy === \"poor\"\n                ? \"Lubrication quality is the main release limiter in this setup.\"\n                : \"Formability, lubrication and reversal behavior still decide whether the case stays stable in series.\",\n          summary: materialProfile && materialProfile.avoid ? ensureSentence(materialProfile.avoid) : \"Qualify the first formed threads conservatively before increasing output.\",\n          facts: dedupeTextItems([\n            metrics.blindFitRisk ? \"Blind fit: \" + titleCase(metrics.blindFitRisk) : null,\n            metrics.lubricationAdequacy ? \"Lubrication: \" + titleCase(metrics.lubricationAdequacy) : null,\n            materialProfile && materialProfile.typicalFailure ? \"Typical failure: \" + cleanShortText(materialProfile.typicalFailure) : null,\n          ]),\n          items: storyData.watch.slice(0, 3),\n        },\n      };\n    }\n    \n    function buildRefineData(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n      if (metrics.predrillActualMm == null && getAnswer(ctx, \"core_hole_status\") !== \"actual_known\") items.push({ questionId: \"actual_predrill_diameter_mm\", label: \"Confirm core-hole diameter\" });\n      if (metrics.actualBottomReserveMm == null && !getAnswer(ctx, \"total_hole_depth_mm\")) items.push({ questionId: \"actual_bottom_reserve_mm\", label: \"Confirm bottom reserve\" });\n      if (!getAnswer(ctx, \"holder_type\")) items.push({ questionId: \"holder_type\", label: \"Confirm holder type\" });\n      if (!getAnswer(ctx, \"quality_sensitivity\")) items.push({ questionId: \"quality_sensitivity\", label: \"Confirm quality target\" });\n      if (!getAnswer(ctx, \"thread_tolerance\")) items.push({ questionId: \"thread_tolerance\", label: \"Confirm thread tolerance\" });\n      return {\n        visible: items.length > 0 && (top.score.confidence < 0.9 || top.score.recipeConfidence !== \"exact\"),\n        title: \"Improve recommendation confidence\",\n        description: \"Confirm one missing setup detail to tighten the start values and reduce estimation.\",\n        items: items.slice(0, 2),\n      };\n    }\n    \n    function buildDetailPanels(top, alternativeItems) {\n      var metrics = top.metrics || {};\n      var panels = [];\n      panels.push({\n        eyebrow: \"Technical basis\",\n        title: \"Why this starting band is credible\",\n        summary: top.score.recipeConfidence === \"exact\" ? \"The start values come from a matching blind-hole forming row and are then translated into rpm and feed using the requested thread pitch.\" : \"The start values use the nearest valid blind-hole forming row and stay anchored to the selected thread geometry, pitch and blind-hole lead fit.\",\n        facts: dedupeTextItems([\n          metrics.formabilityLabel || null,\n          metrics.predrillRecommendedMm != null ? \"Core hole \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm\" : null,\n          metrics.tapChamferLengthMm != null ? \"Lead length \" + formatDisplayNumber(metrics.tapChamferLengthMm, 2) + \" mm\" : null,\n          metrics.recipeVcTyp != null ? \"vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min\" : null,\n        ]),\n        items: dedupeTextItems([\n          metrics.lubricationAdequacy === \"good\" ? \"Lubrication is strong enough for standard blind-hole thread forming.\" : \"Lubrication remains one of the main qualification points in this case.\",\n          metrics.blindFitRisk === \"safe\" ? \"The selected lead length fits the stated reserve to the bore bottom well.\" : null,\n          metrics.blindFitRisk === \"tight\" ? \"The selected lead length still fits, but the reserve to the bore bottom stays tight.\" : null,\n        ]),\n      });\n      panels.push({\n        eyebrow: \"Release checks\",\n        title: \"What to verify before full release\",\n        summary: \"Only keep increasing output once the first parts confirm torque, gauge behavior and that the tool reverses clear of the bore bottom.\",\n        facts: dedupeTextItems([\n          metrics.underOverFormRisk && metrics.underOverFormRisk !== \"unknown\" ? \"Predrill risk: \" + titleCase(metrics.underOverFormRisk) : null,\n          metrics.blindFitRisk ? \"Blind fit: \" + titleCase(metrics.blindFitRisk) : null,\n          metrics.formingSeverity ? \"Severity: \" + titleCase(metrics.formingSeverity) : null,\n        ]),\n        items: dedupeTextItems([\n          \"Check GO/NO-GO or equivalent thread acceptance on the first parts.\",\n          metrics.underOverFormRisk === \"overforming-risk\" ? \"Revisit the core-hole diameter before chasing torque or tool changes.\" : null,\n          metrics.blindFitRisk === \"tight\" || metrics.blindFitRisk === \"critical\" ? \"Confirm the reserve to the bore bottom against the tool lead before increasing output.\" : null,\n          metrics.pitchFormingLimitWarning ? \"Treat this pitch as a specialist case and qualify conservatively before release.\" : null,\n        ]),\n      });\n      panels.push({\n        type: \"alternatives\",\n        eyebrow: \"Alternatives\",\n        title: \"Alternatives worth checking\",\n        summary: \"If material formability, lubrication or bottom reserve stay marginal, change process before forcing the same form tap deeper into a blind-hole red zone.\",\n        items: dedupeTextItems([\n          top.metrics && top.metrics.alternativePrimary === \"tapping_blind\" ? JSON.stringify({ badge: \"Process fallback\", label: \"Cut tap blind\", reason: \"Use cut tapping first when material formability, lubrication or bottom reserve stay marginal for blind-hole forming.\" }) : null,\n          top.metrics && top.metrics.alternativePrimary === \"thread_mill\" ? JSON.stringify({ badge: \"Process fallback\", label: \"Thread milling\", reason: \"Use thread milling when quality is critical and the blind-hole reserve window stays too narrow.\" }) : null,\n          top.metrics && top.metrics.alternativeProcessFlag && top.metrics.alternativePrimary !== \"thread_mill\" ? JSON.stringify({ badge: \"Escalation path\", label: \"Thread milling\", reason: \"Escalate to thread milling when the part value or quality risk makes blind-hole forming too narrow.\" }) : null,\n        ].concat((alternativeItems || []).map(function mapItem(item) {\n          return JSON.stringify({ badge: \"Tool option\", label: item.label, reason: item.reason });\n        }))).map(function parseItem(text) {\n          try {\n            return JSON.parse(text);\n          } catch (error) {\n            return null;\n          }\n        }).filter(Boolean),\n      });\n      return panels;\n    }\n    \n    function buildSetupNotes(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      return [\n        { area: \"forming\", message: \"spanless blind-hole process with \" + (metrics.tapChamferType || \"bottoming\") + \" lead and \" + (metrics.formabilityLabel || \"material review\") },\n        { area: \"core_hole\", message: \"recommended predrill \" + (metrics.predrillRecommendedMm != null ? formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm\" : \"not available\") + \", risk \" + titleCase(metrics.underOverFormRisk || \"unknown\") },\n        { area: \"blind_fit\", message: \"lead length \" + (metrics.tapChamferLengthMm != null ? formatDisplayNumber(metrics.tapChamferLengthMm, 2) + \" mm\" : \"not available\") + \", reserve \" + (metrics.actualBottomReserveMm != null ? formatDisplayNumber(metrics.actualBottomReserveMm, 2) + \" mm\" : \"not confirmed\") + \", fit \" + titleCase(metrics.blindFitRisk || \"review\") },\n        { area: \"lubrication\", message: \"lubrication \" + titleCase(metrics.lubricationAdequacy || \"review\") + \" with \" + (metrics.coolantMode || \"unspecified mode\") },\n        { area: \"material\", message: materialProfile ? materialProfile.code + \" - \" + materialProfile.label + \", typical failure \" + cleanShortText(materialProfile.typicalFailure || \"not stated\") : \"material profile not available\" },\n        { area: \"troubleshooting\", message: buildTroubleshootingHandles(ctx, top).length > 0 ? \"focused troubleshooting loaded for \" + buildTroubleshootingHandles(ctx, top).length + \" likely issue paths\" : \"no focused troubleshooting needed from current inputs\" },\n      ];\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var alternativeItems;\n      var riskItems;\n      var machineChecks;\n      var storyData;\n      var storyPanels;\n      var troubleshooting;\n      var heroBlock;\n      var threadBlock;\n      var kpiBlock;\n      var toleranceBlock;\n      var recipeBlock;\n      var riskBlock;\n      var machineBlock;\n      var setupBlock;\n      var alternativesBlock;\n      var commerceBlock;\n    \n      if (!top || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"forming_blind\",\n          outcome: \"no_match\",\n          summary: \"No safe blind-hole thread-forming recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current setup is incomplete or incompatible for a safe blind-hole thread-forming recommendation.\"),\n            noMatchGuidance({\n              message: \"Check thread designation, material formability, synchronized tapping mode, lubrication, core-hole diameter and reserve to the bore bottom. If the forming window stays narrow, move to cut tapping first and thread milling only as the higher-escalation fallback.\",\n              steps: [\n                \"Confirm the exact thread designation and tolerance.\",\n                \"Check whether the material is really formable enough for blind-hole thread forming.\",\n                \"Verify a synchronized tapping cycle and adequate lubrication.\",\n                \"Provide the actual or target core-hole diameter.\",\n                \"Confirm reserve to the bore bottom or the total hole depth.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust thread setup\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      alternativeItems = buildAlternativeItems(scored);\n      riskItems = buildRiskItems(ctx, top);\n      machineChecks = buildMachineChecks(ctx, top);\n      storyData = buildStoryData(ctx, top);\n      storyPanels = buildStoryPanels(ctx, top, riskItems, storyData);\n      troubleshooting = buildTroubleshootingCards(ctx, top);\n    \n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best fit for \" + (metrics.requestedThreadIdentity || \"the requested thread\") + \" - Blind-Hole Thread Forming in \" + (getMaterialLabel(ctx) || \"the selected material\") + \".\",\n        headerPills: [\n          { tone: \"good\", text: \"Best fit\" },\n          { tone: top.score.confidence >= 0.88 ? \"good\" : top.score.confidence >= 0.75 ? \"default\" : \"watch\", text: \"Confidence: \" + (top.score.confidence >= 0.88 ? \"High\" : top.score.confidence >= 0.75 ? \"Medium\" : \"Review\") },\n          { tone: metrics.formabilitySuitabilityClass === \"good\" ? \"good\" : metrics.formabilitySuitabilityClass === \"conditional\" ? \"default\" : \"watch\", text: \"Formability: \" + titleCase(metrics.formabilitySuitabilityClass || \"review\") },\n          { tone: metrics.formingSeverity === \"high\" ? \"watch\" : \"default\", text: \"Risk: \" + titleCase(metrics.formingSeverity || \"medium\") },\n        ],\n      };\n    \n      threadBlock = threadIdentity({\n        standard: metrics.requestedThreadForm,\n        size: metrics.requestedThreadSize,\n        pitch: metrics.requestedPitchMm,\n        tolerance: metrics.requestedTolerance,\n        blindThrough: \"blind\",\n      });\n      kpiBlock = fitKpis([\n        { key: \"thread_identity\", label: \"Thread identity\", value: (top.score.parts.threadIdentity || 0).toFixed(2), status: (top.score.parts.threadIdentity || 0) >= 2.5 ? \"good\" : \"ok\" },\n        { key: \"formability\", label: \"Formability\", value: (top.score.parts.formability || 0).toFixed(2), status: metrics.formabilitySuitabilityClass === \"good\" ? \"good\" : \"ok\" },\n        { key: \"blind_fit\", label: \"Blind fit\", value: (top.score.parts.blindFit || 0).toFixed(2), status: metrics.blindFitRisk === \"safe\" ? \"good\" : \"ok\" },\n        { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.8 ? \"good\" : \"ok\" },\n      ]);\n      toleranceBlock = toleranceNotes([\n        \"Requested tolerance: \" + String(metrics.requestedTolerance || metrics.candidateTolerance || \"not specified\"),\n        \"Candidate tolerance: \" + String(metrics.candidateTolerance || \"not specified\"),\n      ]);\n      recipeBlock = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: buildRecipeValues(top),\n      });\n      recipeBlock.data.presentation = {\n        title: \"Start here\",\n        description: \"Use these as the first safe forming values. Keep feed synchronized to thread pitch through reversal and qualify the first holes before increasing output.\",\n        rowBackedValues: buildRowBackedValues(top),\n        machineValues: buildMachineValues(top),\n        trustCard: buildRecipeTrustCard(top),\n        holePrepCard: buildHolePrepCard(top),\n      };\n      riskBlock = riskNotes(riskItems);\n      machineBlock = machineFeasibility(machineChecks);\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine & lubrication\",\n          tone: metrics.lubricationAdequacy === \"good\" && metrics.machineMode && metrics.machineMode.indexOf(\"Rigid\") >= 0 ? \"good\" : metrics.lubricationAdequacy === \"poor\" ? \"high\" : \"limited\",\n          badge: metrics.lubricationAdequacy === \"good\" ? \"Checked\" : metrics.lubricationAdequacy === \"poor\" ? \"Risk\" : \"Review\",\n          value: metrics.machineMode + \" with \" + (metrics.coolantMode || \"unspecified lubrication\") + \".\",\n          note: \"Blind-hole thread forming cares more about synchronized feed, lubrication quality and reserve to the bore bottom than about chip evacuation.\",\n          items: dedupeTextItems(machineChecks.map(function mapCheck(item) {\n            return item.label + \": \" + item.note;\n          })),\n        },\n      };\n      setupBlock = setupNotes(buildSetupNotes(ctx, top));\n      setupBlock.data.presentation = {\n        stories: storyData,\n        storyPanels: storyPanels,\n        refine: buildRefineData(ctx, top),\n        detailPanels: buildDetailPanels(top, alternativeItems),\n        troubleshooting: troubleshooting,\n      };\n      alternativesBlock = alternatives(alternativeItems);\n      commerceBlock = commerceCta({\n        productUrl: candidate.catalog.url,\n        available: candidate.commerce.available,\n        priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n        ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n      });\n      commerceBlock.data.presentation = {\n        eyebrow: \"Order this tool\",\n        availabilityLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Ready to review\",\n        availabilityNote: candidate.ids.sku || \"\",\n      };\n    \n      return createResultViewModel({\n        processId: \"forming_blind\",\n        outcome: top.score.total >= 5.1 ? \"match\" : \"limited_match\",\n        summary: \"Best blind-hole thread-forming match based on thread identity, material formability, bottom reserve, core-hole logic, lubrication and process robustness.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          threadBlock,\n          kpiBlock,\n          toleranceBlock,\n          recipeBlock,\n          riskBlock,\n          machineBlock,\n          setupBlock,\n          alternativesBlock,\n          commerceBlock,\n        ],\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust thread setup\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/forming-blind/questions.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { toNullableDraftNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getQuestionDefinition } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function cloneQuestion(questionId, overrides) {\n      return createQuestionDef(Object.assign({}, getQuestionDefinition(questionId), overrides || {}));\n    }\n    \n    function createTokenQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: config.type || \"chips\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: config.options || [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableString(value);\n        },\n        validate: config.validate || null,\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function createNumberQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: \"number\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: config.unit || null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableDraftNumber(value);\n        },\n        validate: config.validate || function validate(value) {\n          if (value == null) return [];\n          return value > 0\n            ? []\n            : [{ field: config.id, message: \"Please enter a positive value.\", severity: \"error\", code: \"positive_required\" }];\n        },\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"half\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function createTextQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: \"text\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableString(value);\n        },\n        validate: config.validate || null,\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function getThreadStandardFromAnswers(ctx) {\n      var explicit = toNullableString(ctx && ctx.answers && ctx.answers.thread_standard_choice);\n      if (explicit) return explicit.toUpperCase();\n      explicit = toNullableString(ctx && ctx.derived && ctx.derived.thread_standard);\n      return explicit ? explicit.toUpperCase() : null;\n    }\n    \n    function looksLikePipeThread(ctx) {\n      var explicitStandard = getThreadStandardFromAnswers(ctx);\n      var designation = toNullableString(ctx && ctx.answers && ctx.answers.thread_designation_override);\n    \n      if (explicitStandard) {\n        return explicitStandard === \"G\" || explicitStandard === \"NPT\" || explicitStandard === \"R\";\n      }\n      if (!designation) return false;\n      designation = designation.toUpperCase();\n      return designation.indexOf(\"NPT\") >= 0 || designation.indexOf(\"G\") === 0 || designation.indexOf(\"R\") === 0;\n    }\n    \n    function getQuestions() {\n      return [\n        createTokenQuestion({\n          id: \"thread_standard_choice\",\n          label: \"Which thread type do you need?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: the thread type defines the standard family, the automatic pitch rule and the exact form-tap program that can fit.\",\n          options: [\n            { value: \"M\", label: \"M coarse\" },\n            { value: \"MF\", label: \"MF fine\" },\n            { value: \"UNC\", label: \"UNC\" },\n            { value: \"UNF\", label: \"UNF\" },\n            { value: \"G\", label: \"G / BSPP\" },\n            { value: \"NPT\", label: \"NPT\" },\n          ],\n        }),\n        createTextQuestion({\n          id: \"thread_nominal_size\",\n          label: \"What is the nominal thread size?\",\n          placeholder: \"Metric example: 10 | Inch example: 1/4\",\n          group: \"core\",\n          required: true,\n          viewHint: { width: \"half\", emphasis: \"high\" },\n          helpText: \"Why it matters: the nominal size is enough to derive the standard pitch automatically for the supported thread families, so the operator does not need to type a full designation.\",\n          validate: function validate(value) {\n            var text = toNullableString(value);\n            if (!text) {\n              return [{ field: \"thread_nominal_size\", message: \"Enter the nominal thread size.\", severity: \"error\", code: \"required\" }];\n            }\n            return [];\n          },\n        }),\n        createTokenQuestion({\n          id: \"material_formability_class\",\n          label: \"How formable is the workpiece material in practice?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: Step 1 already fixed the ISO subgroup. This extra input only captures the forming-specific gate: whether the material is really ductile enough for blind-hole thread forming, or whether strength, hardness or cast structure make cut tapping safer.\",\n          options: [\n            { value: \"good_formable\", label: \"Good / standard formability\" },\n            { value: \"higher_strength\", label: \"Higher-strength\" },\n            { value: \"hard_hardened\", label: \"Hard / hardened\" },\n            { value: \"cast_iron\", label: \"Cast-iron like\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        cloneQuestion(\"thread_length_mm\", {\n          label: \"Required full thread length\",\n          helpText: \"Why it matters: the required full thread length drives usable length, APMX reserve, forming load and how little room remains above the bore bottom.\",\n          group: \"core\",\n          required: true,\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        createTokenQuestion({\n          id: \"bottom_reserve_class\",\n          label: \"How much reserve remains to the bore bottom?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: this is the key blind-hole question. The form tap needs enough room for the lead to run in fully without sacrificing the last full thread or touching the bore bottom.\",\n          options: [\n            { value: \"generous\", label: \"Enough reserve\" },\n            { value: \"short\", label: \"Short reserve\" },\n            { value: \"minimal\", label: \"Very short / near bottom\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"sync_tapping_capability\",\n          label: \"Which tapping mode is available on the machine?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: thread forming carries higher torque than cut tapping and needs a synchronized feed-to-pitch relationship right through reversal near the bore bottom.\",\n          options: [\n            { value: \"rigid\", label: \"Rigid tapping\" },\n            { value: \"synchro_chuck\", label: \"Synchro chuck\" },\n            { value: \"unknown\", label: \"Unsure\" },\n            { value: \"no\", label: \"No sync mode\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"coolant_lubrication_mode\",\n          label: \"Which lubrication or cooling is available?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: lubrication is one of the dominant blind-hole forming levers. It changes torque, cold-welding risk and final gauge behavior far more strongly than in many cut-tapping cases.\",\n          options: [\n            { value: \"through_emulsion\", label: \"Through coolant / emulsion\" },\n            { value: \"external_emulsion\", label: \"External emulsion\" },\n            { value: \"oil\", label: \"Cutting oil\" },\n            { value: \"mql\", label: \"MQL / mist\" },\n            { value: \"dry\", label: \"Dry\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"core_hole_status\",\n          label: \"What is the core-hole status?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: core-hole diameter is more critical in thread forming than in cut tapping. Too small drives over-forming and torque; too large can weaken thread engagement and gauge fit.\",\n          options: [\n            { value: \"actual_known\", label: \"Actual core-hole diameter is known\" },\n            { value: \"fixed_unknown\", label: \"Prepared, but actual size is unknown\" },\n            { value: \"recommend\", label: \"Need a recommendation\" },\n            { value: \"missing\", label: \"No core hole prepared yet\" },\n          ],\n        }),\n        cloneQuestion(\"thread_tolerance\", {\n          label: \"Target tolerance override\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: false,\n          helpText: \"Why it matters: if the standard default tolerance is not enough, this tightens the form-tap choice and the final fit-class check.\",\n          placeholder: \"e.g. 6H, 6HX or 2B\",\n          viewHint: { width: \"half\", emphasis: \"normal\" },\n        }),\n        createTextQuestion({\n          id: \"thread_designation_override\",\n          label: \"Custom thread designation override\",\n          placeholder: \"e.g. M10x1.5-6H or 1/4-20UNC-2B\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: use this only when the automatic type + size route does not cover the requested thread. The override wins over the simplified entry path.\",\n        }),\n        createTokenQuestion({\n          id: \"priority\",\n          label: \"What matters most?\",\n          group: \"advanced\",\n          required: false,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: when several blind-hole form taps are technically valid, this biases the ranking toward process security, quality, tool life or productivity.\",\n          options: [\n            { value: \"process_security\", label: \"Process security\" },\n            { value: \"thread_quality\", label: \"Thread quality\" },\n            { value: \"tool_life\", label: \"Tool life\" },\n            { value: \"productivity\", label: \"Productivity\" },\n          ],\n        }),\n        createNumberQuestion({\n          id: \"actual_predrill_diameter_mm\",\n          label: \"Actual core-hole diameter\",\n          unit: \"mm\",\n          group: \"core\",\n          required: true,\n          expertOnly: false,\n          visibleWhen: function visibleWhen(ctx) {\n            return toNullableString(ctx && ctx.answers && ctx.answers.core_hole_status) === \"actual_known\";\n          },\n          helpText: \"Why it matters: when the real core hole is known, the module can judge over-forming or under-forming risk much more reliably.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        createNumberQuestion({\n          id: \"actual_bottom_reserve_mm\",\n          label: \"Measured reserve to the bore bottom\",\n          unit: \"mm\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          helpText: \"Why it matters: when the real reserve is known, the module can compare it directly against the forming lead and estimate bottom-contact risk much more reliably.\",\n          viewHint: { width: \"half\", emphasis: \"normal\" },\n        }),\n        createNumberQuestion({\n          id: \"total_hole_depth_mm\",\n          label: \"Total hole depth\",\n          unit: \"mm\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          helpText: \"Why it matters: if total hole depth is known, the module can derive the remaining blind-hole reserve from the required full thread length.\",\n          viewHint: { width: \"half\", emphasis: \"normal\" },\n        }),\n        createTokenQuestion({\n          id: \"material_strength_class\",\n          label: \"Any extra strength or hardness clue?\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: this only refines the forming gate when the ISO subgroup is still too broad. It is not a replacement for the Step 1 material selection.\",\n          options: [\n            { value: \"standard\", label: \"No extra concern\" },\n            { value: \"higher_strength\", label: \"Higher strength\" },\n            { value: \"hard_hardened\", label: \"Hard / hardened\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"holder_type\",\n          label: \"Which holder is used?\",\n          group: \"machine\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: holder behavior changes how well the setup tolerates small pitch errors and how much torque shock reaches the tool during blind-hole forming.\",\n          options: [\n            { value: \"rigid_holder\", label: \"Rigid holder\" },\n            { value: \"synchro_chuck\", label: \"Synchro chuck\" },\n            { value: \"length_comp\", label: \"Length compensation\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"entry_protection\",\n          label: \"Is there any controlled entry protection?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: a lead-in chamfer or counterbore can stabilize the entry and reduce local bulging or rough lead formation before the form lands in the full thread zone.\",\n          options: [\n            { value: \"none\", label: \"None\" },\n            { value: \"entry_chamfer\", label: \"Entry chamfer\" },\n            { value: \"counterbore\", label: \"Counterbore / lead-in\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"quality_sensitivity\",\n          label: \"Is the thread quality target especially critical?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: gauge-critical or function-critical formed threads justify a more conservative recommendation and tighter release notes.\",\n          options: [\n            { value: \"general\", label: \"General quality\" },\n            { value: \"gauge_critical\", label: \"Gauge critical\" },\n            { value: \"functional_critical\", label: \"Function critical\" },\n            { value: \"surface_critical\", label: \"Surface or sealing critical\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"problem_history\",\n          label: \"What has gone wrong before, if anything?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: previous cold welding, high torque, tight gauge or bottom-contact issues are strong indicators for a safer blind-hole forming recommendation.\",\n          options: [\n            { value: \"none\", label: \"No recurring issue\" },\n            { value: \"cold_welding\", label: \"Cold welding / smearing\" },\n            { value: \"high_torque\", label: \"High torque\" },\n            { value: \"gauge_tight\", label: \"Thread too tight\" },\n            { value: \"gauge_loose\", label: \"Thread too loose\" },\n            { value: \"breakage\", label: \"Tool breakage\" },\n            { value: \"bottom_contact\", label: \"Bottom contact\" },\n          ],\n        }),\n        cloneQuestion(\"sealing_relevant\", {\n          label: \"Is sealing or pipe-thread function relevant?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          visibleWhen: function visibleWhen(ctx) {\n            return looksLikePipeThread(ctx);\n          },\n          helpText: \"Why it matters: sealing function changes how strictly the thread standard and tolerance need to be respected, especially for pipe-thread styles.\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n        }),\n      ];\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/forming-blind/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, createRecipe, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getAnswer, prefilterByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var AUTO_THREAD_LIBRARY = Object.freeze({\n      M: Object.freeze({ \"3\": \"0.5\", \"4\": \"0.7\", \"5\": \"0.8\", \"6\": \"1\", \"8\": \"1.25\", \"10\": \"1.5\", \"12\": \"1.75\", \"14\": \"2\", \"16\": \"2\", \"18\": \"2.5\", \"20\": \"2.5\", \"24\": \"3\" }),\n      MF: Object.freeze({ \"6\": \"0.75\", \"8\": \"1\", \"10\": \"1.25\", \"12\": \"1.5\", \"14\": \"1.5\", \"16\": \"1.5\", \"18\": \"1.5\", \"20\": \"1.5\" }),\n      UNC: Object.freeze({ \"1/4\": \"20\", \"5/16\": \"18\", \"3/8\": \"16\", \"1/2\": \"13\" }),\n      UNF: Object.freeze({ \"1/4\": \"28\", \"5/16\": \"24\", \"3/8\": \"24\", \"1/2\": \"20\" }),\n      G: Object.freeze({ \"1/8\": \"28\", \"1/4\": \"19\", \"3/8\": \"19\", \"1/2\": \"14\" }),\n      NPT: Object.freeze({ \"1/8\": \"27\", \"1/4\": \"18\", \"3/8\": \"18\", \"1/2\": \"14\" }),\n    });\n    \n    function clamp01(value) {\n      if (!Number.isFinite(value)) return 0;\n      return value <= 0 ? 0 : value >= 1 ? 1 : value;\n    }\n    \n    function roundValue(value, digits) {\n      var factor = Math.pow(10, digits == null ? 2 : digits);\n      return value == null || !Number.isFinite(value) ? null : Math.round(value * factor) / factor;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function normalizeTolerance(value) {\n      var text = toNullableString(value);\n      return text ? text.toUpperCase().replace(/\\s+/g, \"\") : null;\n    }\n    \n    function normalizeThreadForm(value) {\n      var text = toNullableString(value);\n      if (!text) return null;\n      text = text.toUpperCase();\n      if (text.indexOf(\"UNF\") >= 0) return \"UNF\";\n      if (text.indexOf(\"UNC\") >= 0) return \"UNC\";\n      if (text.indexOf(\"NPT\") >= 0) return \"NPT\";\n      if (text.indexOf(\"MF\") === 0) return \"MF\";\n      if (text.indexOf(\"M\") === 0) return \"M\";\n      if (text.indexOf(\"G\") === 0) return \"G\";\n      if (text.indexOf(\"R\") === 0) return \"R\";\n      return text;\n    }\n    \n    function normalizeNominalSize(threadStandard, nominalSize) {\n      var text = toNullableString(nominalSize);\n      if (!text) return null;\n      text = text.replace(/\\s+/g, \"\");\n      return threadStandard === \"UNC\" || threadStandard === \"UNF\" || threadStandard === \"G\" || threadStandard === \"NPT\"\n        ? text\n        : text.replace(/^M/i, \"\");\n    }\n    \n    function parseFraction(text) {\n      var token = toNullableString(text);\n      var parts;\n      if (!token) return null;\n      if (token.indexOf(\"-\") >= 0) {\n        parts = token.split(\"-\");\n        return parseFraction(parts[0]) + parseFraction(parts[1]);\n      }\n      if (token.indexOf(\"/\") >= 0) {\n        parts = token.split(\"/\");\n        return Number(parts[0]) / Number(parts[1]);\n      }\n      return toNullableNumber(token);\n    }\n    \n    function buildAutoDesignation(threadStandard, nominalSize, tolerance) {\n      var standard = normalizeThreadForm(threadStandard);\n      var sizeKey = normalizeNominalSize(standard, nominalSize);\n      var pitchToken = standard && sizeKey && AUTO_THREAD_LIBRARY[standard] ? AUTO_THREAD_LIBRARY[standard][sizeKey] : null;\n      if (!pitchToken) return { designation: null, supported: false, standard: standard, nominalSize: sizeKey };\n      if (standard === \"M\" || standard === \"MF\") {\n        return { designation: standard + sizeKey + \"x\" + pitchToken + (tolerance ? \"-\" + tolerance : \"\"), supported: true, standard: standard, nominalSize: sizeKey, pitchToken: pitchToken };\n      }\n      return { designation: sizeKey + \"-\" + pitchToken + standard + (tolerance ? \"-\" + tolerance : \"\"), supported: true, standard: standard, nominalSize: sizeKey, pitchToken: pitchToken };\n    }\n    \n    function buildManualDesignation(threadStandard, nominalSize) {\n      var standard = normalizeThreadForm(threadStandard);\n      var text = toNullableString(nominalSize);\n      var compact;\n      if (!standard || !text) return null;\n      compact = text.trim().toUpperCase().replace(/\\s+/g, \"\");\n      if (!compact) return null;\n      if (/^[A-Z]/.test(compact)) return compact;\n      if (standard === \"M\" || standard === \"MF\") return standard + compact;\n      if (standard === \"G\" || standard === \"R\") return standard + compact;\n      if (standard === \"UNC\" || standard === \"UNF\" || standard === \"NPT\") {\n        return compact.indexOf(\"-\") >= 0 ? compact + standard : compact;\n      }\n      return compact;\n    }\n    \n    function parseThreadIdentity(designation, explicitTolerance, explicitForm) {\n      var text = toNullableString(designation);\n      var tolerance = normalizeTolerance(explicitTolerance);\n      var form = normalizeThreadForm(explicitForm);\n      var compact;\n      var match;\n      if (!text) return { standard: null, size: null, pitch: null, pitchMm: null, tolerance: tolerance, pipeFlag: false, nominalDiameterMm: null, canonicalLabel: null, valid: false };\n      compact = text.replace(/\\s+/g, \"\").toUpperCase();\n      match = compact.match(/^([A-Z]+)([0-9]+(?:[.,][0-9]+)?)(?:X([0-9]+(?:[.,][0-9]+)?))?(?:-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = form || normalizeThreadForm(match[1]);\n        tolerance = tolerance || normalizeTolerance(match[4]);\n        return {\n          standard: form,\n          size: form + match[2] + (match[3] ? \"x\" + match[3].replace(\",\", \".\") : \"\"),\n          pitch: match[3] ? match[3].replace(\",\", \".\") : null,\n          pitchMm: match[3] ? toNullableNumber(match[3]) : null,\n          tolerance: tolerance,\n          pipeFlag: form === \"G\" || form === \"NPT\" || form === \"R\",\n          nominalDiameterMm: toNullableNumber(match[2]),\n          canonicalLabel: (form + match[2] + (match[3] ? \"x\" + match[3].replace(\",\", \".\") : \"\")) + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n      match = compact.match(/^([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)\\-([0-9]+)(UNC|UNF|NPT)(?:\\-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = form || normalizeThreadForm(match[3]);\n        tolerance = tolerance || normalizeTolerance(match[4]);\n        return {\n          standard: form,\n          size: match[1] + \"-\" + match[2] + form,\n          pitch: match[2],\n          pitchMm: toNullableNumber(match[2]) ? 25.4 / Number(match[2]) : null,\n          tolerance: tolerance,\n          pipeFlag: form === \"NPT\",\n          nominalDiameterMm: parseFraction(match[1]) != null ? parseFraction(match[1]) * 25.4 : null,\n          canonicalLabel: match[1] + \"-\" + match[2] + form + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n      return { standard: form || normalizeThreadForm(compact), size: compact, pitch: null, pitchMm: null, tolerance: tolerance, pipeFlag: compact.indexOf(\"NPT\") >= 0 || compact.indexOf(\"G\") === 0 || compact.indexOf(\"R\") === 0, nominalDiameterMm: null, canonicalLabel: compact + (tolerance ? \"-\" + tolerance : \"\"), valid: false };\n    }\n    \n    function getMaterialGroup(materialCode) {\n      var text = toNullableString(materialCode);\n      return text ? text.charAt(0).toUpperCase() : null;\n    }\n    \n    function mapSyncMode(value) {\n      switch (toNullableString(value)) {\n        case \"rigid\": return { code: \"rigid\", label: \"Rigid tapping\", score: 1, stable: true };\n        case \"synchro_chuck\": return { code: \"synchro\", label: \"Synchro chuck\", score: 0.92, stable: true };\n        case \"no\": return { code: \"none\", label: \"No synchronized tapping mode\", score: 0.08, stable: false };\n        case \"unknown\": return { code: \"unknown\", label: \"Unspecified tapping mode\", score: 0.55, stable: false };\n        default: return { code: \"unknown\", label: \"Unspecified tapping mode\", score: 0.45, stable: false };\n      }\n    }\n    \n    function mapLubrication(value) {\n      switch (toNullableString(value)) {\n        case \"through_emulsion\": return { code: \"through_emulsion\", normalized: \"through\", label: \"Through coolant / emulsion\", baseScore: 0.82 };\n        case \"external_emulsion\": return { code: \"external_emulsion\", normalized: \"external\", label: \"External emulsion\", baseScore: 0.7 };\n        case \"oil\": return { code: \"oil\", normalized: \"external\", label: \"Cutting oil\", baseScore: 1 };\n        case \"mql\": return { code: \"mql\", normalized: \"mist\", label: \"MQL / mist\", baseScore: 0.42 };\n        case \"dry\": return { code: \"dry\", normalized: \"dry\", label: \"Dry\", baseScore: 0.1 };\n        default: return { code: \"unknown\", normalized: \"unknown\", label: \"Unspecified lubrication\", baseScore: 0.35 };\n      }\n    }\n    \n    function mapBottomReserve(value) {\n      switch (toNullableString(value)) {\n        case \"generous\": return { code: \"low\", label: \"Enough reserve\", input: \"generous\", weight: 0.14 };\n        case \"short\": return { code: \"medium\", label: \"Short reserve\", input: \"short\", weight: 0.52 };\n        case \"minimal\": return { code: \"high\", label: \"Very short / near bottom\", input: \"minimal\", weight: 0.88 };\n        case \"unknown\": return { code: \"medium\", label: \"Bottom reserve unknown\", input: \"unknown\", weight: 0.46 };\n        default: return { code: \"medium\", label: \"Bottom reserve unspecified\", input: null, weight: 0.48 };\n      }\n    }\n    \n    function normalizeCoreHoleRoute(value) {\n      return toNullableString(value) || \"recommend\";\n    }\n    \n    function normalizeLeadType(value) {\n      var text = toNullableString(value);\n      if (!text) return null;\n      text = text.toUpperCase();\n      if (text.indexOf(\"BOTTOM\") >= 0 || text.indexOf(\"2P\") >= 0 || text === \"E\") return \"bottoming\";\n      if (text.indexOf(\"PLUG\") >= 0 || text.indexOf(\"4P\") >= 0 || text === \"B\") return \"plug\";\n      if (text.indexOf(\"SHORT\") >= 0 || text.indexOf(\"3P\") >= 0 || text === \"C\") return \"short\";\n      return text.toLowerCase();\n    }\n    \n    function deriveFormability(ctx, materialCode) {\n      var answer = toNullableString(getAnswer(ctx, \"material_formability_class\"));\n      var strengthHint = toNullableString(getAnswer(ctx, \"material_strength_class\"));\n      var group = getMaterialGroup(materialCode);\n      var code = group === \"N\" ? \"good\" : group === \"P\" ? (String(materialCode || \"\").toUpperCase() === \"P4\" || String(materialCode || \"\").toUpperCase() === \"P6\" ? \"conditional\" : \"good\") : group === \"M\" ? \"conditional\" : group === \"S\" ? \"conditional\" : group === \"K\" ? \"poor\" : group === \"H\" ? \"reject\" : \"conditional\";\n      var score = code === \"good\" ? 0.9 : code === \"conditional\" ? 0.58 : code === \"poor\" ? 0.18 : 0;\n      var label = code === \"good\" ? \"Material formability supports blind-hole thread forming.\" : code === \"conditional\" ? \"Material formability narrows the blind-hole forming window.\" : code === \"poor\" ? \"Material formability is weak for standard blind-hole forming.\" : \"Material is outside the normal blind-hole forming window.\";\n      var hardStop = code === \"reject\";\n    \n      if (answer === \"good_formable\") {\n        if (group === \"K\") {\n          code = \"conditional\";\n          score = 0.38;\n          label = \"Material is described as formable, but cast-like material still needs a careful blind-hole qualification window.\";\n          hardStop = false;\n        } else if (code !== \"reject\") {\n          code = \"good\";\n          score = Math.max(score, 0.92);\n          label = \"Material described as formable for blind-hole thread forming.\";\n        }\n      }\n      if (answer === \"higher_strength\") {\n        if (code === \"good\") {\n          code = \"conditional\";\n          score = 0.54;\n          label = \"Higher strength narrows the blind-hole forming window.\";\n        } else if (code === \"conditional\") {\n          score = 0.5;\n          label = \"Higher strength keeps the blind-hole forming window narrow.\";\n        }\n      }\n      if (answer === \"cast_iron\") {\n        code = \"reject\";\n        score = 0;\n        label = \"Cast-iron-like material is outside the normal forming window.\";\n        hardStop = true;\n      }\n      if (answer === \"hard_hardened\" || strengthHint === \"hard_hardened\" || group === \"H\") {\n        code = \"reject\";\n        score = 0;\n        label = \"Hard or hardened material is outside the normal blind-hole forming window.\";\n        hardStop = true;\n      }\n      if (strengthHint === \"higher_strength\" && code === \"good\") {\n        code = \"conditional\";\n        score = 0.56;\n        label = \"Strength hint narrows the blind-hole forming window.\";\n      }\n    \n      return { code: code, label: label, score: score, hardStop: hardStop, input: answer };\n    }\n    \n    function deriveLubricationAdequacy(materialGroup, lubrication) {\n      var score = lubrication.baseScore;\n      if (materialGroup === \"M\" || materialGroup === \"S\") score = lubrication.code === \"oil\" ? 1 : lubrication.code === \"through_emulsion\" ? 0.84 : lubrication.code === \"external_emulsion\" ? 0.58 : lubrication.code === \"mql\" ? 0.22 : lubrication.code === \"dry\" ? 0.04 : 0.3;\n      if (materialGroup === \"N\") score = lubrication.code === \"oil\" ? 0.92 : lubrication.code === \"external_emulsion\" || lubrication.code === \"through_emulsion\" ? 0.8 : lubrication.code === \"mql\" ? 0.32 : lubrication.code === \"dry\" ? 0.06 : 0.28;\n      if (materialGroup === \"P\") score = lubrication.code === \"oil\" ? 0.94 : lubrication.code === \"through_emulsion\" ? 0.84 : lubrication.code === \"external_emulsion\" ? 0.72 : lubrication.code === \"mql\" ? 0.38 : lubrication.code === \"dry\" ? 0.12 : 0.34;\n      if (materialGroup === \"K\" || materialGroup === \"H\") score = Math.min(score, 0.2);\n      return { code: score >= 0.82 ? \"good\" : score <= 0.35 ? \"poor\" : \"acceptable\", label: score >= 0.82 ? \"Lubrication supports blind-hole thread forming well.\" : score <= 0.35 ? \"Lubrication is weak for blind-hole thread forming.\" : \"Lubrication is workable, but not generous for blind-hole thread forming.\", fitScore: clamp01(score) };\n    }\n    \n    function buildDerived(ctx) {\n      var tolerance = normalizeTolerance(getAnswer(ctx, \"thread_tolerance\"));\n      var simpleThread = buildAutoDesignation(getAnswer(ctx, \"thread_standard_choice\"), getAnswer(ctx, \"thread_nominal_size\"), tolerance);\n      var designation = toNullableString(getAnswer(ctx, \"thread_designation_override\")) || simpleThread.designation || toNullableString(getAnswer(ctx, \"thread_designation\"));\n      var parsed = parseThreadIdentity(designation, tolerance, getAnswer(ctx, \"thread_standard_choice\"));\n      var materialCode = ctx.material && ctx.material.subgroupCode;\n      var materialGroup = getMaterialGroup(materialCode);\n      var lubrication = mapLubrication(getAnswer(ctx, \"coolant_lubrication_mode\"));\n      var threadLengthMm = toNullableNumber(getAnswer(ctx, \"thread_length_mm\"));\n      var totalHoleDepthMm = toNullableNumber(getAnswer(ctx, \"total_hole_depth_mm\"));\n      var actualBottomReserveMm = toNullableNumber(getAnswer(ctx, \"actual_bottom_reserve_mm\"));\n      if (actualBottomReserveMm == null && totalHoleDepthMm != null && threadLengthMm != null) {\n        actualBottomReserveMm = totalHoleDepthMm - threadLengthMm;\n      }\n    \n      return {\n        parsed: parsed,\n        simpleThread: simpleThread,\n        canonicalDesignation: designation,\n        materialCode: materialCode,\n        materialGroup: materialGroup,\n        formability: deriveFormability(ctx, materialCode),\n        lubrication: lubrication,\n        lubricationAdequacy: deriveLubricationAdequacy(materialGroup, lubrication),\n        machineMode: mapSyncMode(getAnswer(ctx, \"sync_tapping_capability\")),\n        coreHoleRoute: normalizeCoreHoleRoute(getAnswer(ctx, \"core_hole_status\")),\n        bottomReserve: mapBottomReserve(getAnswer(ctx, \"bottom_reserve_class\")),\n        threadLengthMm: threadLengthMm,\n        totalHoleDepthMm: totalHoleDepthMm,\n        actualPredrillMm: toNullableNumber(getAnswer(ctx, \"actual_predrill_diameter_mm\")),\n        actualBottomReserveMm: actualBottomReserveMm,\n        nominalDiameterMm: parsed.nominalDiameterMm,\n        pitchMm: parsed.pitchMm,\n        threadTolerance: tolerance || parsed.tolerance,\n        threadDepthRatio: parsed.nominalDiameterMm && threadLengthMm ? threadLengthMm / parsed.nominalDiameterMm : null,\n        recommendedChamferClass: \"Bottoming / 2P\",\n        holderType: toNullableString(getAnswer(ctx, \"holder_type\")),\n        qualitySensitivity: toNullableString(getAnswer(ctx, \"quality_sensitivity\")),\n        problemHistory: toNullableString(getAnswer(ctx, \"problem_history\")),\n        priority: toNullableString(getAnswer(ctx, \"priority\")),\n        sealingRelevant: toNullableString(getAnswer(ctx, \"sealing_relevant\")) === \"yes\",\n        entryProtection: toNullableString(getAnswer(ctx, \"entry_protection\")),\n        pitchFormingLimitWarning: parsed.pitchMm != null && parsed.pitchMm > 3,\n      };\n    }\n    \n    function derive(ctx) {\n      var derived = buildDerived(ctx);\n      return {\n        thread_designation: derived.canonicalDesignation,\n        thread_standard: derived.parsed.standard,\n        thread_size: derived.parsed.size,\n        pitch: derived.parsed.pitch,\n        pitch_mm: derived.parsed.pitchMm,\n        pipe_flag: derived.parsed.pipeFlag,\n        thread_tolerance_target: derived.threadTolerance,\n        requested_thread_nominal_mm: derived.nominalDiameterMm,\n        required_full_thread_length_mm: derived.threadLengthMm,\n        required_depth_ratio: derived.threadDepthRatio,\n        machine_mode_class: derived.machineMode.label,\n        coolant_mode_normalized: derived.lubrication.normalized,\n        predrill_validation_route: derived.coreHoleRoute,\n        recommended_chamfer_class: derived.recommendedChamferClass,\n        formability_suitability_class: derived.formability.code,\n        formability_suitability_label: derived.formability.label,\n        bottom_reserve_class: derived.bottomReserve.code,\n        bottom_reserve_label: derived.bottomReserve.label,\n        bottom_clearance_class: derived.bottomReserve.code,\n        bottom_clearance_label: derived.bottomReserve.label,\n        pitch_forming_limit_warning: derived.pitchFormingLimitWarning,\n      };\n    }\n    \n    function validate(ctx) {\n      var derived = buildDerived(ctx);\n      var issues = [];\n    \n      if (getAnswer(ctx, \"thread_standard_choice\") && getAnswer(ctx, \"thread_nominal_size\") && !derived.simpleThread.supported && !getAnswer(ctx, \"thread_designation_override\")) issues.push({ field: \"thread_nominal_size\", message: \"This nominal size is not yet available for automatic pitch derivation. Use the custom designation override for this thread.\", severity: \"error\", code: \"thread_size_not_supported\" });\n      else if (derived.canonicalDesignation && !derived.parsed.valid) issues.push({ field: \"thread_nominal_size\", message: \"Enter a supported thread type and nominal size, or use a parseable custom designation such as M10x1.5-6H or 1/4-20UNC-2B.\", severity: \"error\", code: \"thread_designation_invalid\" });\n    \n      if (derived.machineMode.code === \"none\") issues.push({ field: \"sync_tapping_capability\", message: \"Blind-hole thread forming requires a synchronized tapping cycle or a synchro holder.\", severity: \"error\", code: \"sync_required\" });\n      if (derived.coreHoleRoute === \"missing\") issues.push({ field: \"core_hole_status\", message: \"Blind-hole thread forming needs a prepared core hole before a safe recommendation can be released.\", severity: \"error\", code: \"core_hole_missing\" });\n      if (derived.formability.code !== \"good\") issues.push({ field: \"material_formability_class\", message: derived.formability.label + \" Qualify the material window carefully before releasing blind-hole thread forming.\", severity: \"warning\", code: \"formability_guardrail\" });\n      if (derived.lubricationAdequacy.code === \"poor\") issues.push({ field: \"coolant_lubrication_mode\", message: \"Lubrication is weak for blind-hole thread forming. Treat torque, smearing and gauge behavior conservatively.\", severity: \"warning\", code: \"lubrication_risk_high\" });\n      if (derived.bottomReserve.input === \"unknown\") issues.push({ field: \"bottom_reserve_class\", message: \"Bottom reserve is still unknown. That keeps the blind-hole safety window less certain.\", severity: \"warning\", code: \"bottom_reserve_unknown\" });\n      else if (derived.bottomReserve.code === \"high\") issues.push({ field: \"bottom_reserve_class\", message: \"Bottom reserve is very short for a blind-hole form tap. Review the lead length and reserve carefully.\", severity: \"warning\", code: \"bottom_reserve_critical\" });\n      if (derived.threadDepthRatio != null && derived.threadDepthRatio > 1.5) issues.push({ field: \"thread_length_mm\", message: \"Required full thread length is above 1.5 x D. Expect a tighter forming window and stronger load sensitivity.\", severity: \"warning\", code: \"thread_depth_ratio_high\" });\n      if (derived.pitchFormingLimitWarning) issues.push({ field: \"thread_nominal_size\", message: \"Pitch is above the usual practical forming range. Treat this as a specialist case and qualify conservatively.\", severity: \"warning\", code: \"pitch_forming_limit\" });\n      if (derived.sealingRelevant && !derived.parsed.pipeFlag) issues.push({ field: \"sealing_relevant\", message: \"Sealing relevance is set, but the current designation is not a pipe-thread style.\", severity: \"warning\", code: \"sealing_non_pipe\" });\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"forming_blind\", pool);\n    }\n    \n    function computeLengthMetrics(candidate, requiredLengthMm) {\n      var apmxMm = toNullableNumber(candidate.common.apmxMm);\n      var usableLengthMm = toNullableNumber(candidate.common.usableLengthMm);\n      var apmxMarginMm = apmxMm != null && requiredLengthMm != null ? apmxMm - requiredLengthMm : null;\n      var usableMarginMm = usableLengthMm != null && requiredLengthMm != null ? usableLengthMm - requiredLengthMm : null;\n      var fitScore = apmxMarginMm != null && usableMarginMm != null\n        ? (apmxMarginMm >= 1 && usableMarginMm >= 1 ? 1 : apmxMarginMm >= 0 && usableMarginMm >= 0 ? 0.82 : 0)\n        : apmxMarginMm != null ? (apmxMarginMm >= 0 ? 0.74 : 0)\n        : usableMarginMm != null ? (usableMarginMm >= 0 ? 0.74 : 0)\n        : 0.55;\n      return { apmxMm: apmxMm, usableLengthMm: usableLengthMm, apmxMarginMm: apmxMarginMm, usableMarginMm: usableMarginMm, fitScore: clamp01(fitScore) };\n    }\n    \n    function computePredrillMetrics(candidate, derived) {\n      var recommendedMm = toNullableNumber(candidate.drilling.preDrillDiameterMm);\n      var actualMm = derived.actualPredrillMm;\n      var deltaMm = actualMm != null && recommendedMm != null ? actualMm - recommendedMm : null;\n      var fitScore = recommendedMm == null\n        ? 0.35\n        : deltaMm == null\n          ? (derived.coreHoleRoute === \"recommend\" ? 0.72 : derived.coreHoleRoute === \"fixed_unknown\" ? 0.54 : 0.46)\n          : Math.abs(deltaMm) <= 0.02 ? 1 : Math.abs(deltaMm) <= 0.05 ? 0.82 : Math.abs(deltaMm) <= 0.1 ? 0.55 : 0.18;\n      var riskClass = deltaMm == null\n        ? (derived.coreHoleRoute === \"recommend\" ? \"nominal\" : \"unknown\")\n        : Math.abs(deltaMm) <= 0.03 ? \"nominal\" : deltaMm < 0 ? \"overforming-risk\" : \"underformed-risk\";\n      return { recommendedMm: recommendedMm, actualMm: actualMm, deltaMm: deltaMm, fitScore: clamp01(fitScore), riskClass: riskClass };\n    }\n    \n    function computeBlindLeadMetrics(candidate, derived) {\n      var type = normalizeLeadType(candidate.threading.tapChamferForm);\n      var lengthP = toNullableNumber(candidate.threading.tapChamferLengthP);\n      var pitchMm = derived.pitchMm;\n      var actualReserveMm = derived.actualBottomReserveMm;\n      var safetyGapMm;\n      var marginMm = null;\n      var fitScore = 0.45;\n      var riskClass = derived.bottomReserve.code === \"high\" ? \"critical\" : derived.bottomReserve.code === \"medium\" ? \"tight\" : \"safe\";\n    \n      if (lengthP == null) {\n        lengthP = type === \"bottoming\" ? 2 : type === \"plug\" ? 4 : 3;\n      }\n      if (pitchMm != null && lengthP != null) {\n        safetyGapMm = Math.max(0.3, pitchMm * 0.25);\n        marginMm = actualReserveMm != null ? actualReserveMm - (lengthP * pitchMm) - safetyGapMm : null;\n      }\n    \n      if (marginMm != null) {\n        if (marginMm >= 0.4) {\n          fitScore = 1;\n          riskClass = \"safe\";\n        } else if (marginMm >= 0) {\n          fitScore = 0.7;\n          riskClass = \"tight\";\n        } else if (marginMm >= -0.3) {\n          fitScore = 0.32;\n          riskClass = \"critical\";\n        } else {\n          fitScore = 0;\n          riskClass = \"critical\";\n        }\n      } else if (derived.bottomReserve.input === \"generous\") {\n        fitScore = type === \"bottoming\" ? 0.96 : type === \"short\" ? 0.78 : 0.48;\n      } else if (derived.bottomReserve.input === \"short\") {\n        fitScore = type === \"bottoming\" ? 0.78 : type === \"short\" ? 0.56 : 0.18;\n      } else if (derived.bottomReserve.input === \"minimal\") {\n        fitScore = type === \"bottoming\" ? 0.38 : type === \"short\" ? 0.18 : 0.03;\n      } else if (derived.bottomReserve.input === \"unknown\") {\n        fitScore = type === \"bottoming\" ? 0.62 : type === \"short\" ? 0.46 : 0.18;\n      }\n    \n      return {\n        type: type,\n        lengthP: lengthP,\n        lengthMm: lengthP != null && pitchMm != null ? roundValue(lengthP * pitchMm, 2) : null,\n        actualReserveMm: actualReserveMm,\n        marginMm: marginMm != null ? roundValue(marginMm, 2) : null,\n        fitScore: clamp01(fitScore),\n        riskClass: riskClass,\n      };\n    }\n    \n    function computeCoolantFit(derived, rowCoolantMode) {\n      var requested = derived.lubrication.normalized;\n      var score = derived.lubricationAdequacy.fitScore;\n      if (!rowCoolantMode || rowCoolantMode === \"unknown\") return score;\n      if (rowCoolantMode === requested) return clamp01(score + 0.08);\n      if ((rowCoolantMode === \"through\" && requested === \"external\") || (rowCoolantMode === \"external\" && requested === \"through\")) return clamp01(score - 0.08);\n      return clamp01(score - (requested === \"dry\" ? 0.18 : 0.12));\n    }\n    \n    function computeProgramFit(candidate, materialGroup) {\n      var catalog = candidate.attachments && candidate.attachments.catalogContext || {};\n      var materialContext = candidate.attachments && candidate.attachments.materialContext || {};\n      var series = toNullableString(catalog.series);\n      var isoGroups = materialContext.isoGroups && materialContext.isoGroups.codes || [];\n      var seriesUpper = series ? series.toUpperCase() : null;\n      if (seriesUpper && (seriesUpper.indexOf(\"ROLL\") >= 0 || seriesUpper.indexOf(\"FORM\") >= 0 || seriesUpper.indexOf(\"FURCH\") >= 0)) return 1;\n      if (isoGroups.length > 0 && isoGroups.indexOf(materialGroup) >= 0) return 0.82;\n      if (catalog.substrate || catalog.coating) return 0.66;\n      return 0.55;\n    }\n    \n    function computeToleranceFit(candidate, targetTolerance) {\n      var candidateTolerance = normalizeTolerance(candidate.threading.tapTolerance);\n      if (!targetTolerance && !candidateTolerance) return 0.72;\n      if (!targetTolerance || !candidateTolerance) return 0.6;\n      return candidateTolerance === targetTolerance ? 1 : 0.5;\n    }\n    \n    function computeMachineFit(derived) {\n      var holder = toNullableString(derived.holderType);\n      var holderScore = holder === \"rigid_holder\" ? 1 : holder === \"synchro_chuck\" ? 0.96 : holder === \"length_comp\" ? 0.58 : derived.machineMode.score;\n      return clamp01((derived.machineMode.score + holderScore) / 2);\n    }\n    \n    function computePriorityBias(priority, values) {\n      switch (priority) {\n        case \"process_security\": return clamp01((values.formabilityFit + values.blindFit + values.lubricationFit + values.machineFit) / 4);\n        case \"thread_quality\": return clamp01((values.predrillFit + values.blindFit + values.toleranceFit + values.lengthFit) / 4);\n        case \"tool_life\": return clamp01((values.lubricationFit + values.formabilityFit + values.programFit + values.blindFit) / 4);\n        case \"productivity\": return clamp01((values.programFit + values.recipeFit + values.lengthFit + values.formabilityFit) / 4);\n        default: return 0.55;\n      }\n    }\n    \n    function computeSeverity(derived, lengthMetrics, predrillMetrics, blindLeadMetrics) {\n      var weight = 0.22;\n      if (derived.formability.code === \"conditional\") weight += 0.16;\n      if (derived.formability.code === \"poor\") weight += 0.28;\n      if (derived.lubricationAdequacy.code === \"poor\") weight += 0.22;\n      else if (derived.lubricationAdequacy.code === \"acceptable\") weight += 0.08;\n      if (derived.threadDepthRatio != null && derived.threadDepthRatio > 1.5) weight += 0.14;\n      if (predrillMetrics.fitScore < 0.3) weight += 0.2;\n      else if (predrillMetrics.fitScore < 0.7) weight += 0.08;\n      if (blindLeadMetrics.riskClass === \"tight\") weight += 0.1;\n      if (blindLeadMetrics.riskClass === \"critical\") weight += 0.25;\n      if (lengthMetrics.fitScore < 0.7) weight += 0.06;\n      if (derived.pitchFormingLimitWarning) weight += 0.1;\n      if (derived.materialGroup === \"S\") weight += 0.08;\n      if (derived.materialGroup === \"K\") weight += 0.1;\n      return { code: weight >= 0.72 ? \"high\" : weight >= 0.44 ? \"medium\" : \"low\", label: weight >= 0.72 ? \"High\" : weight >= 0.44 ? \"Medium\" : \"Low\", weight: weight };\n    }\n    \n    function computeRpmWindow(recipe, nominalDiameterMm) {\n      function rpmFromVc(vc) {\n        return vc == null || nominalDiameterMm == null || nominalDiameterMm <= 0 ? null : roundValue((1000 * vc) / (Math.PI * nominalDiameterMm), 0);\n      }\n      return { min: rpmFromVc(recipe && recipe.vc && recipe.vc.min), typ: rpmFromVc(recipe && recipe.vc && recipe.vc.typ), max: rpmFromVc(recipe && recipe.vc && recipe.vc.max) };\n    }\n    \n    function computeFeedWindow(rpmWindow, pitchMm) {\n      function feedFromRpm(rpm) {\n        return rpm == null || pitchMm == null ? null : roundValue(rpm * pitchMm, 0);\n      }\n      return { min: feedFromRpm(rpmWindow.min), typ: feedFromRpm(rpmWindow.typ), max: feedFromRpm(rpmWindow.max) };\n    }\n    \n    function buildReasons(metrics, scoreParts) {\n      var reasons = [];\n      if ((scoreParts.threadIdentity || 0) >= 2.4) reasons.push(\"Thread form, size and tolerance match exactly.\");\n      if (metrics.formabilitySuitabilityClass === \"good\") reasons.push(\"Material formability supports chipless blind-hole thread forming.\");\n      else if (metrics.formabilitySuitabilityClass === \"conditional\") reasons.push(\"Material formability is workable, but the blind-hole forming window stays narrower.\");\n      if (metrics.blindFitRisk === \"safe\") reasons.push(\"Lead length and bottom reserve stay in a stable blind-hole window.\");\n      else if (metrics.blindFitRisk === \"tight\") reasons.push(\"Blind-hole fit is workable, but the reserve stays tight near the bore bottom.\");\n      if (metrics.predrillRecommendedMm != null) reasons.push(\"Core-hole guidance aligns with the selected form tap.\");\n      if (metrics.lubricationAdequacy === \"good\") reasons.push(\"Lubrication is strong enough for the expected forming load.\");\n      return reasons.slice(0, 5);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var threadingTools = toolkits.threading;\n      var derived = buildDerived(ctx);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = threadingTools.resolveRows(candidate, ctx);\n        var recipeResult = threadingTools.resolveRecipe(candidate, ctx);\n        var recipeRow = recipeResult.row || null;\n        var candidateThread = parseThreadIdentity(candidate.threading.threadSize, candidate.threading.tapTolerance, candidate.threading.threadForm);\n        var rowCoolantMode = recipeRow && recipeRow.constraints ? recipeRow.constraints.coolantMode : null;\n        var lengthMetrics = computeLengthMetrics(candidate, derived.threadLengthMm);\n        var predrillMetrics = computePredrillMetrics(candidate, derived);\n        var blindLeadMetrics = computeBlindLeadMetrics(candidate, derived);\n        var coolantFit = computeCoolantFit(derived, rowCoolantMode);\n        var programFit = computeProgramFit(candidate, derived.materialGroup);\n        var toleranceFit = computeToleranceFit(candidate, derived.threadTolerance);\n        var machineFit = computeMachineFit(derived);\n        var severity = computeSeverity(derived, lengthMetrics, predrillMetrics, blindLeadMetrics);\n        var requestedForm = normalizeThreadForm(derived.parsed.standard);\n        var candidateForm = normalizeThreadForm(candidate.threading.threadForm || candidateThread.standard);\n        var hardRejectReason = null;\n        var recipe = recipeResult.recipe;\n        var priorityBias;\n        var riskPenalty;\n        var parts;\n        var total;\n        var confidence;\n        var rpmWindow;\n        var feedWindow;\n        var metrics;\n    \n        if (derived.parsed.size && candidateThread.size && derived.parsed.size !== candidateThread.size) hardRejectReason = \"Candidate thread size does not match the requested formed thread.\";\n        if (!hardRejectReason && requestedForm && candidateForm && requestedForm !== candidateForm) hardRejectReason = \"Candidate thread form does not match the requested formed thread.\";\n        if (!hardRejectReason && derived.machineMode.code === \"none\") hardRejectReason = \"Blind-hole thread forming requires a synchronized tapping cycle or synchro holder.\";\n        if (!hardRejectReason && derived.coreHoleRoute === \"missing\") hardRejectReason = \"Blind-hole thread forming needs a prepared core hole before a safe recommendation can be released.\";\n        if (!hardRejectReason && derived.formability.hardStop) hardRejectReason = derived.formability.label + \" Use cut tapping instead of standard blind-hole thread forming.\";\n        if (!hardRejectReason && derived.materialCode && candidate.classification.materialSubgroupCodes.length > 0 && kernel.materialFit(candidate, ctx) <= 0) hardRejectReason = \"Candidate material subgroup fit does not cover the selected ISO subgroup.\";\n        if (!hardRejectReason && ((lengthMetrics.apmxMarginMm != null && lengthMetrics.apmxMarginMm < 0) || (lengthMetrics.usableMarginMm != null && lengthMetrics.usableMarginMm < 0))) hardRejectReason = \"Candidate length reserve is below the required full thread length.\";\n        if (!hardRejectReason && blindLeadMetrics.marginMm != null && blindLeadMetrics.marginMm < 0) hardRejectReason = \"Available bottom reserve is below the required lead length for this blind-hole setup.\";\n    \n        priorityBias = computePriorityBias(derived.priority, {\n          formabilityFit: derived.formability.score,\n          blindFit: blindLeadMetrics.fitScore,\n          predrillFit: predrillMetrics.fitScore,\n          lubricationFit: coolantFit,\n          machineFit: machineFit,\n          toleranceFit: toleranceFit,\n          lengthFit: lengthMetrics.fitScore,\n          recipeFit: recipeResult.source === \"exact\" ? 1 : recipeResult.source === \"near\" ? 0.78 : 0.5,\n          programFit: programFit,\n        });\n    \n        riskPenalty = clamp01(\n          (kernel.risk(candidate, ctx) || 0) +\n          (derived.formability.code === \"poor\" ? 0.18 : derived.formability.code === \"conditional\" ? 0.08 : 0) +\n          (derived.lubricationAdequacy.code === \"poor\" ? 0.22 : 0) +\n          (predrillMetrics.fitScore < 0.3 ? 0.18 : predrillMetrics.fitScore < 0.7 ? 0.08 : 0) +\n          (blindLeadMetrics.riskClass === \"critical\" ? 0.22 : blindLeadMetrics.riskClass === \"tight\" ? 0.08 : 0) +\n          (severity.code === \"high\" ? 0.16 : severity.code === \"medium\" ? 0.06 : 0) +\n          (derived.pitchFormingLimitWarning ? 0.12 : 0)\n        );\n    \n        if (recipeResult.source !== \"none\" && derived.pitchMm != null) recipe = createRecipe({ vc: recipeResult.recipe && recipeResult.recipe.vc, fn: { min: derived.pitchMm, typ: derived.pitchMm, max: derived.pitchMm } });\n        rpmWindow = computeRpmWindow(recipe, derived.nominalDiameterMm);\n        feedWindow = computeFeedWindow(rpmWindow, derived.pitchMm);\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.1,\n          process: kernel.processFit(candidate, ctx),\n          formability: derived.formability.score * 1.7,\n          threadIdentity: derived.parsed.size && candidateThread.size && derived.parsed.size === candidateThread.size ? 2.6 : 0.4,\n          toleranceFit: toleranceFit * 0.95,\n          blindFit: blindLeadMetrics.fitScore * 1.35,\n          lengthWindow: lengthMetrics.fitScore * 1.05,\n          predrillFit: predrillMetrics.fitScore * 1.55,\n          lubricationFit: coolantFit * 1.35,\n          machineFit: machineFit * 1.05,\n          programFit: programFit * 0.6,\n          rowMatch: recipeRow || rows.length > 0 ? 0.45 : 0.15,\n          priorityBias: priorityBias * 0.35,\n          riskPenalty: -riskPenalty,\n        };\n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.83 : 0.68;\n        if (derived.coreHoleRoute !== \"actual_known\") confidence -= 0.05;\n        if (derived.actualBottomReserveMm == null && derived.bottomReserve.input !== \"generous\") confidence -= 0.08;\n        if (derived.formability.code === \"conditional\") confidence -= 0.08;\n        if (derived.formability.code === \"poor\") confidence -= 0.14;\n        if (derived.lubricationAdequacy.code === \"poor\") confidence -= 0.1;\n        if (derived.pitchFormingLimitWarning) confidence -= 0.08;\n        if (hardRejectReason) confidence = 0;\n        confidence = clamp01(confidence);\n    \n        metrics = Object.assign({}, threadingTools.getSharedMetrics(candidate, ctx), {\n          requestedThreadIdentity: derived.canonicalDesignation,\n          requestedThreadForm: requestedForm,\n          requestedThreadSize: derived.parsed.size,\n          requestedPitchMm: derived.pitchMm,\n          requestedTolerance: derived.threadTolerance,\n          nominalThreadDiameterMm: derived.nominalDiameterMm,\n          requiredFullThreadLengthMm: derived.threadLengthMm,\n          requiredDepthRatio: derived.threadDepthRatio != null ? roundValue(derived.threadDepthRatio, 2) : null,\n          recommendedChamferClass: derived.recommendedChamferClass,\n          formabilitySuitabilityClass: derived.formability.code,\n          formabilityLabel: derived.formability.label,\n          bottomReserveClass: derived.bottomReserve.code,\n          bottomReserveLabel: derived.bottomReserve.label,\n          totalHoleDepthMm: derived.totalHoleDepthMm,\n          actualBottomReserveMm: blindLeadMetrics.actualReserveMm,\n          blindFitRisk: blindLeadMetrics.riskClass,\n          tapChamferForm: toNullableString(candidate.threading.tapChamferForm),\n          tapChamferType: blindLeadMetrics.type,\n          tapChamferLengthP: blindLeadMetrics.lengthP,\n          tapChamferLengthMm: blindLeadMetrics.lengthMm,\n          bottomReserveMarginMm: blindLeadMetrics.marginMm,\n          predrillRecommendedMm: predrillMetrics.recommendedMm,\n          predrillActualMm: predrillMetrics.actualMm,\n          predrillDeltaMm: predrillMetrics.deltaMm != null ? roundValue(predrillMetrics.deltaMm, 3) : null,\n          underOverFormRisk: predrillMetrics.riskClass,\n          lubricationAdequacy: derived.lubricationAdequacy.code,\n          machineMode: derived.machineMode.label,\n          coolantMode: derived.lubrication.label,\n          qualitySensitivity: derived.qualitySensitivity,\n          problemHistory: derived.problemHistory,\n          holderType: derived.holderType,\n          entryProtection: derived.entryProtection,\n          candidateThreadForm: candidateForm,\n          candidateThreadSize: candidateThread.size,\n          candidateTolerance: normalizeTolerance(candidate.threading.tapTolerance),\n          apmxMm: lengthMetrics.apmxMm,\n          usableLengthMm: lengthMetrics.usableLengthMm,\n          apmxMarginMm: lengthMetrics.apmxMarginMm != null ? roundValue(lengthMetrics.apmxMarginMm, 2) : null,\n          usableLengthMarginMm: lengthMetrics.usableMarginMm != null ? roundValue(lengthMetrics.usableMarginMm, 2) : null,\n          blindFit: blindLeadMetrics.fitScore,\n          coolantFit: coolantFit,\n          machineFit: machineFit,\n          lengthFit: lengthMetrics.fitScore,\n          predrillFit: predrillMetrics.fitScore,\n          toleranceFit: toleranceFit,\n          programFit: programFit,\n          rowCoolantMode: rowCoolantMode,\n          recipeOperationId: recipeRow && recipeRow.constraints && recipeRow.constraints.processIds && recipeRow.constraints.processIds[0] || null,\n          recipeVcMin: recipe && recipe.vc ? recipe.vc.min : null,\n          recipeVcTyp: recipe && recipe.vc ? recipe.vc.typ : null,\n          recipeVcMax: recipe && recipe.vc ? recipe.vc.max : null,\n          rpmMin: rpmWindow.min,\n          rpmTyp: rpmWindow.typ,\n          rpmMax: rpmWindow.max,\n          feedMinMmMin: feedWindow.min,\n          feedTypMmMin: feedWindow.typ,\n          feedMaxMmMin: feedWindow.max,\n          formingSeverity: severity.code,\n          formingSeverityWeight: roundValue(severity.weight, 2),\n          pitchFormingLimitWarning: derived.pitchFormingLimitWarning,\n          alternativeProcessFlag: derived.formability.code === \"poor\" || derived.lubricationAdequacy.code === \"poor\" || blindLeadMetrics.riskClass === \"critical\" || severity.code === \"high\" || derived.materialGroup === \"H\",\n          alternativePrimary: derived.formability.code === \"poor\" || blindLeadMetrics.riskClass === \"critical\" ? (derived.qualitySensitivity === \"gauge_critical\" || derived.qualitySensitivity === \"functional_critical\" ? \"thread_mill\" : \"tapping_blind\") : (severity.code === \"high\" && (derived.qualitySensitivity === \"gauge_critical\" || derived.qualitySensitivity === \"functional_critical\") ? \"thread_mill\" : \"tapping_blind\"),\n          series: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.series),\n          substrate: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.substrate),\n          coating: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.coating),\n        });\n    \n        return createScoredCandidate(candidate, { eligible: !hardRejectReason && total > 0, hardRejectReason: hardRejectReason, total: total, parts: parts, confidence: confidence, recipeConfidence: recipeResult.source, reasons: buildReasons(metrics, parts) }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/forming-through/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/forming-through/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/forming-through/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/forming-through/presenter.js\");\n    exports.default = createStubProcessModule(\"forming_through\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/forming-through/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, threadIdentity, toleranceNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { getTroubleshootingEntries } = __bundle.require(\"core/troubleshooting-library.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function toNullableString(value) {\n      if (value == null) return null;\n      value = String(value).trim();\n      return value || null;\n    }\n    \n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function clamp01(value) {\n      if (!Number.isFinite(value)) return 0;\n      return value <= 0 ? 0 : value >= 1 ? 1 : value;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function ensureSentence(value) {\n      var text = String(value || \"\").trim();\n      if (!text) return null;\n      return /[.!?]$/.test(text) ? text : text + \".\";\n    }\n    \n    function cleanShortText(value) {\n      return String(value || \"\").replace(/\\s+/g, \" \").trim();\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = cleanShortText(item);\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + String((priceCents / 100).toFixed(0));\n    }\n    \n    function getMaterialProfile(ctx) {\n      return ctx && ctx.material ? ctx.material.profile : null;\n    }\n    \n    function getMaterialLabel(ctx) {\n      var profile = getMaterialProfile(ctx);\n      return profile ? profile.code + \" - \" + profile.label : (ctx && ctx.material ? ctx.material.subgroupCode : null);\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative form tap\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildTroubleshootingHandles(ctx, top) {\n      var metrics = top.metrics || {};\n      var handles = [];\n      switch (metrics.problemHistory) {\n        case \"cold_welding\":\n          handles.push(\"thread-flanks-with-built-up-edge-or-smearing\");\n          break;\n        case \"high_torque\":\n          handles.push(\"tap-breaks-in-hole\", \"spindle-at-power-limit-or-stalls\");\n          break;\n        case \"gauge_tight\":\n        case \"gauge_loose\":\n          handles.push(\"thread-out-of-tolerance-core-hole-too-small-large\");\n          break;\n        case \"burrs\":\n          handles.push(\"burrs-at-entry-and-or-exit\");\n          break;\n      }\n      if (metrics.underOverFormRisk && metrics.underOverFormRisk !== \"nominal\" && metrics.underOverFormRisk !== \"unknown\") handles.push(\"thread-out-of-tolerance-core-hole-too-small-large\");\n      if (metrics.entryExitRiskClass === \"high\") handles.push(\"burrs-at-entry-and-or-exit\");\n      if (metrics.lubricationAdequacy === \"poor\") handles.push(\"coolant-foams-or-lubricates-poorly\");\n      if (metrics.formingSeverity === \"high\") handles.push(\"spindle-at-power-limit-or-stalls\");\n      return Array.from(new Set(handles)).slice(0, 2);\n    }\n    \n    function buildTroubleshootingCards(ctx, top) {\n      return getTroubleshootingEntries(buildTroubleshootingHandles(ctx, top)).map(function mapEntry(entry) {\n        var focusFlags = [];\n        if (entry.rootWorkholding) focusFlags.push(\"workholding\");\n        if (entry.rootMachinePower) focusFlags.push(\"machine power\");\n        if (entry.rootPreprocessing) focusFlags.push(\"pre-processing\");\n        return {\n          title: entry.problem,\n          tone: entry.problemCategory === \"Process Stability\" || entry.rootMachinePower ? \"high\" : \"watch\",\n          eyebrow: \"Focused response\",\n          category: entry.problemCategory || \"Troubleshooting\",\n          wear: entry.dominantToolWear || null,\n          checkFirst: focusFlags,\n          cause: ensureSentence(entry.cause),\n          actions: (entry.actions || []).slice(0, 4).map(cleanShortText).filter(Boolean),\n          note: entry.alternativeProcess ? ensureSentence(entry.alternativeProcess) : null,\n          items: [],\n        };\n      });\n    }\n    \n    function buildRiskItems(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n      if (metrics.formabilitySuitabilityClass === \"conditional\" || metrics.formabilitySuitabilityClass === \"poor\") items.push({ severity: \"warning\", title: \"Material formability\", message: metrics.formabilityLabel || \"Material formability narrows the forming window.\" });\n      if (metrics.lubricationAdequacy === \"poor\") items.push({ severity: \"warning\", title: \"Lubrication\", message: \"Lubrication is weak for thread forming. Do not release this setup aggressively until torque and gauge behavior are qualified.\" });\n      if (metrics.underOverFormRisk === \"overforming-risk\") items.push({ severity: \"warning\", title: \"Core-hole too small\", message: \"The actual core hole trends below the recommendation, which raises torque and over-forming risk.\" });\n      if (metrics.underOverFormRisk === \"underformed-risk\") items.push({ severity: \"warning\", title: \"Core-hole too large\", message: \"The actual core hole trends above the recommendation, which can weaken thread engagement and gauge fit.\" });\n      if (metrics.entryExitRiskClass === \"high\") items.push({ severity: \"warning\", title: \"Entry / exit quality\", message: \"Bulging or burr risk is high at the thread entry and exit for this through-hole forming case.\" });\n      if (metrics.formingSeverity === \"high\") items.push({ severity: \"warning\", title: \"Process severity\", message: \"The combined material, core-hole and lubrication window is narrow. Qualify conservatively before increasing output.\" });\n      if (metrics.lubricationAdequacy !== \"poor\" && getAnswer(ctx, \"coolant_lubrication_mode\") === \"external_emulsion\") items.push({ severity: \"info\", title: \"Lubrication reserve\", message: \"External emulsion is workable here, but oil usually gives a wider safety window in thread forming.\" });\n      return items.slice(0, 4);\n    }\n    \n    function buildMachineChecks(ctx, top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"sync_mode\",\n          label: \"Sync tapping mode\",\n          result: metrics.machineMode && metrics.machineMode.indexOf(\"Rigid\") >= 0 ? \"pass\" : metrics.machineMode && metrics.machineMode.indexOf(\"Synchro\") >= 0 ? \"pass\" : \"limited\",\n          note: metrics.machineMode || \"Machine mode not confirmed.\",\n        },\n        {\n          key: \"lubrication\",\n          label: \"Lubrication quality\",\n          result: metrics.lubricationAdequacy === \"good\" ? \"pass\" : metrics.lubricationAdequacy === \"acceptable\" ? \"limited\" : \"fail\",\n          note: metrics.coolantMode || \"Lubrication mode not confirmed.\",\n        },\n      ];\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n        { key: \"fn\", label: \"Feed\", min: metrics.requestedPitchMm, typ: metrics.requestedPitchMm, max: metrics.requestedPitchMm, unit: \"mm/rev\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildRowBackedValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { label: \"Operation\", value: titleCase(metrics.recipeOperationId || \"forming through\"), tone: \"text\" },\n        { label: \"Pre-drill\", value: formatDisplayNumber(metrics.predrillRecommendedMm, 2) || \"n/a\", unit: \"mm\" },\n        { label: \"Coolant\", value: titleCase(metrics.rowCoolantMode || metrics.coolantMode || \"unknown\"), tone: \"text\" },\n        { label: \"vc min\", value: formatDisplayNumber(metrics.recipeVcMin, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n        { label: \"vc max\", value: formatDisplayNumber(metrics.recipeVcMax, 0) || \"n/a\", unit: \"m/min\" },\n      ];\n    }\n    \n    function buildMachineValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { label: \"N\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n        { label: \"VF\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n        { label: \"Severity\", value: titleCase(metrics.formingSeverity || \"medium\"), tone: \"text\" },\n      ];\n    }\n    \n    function buildRecipeTrustCard(top) {\n      var confidence = top.score.recipeConfidence;\n      return {\n        title: \"Cutting-data basis\",\n        tone: confidence === \"exact\" ? \"good\" : confidence === \"near\" ? \"limited\" : \"default\",\n        badge: confidence === \"exact\" ? \"Exact valid forming data\" : confidence === \"near\" ? \"Nearest valid forming data\" : \"Estimated\",\n        value: confidence === \"exact\" ? \"Start values come from a matching forming-through row.\" : confidence === \"near\" ? \"Start values come from the closest valid forming row.\" : \"Start values rely more heavily on candidate geometry and process rules.\",\n        note: \"Feed stays locked to thread pitch. Core-hole accuracy and lubrication remain the bigger release checks in thread forming.\",\n        items: [],\n      };\n    }\n    \n    function buildHolePrepCard(top) {\n      var metrics = top.metrics || {};\n      var tone = metrics.underOverFormRisk === \"nominal\" ? \"good\" : metrics.underOverFormRisk === \"unknown\" ? \"limited\" : \"high\";\n      var badge = metrics.underOverFormRisk === \"nominal\" ? \"Nominal\" : metrics.underOverFormRisk === \"unknown\" ? \"Review\" : metrics.underOverFormRisk === \"overforming-risk\" ? \"Too small\" : \"Too large\";\n      return {\n        title: \"Hole preparation\",\n        tone: tone,\n        badge: badge,\n        value: metrics.underOverFormRisk === \"nominal\"\n          ? \"Core-hole size aligns well with the recommended forming diameter.\"\n          : metrics.underOverFormRisk === \"overforming-risk\"\n            ? \"The current core hole looks too small for stable thread forming.\"\n            : metrics.underOverFormRisk === \"underformed-risk\"\n              ? \"The current core hole looks too large for full thread engagement.\"\n              : \"Core-hole status is not fully confirmed yet, so the release still depends on this check.\",\n        note: metrics.predrillDeltaMm != null ? \"Delta to recommendation: \" + formatDisplayNumber(metrics.predrillDeltaMm, 3) + \" mm.\" : \"Confirm the actual core-hole diameter if quality or torque are critical.\",\n        items: dedupeTextItems([\n          metrics.predrillRecommendedMm != null ? \"Recommended core hole: \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm.\" : null,\n          metrics.predrillActualMm != null ? \"Actual core hole: \" + formatDisplayNumber(metrics.predrillActualMm, 2) + \" mm.\" : null,\n          metrics.requestedTolerance ? \"Target tolerance: \" + metrics.requestedTolerance + \".\" : null,\n        ]).slice(0, 3),\n      };\n    }\n    \n    function buildStoryData(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var why = dedupeTextItems([\n        metrics.requestedThreadIdentity ? \"Thread identity matched to \" + metrics.requestedThreadIdentity + \".\" : null,\n        metrics.formabilityLabel ? metrics.formabilityLabel + \".\" : null,\n        metrics.predrillRecommendedMm != null ? \"Core-hole guidance aligns to \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm for the selected forming tap.\" : null,\n        metrics.requiredDepthRatio != null ? \"Required engagement sits at \" + formatDisplayNumber(metrics.requiredDepthRatio, 2) + \"xD, so the recommendation balances length reserve and forming load.\" : null,\n      ]);\n      var how = dedupeTextItems([\n        \"Start inside the suggested vc band and keep the feed locked exactly to thread pitch.\",\n        metrics.lubricationAdequacy === \"good\" ? \"Keep lubrication stable and generous, because thread forming depends on a continuous lubricating film.\" : \"Do not stretch the output until lubrication quality is fully under control.\",\n        metrics.predrillRecommendedMm != null ? \"Qualify the first threads against the recommended core-hole diameter before increasing output.\" : null,\n        metrics.entryExitRiskClass !== \"low\" ? \"Check entry and exit quality on the first parts, because burr or feathering can dominate the release decision.\" : null,\n      ]);\n      var watch = dedupeTextItems([\n        metrics.underOverFormRisk === \"overforming-risk\" ? \"A small core hole will raise torque quickly and can over-form the profile.\" : null,\n        metrics.underOverFormRisk === \"underformed-risk\" ? \"A large core hole can leave the formed profile weak or gauge-loose.\" : null,\n        metrics.lubricationAdequacy === \"poor\" ? \"Weak lubrication raises cold-welding and smearing risk in thread forming.\" : null,\n        materialProfile && materialProfile.typicalFailure ? \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure).toLowerCase() + \".\" : null,\n        metrics.entryExitRiskClass === \"high\" ? \"Entry and exit remain quality-critical because thread forming displaces material instead of cutting chips.\" : null,\n      ]);\n      return { why: why, how: how, watch: watch };\n    }\n    \n    function buildStoryPanels(ctx, top, riskItems, storyData) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      return {\n        why: {\n          tone: \"good\",\n          eyebrow: \"Technical fit\",\n          title: \"Why it fits\",\n          badge: \"Formability: \" + titleCase(metrics.formabilitySuitabilityClass || \"review\"),\n          highlight: metrics.formabilitySuitabilityClass === \"good\" ? \"Material, thread identity and core-hole window fit standard through-hole thread forming well.\" : \"This case can still be formed, but the material and setup window need tighter control than a standard green case.\",\n          summary: \"Thread forming is chipless, so through-hole suitability is driven more by formability, core-hole accuracy, lubrication and exit quality than by chip evacuation.\",\n          facts: dedupeTextItems([\n            metrics.requestedThreadIdentity ? metrics.requestedThreadIdentity : null,\n            metrics.predrillRecommendedMm != null ? \"Predrill \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm\" : null,\n            metrics.requiredDepthRatio != null ? \"xD \" + formatDisplayNumber(metrics.requiredDepthRatio, 2) : null,\n          ]),\n          items: storyData.why.slice(0, 3),\n        },\n        how: {\n          tone: \"default\",\n          eyebrow: \"Start strategy\",\n          title: \"How to start\",\n          badge: \"Feed = pitch\",\n          highlight: \"Keep the feed synchronized to pitch and do not compensate torque by forcing the feed upward.\",\n          summary: \"Thread forming likes stable lubrication, correct core-hole size and a calm first-part qualification more than aggressive first-shot productivity.\",\n          facts: dedupeTextItems([\n            metrics.recipeVcTyp != null ? \"vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min\" : null,\n            metrics.rpmTyp != null ? \"n \" + formatDisplayNumber(metrics.rpmTyp, 0) + \" rpm\" : null,\n            metrics.feedTypMmMin != null ? \"vf \" + formatDisplayNumber(metrics.feedTypMmMin, 0) + \" mm/min\" : null,\n          ]),\n          items: storyData.how.slice(0, 3),\n        },\n        watch: {\n          tone: riskItems.length > 1 || metrics.formingSeverity === \"high\" ? \"watch\" : \"default\",\n          eyebrow: \"Critical signals\",\n          title: \"Watch-outs\",\n          badge: \"Risk: \" + titleCase(metrics.formingSeverity || \"medium\"),\n          highlight: metrics.underOverFormRisk === \"overforming-risk\" || metrics.underOverFormRisk === \"underformed-risk\"\n            ? \"Core-hole accuracy is the main release limiter in this setup.\"\n            : metrics.lubricationAdequacy === \"poor\"\n              ? \"Lubrication quality is the main release limiter in this setup.\"\n              : metrics.entryExitRiskClass === \"high\"\n                ? \"Entry and exit quality are the main release limiters in this setup.\"\n                : \"Formability and edge quality still decide whether the case stays stable in series.\",\n          summary: materialProfile && materialProfile.avoid ? ensureSentence(materialProfile.avoid) : \"Qualify the first formed threads conservatively before increasing output.\",\n          facts: dedupeTextItems([\n            metrics.entryExitRiskClass ? \"Entry / exit: \" + titleCase(metrics.entryExitRiskClass) : null,\n            metrics.lubricationAdequacy ? \"Lubrication: \" + titleCase(metrics.lubricationAdequacy) : null,\n            materialProfile && materialProfile.typicalFailure ? \"Typical failure: \" + cleanShortText(materialProfile.typicalFailure) : null,\n          ]),\n          items: storyData.watch.slice(0, 3),\n        },\n      };\n    }\n    \n    function buildRefineData(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n      if (metrics.predrillActualMm == null && getAnswer(ctx, \"core_hole_status\") !== \"actual_known\") items.push({ questionId: \"actual_predrill_diameter_mm\", label: \"Confirm core-hole diameter\" });\n      if (!getAnswer(ctx, \"holder_type\")) items.push({ questionId: \"holder_type\", label: \"Confirm holder type\" });\n      if (!getAnswer(ctx, \"quality_sensitivity\")) items.push({ questionId: \"quality_sensitivity\", label: \"Confirm quality target\" });\n      if (!getAnswer(ctx, \"entry_exit_protection\") && getAnswer(ctx, \"entry_exit_sensitivity\") !== \"uncritical\") items.push({ questionId: \"entry_exit_protection\", label: \"Confirm edge protection\" });\n      if (!getAnswer(ctx, \"thread_tolerance\")) items.push({ questionId: \"thread_tolerance\", label: \"Confirm thread tolerance\" });\n      return {\n        visible: items.length > 0 && (top.score.confidence < 0.9 || top.score.recipeConfidence !== \"exact\"),\n        title: \"Improve recommendation confidence\",\n        description: \"Confirm one missing setup detail to tighten the start values and reduce estimation.\",\n        items: items.slice(0, 2),\n      };\n    }\n    \n    function buildDetailPanels(top, alternativeItems) {\n      var metrics = top.metrics || {};\n      var panels = [];\n      panels.push({\n        eyebrow: \"Technical basis\",\n        title: \"Why this starting band is credible\",\n        summary: top.score.recipeConfidence === \"exact\" ? \"The start values come from a matching forming-through row and are then translated into rpm and feed using the requested thread pitch.\" : \"The start values use the nearest valid forming-through row and stay anchored to the selected thread geometry and pitch.\",\n        facts: dedupeTextItems([\n          metrics.formabilityLabel || null,\n          metrics.predrillRecommendedMm != null ? \"Core hole \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm\" : null,\n          metrics.recipeVcTyp != null ? \"vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min\" : null,\n        ]),\n        items: dedupeTextItems([\n          metrics.lubricationAdequacy === \"good\" ? \"Lubrication is strong enough for standard thread forming.\" : \"Lubrication remains one of the main qualification points in this case.\",\n          metrics.tapChamferType ? \"The selected tap uses a \" + metrics.tapChamferType + \" lead, which suits a through-hole forming path better than a bottoming-style lead.\" : null,\n        ]),\n      });\n      panels.push({\n        eyebrow: \"Release checks\",\n        title: \"What to verify before full release\",\n        summary: \"Only keep increasing output once the first parts confirm torque, gauge behavior and edge quality at entry and exit.\",\n        facts: dedupeTextItems([\n          metrics.underOverFormRisk && metrics.underOverFormRisk !== \"unknown\" ? \"Predrill risk: \" + titleCase(metrics.underOverFormRisk) : null,\n          metrics.entryExitRiskClass ? \"Entry / exit: \" + titleCase(metrics.entryExitRiskClass) : null,\n          metrics.formingSeverity ? \"Severity: \" + titleCase(metrics.formingSeverity) : null,\n        ]),\n        items: dedupeTextItems([\n          \"Check GO/NO-GO or equivalent thread acceptance on the first parts.\",\n          metrics.underOverFormRisk === \"overforming-risk\" ? \"Revisit the core-hole diameter before chasing torque or tool changes.\" : null,\n          metrics.entryExitRiskClass === \"high\" ? \"Inspect burr or feathering at both thread ends before increasing output.\" : null,\n        ]),\n      });\n      panels.push({\n        type: \"alternatives\",\n        eyebrow: \"Alternatives\",\n        title: \"Alternatives worth checking\",\n        summary: \"If the material or lubrication window stays marginal, switch process first before forcing the same form-tap deeper into a red zone.\",\n        items: dedupeTextItems([\n          top.metrics && top.metrics.alternativePrimary === \"cut_tap\" ? JSON.stringify({ badge: \"Process fallback\", label: \"Cut tap through\", reason: \"Use cut tapping when material formability or lubrication stay marginal.\" }) : null,\n          top.metrics && top.metrics.alternativeProcessFlag ? JSON.stringify({ badge: \"Escalation path\", label: \"Thread milling\", reason: \"Consider thread milling when quality is critical and the forming window stays narrow.\" }) : null,\n        ].concat((alternativeItems || []).map(function mapItem(item) {\n          return JSON.stringify({ badge: \"Tool option\", label: item.label, reason: item.reason });\n        }))).map(function parseItem(text) {\n          try {\n            return JSON.parse(text);\n          } catch (error) {\n            return null;\n          }\n        }).filter(Boolean),\n      });\n      return panels;\n    }\n    \n    function buildSetupNotes(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      return [\n        { area: \"forming\", message: \"spanless process with \" + (metrics.tapChamferType || \"plug\") + \" lead and \" + (metrics.formabilityLabel || \"material review\") },\n        { area: \"core_hole\", message: \"recommended predrill \" + (metrics.predrillRecommendedMm != null ? formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm\" : \"not available\") + \", risk \" + titleCase(metrics.underOverFormRisk || \"unknown\") },\n        { area: \"entry_exit\", message: \"entry/exit sensitivity \" + titleCase(metrics.entryExitRiskClass || \"medium\") + \" with \" + (getAnswer(ctx, \"entry_exit_protection\") || \"no confirmed edge protection\") },\n        { area: \"material\", message: materialProfile ? materialProfile.code + \" - \" + materialProfile.label + \", typical failure \" + cleanShortText(materialProfile.typicalFailure || \"not stated\") : \"material profile not available\" },\n        { area: \"troubleshooting\", message: buildTroubleshootingHandles(ctx, top).length > 0 ? \"focused troubleshooting loaded for \" + buildTroubleshootingHandles(ctx, top).length + \" likely issue paths\" : \"no focused troubleshooting needed from current inputs\" },\n      ];\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var alternativeItems;\n      var riskItems;\n      var machineChecks;\n      var storyData;\n      var storyPanels;\n      var troubleshooting;\n      var heroBlock;\n      var threadBlock;\n      var kpiBlock;\n      var toleranceBlock;\n      var recipeBlock;\n      var riskBlock;\n      var machineBlock;\n      var setupBlock;\n      var alternativesBlock;\n      var commerceBlock;\n    \n      if (!top || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"forming_through\",\n          outcome: \"no_match\",\n          summary: \"No safe through-hole thread-forming recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current setup is incomplete or incompatible for a safe through-hole thread-forming recommendation.\"),\n            noMatchGuidance({\n              message: \"Check thread designation, material formability, synchronized tapping mode, lubrication and core-hole diameter. If the forming window stays narrow, move to cut tapping first and thread milling only as the higher-escalation fallback.\",\n              steps: [\n                \"Confirm the exact thread designation and tolerance.\",\n                \"Check whether the material is really formable enough for thread forming.\",\n                \"Verify a synchronized tapping cycle and adequate lubrication.\",\n                \"Provide the actual or target core-hole diameter.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust thread setup\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      alternativeItems = buildAlternativeItems(scored);\n      riskItems = buildRiskItems(ctx, top);\n      machineChecks = buildMachineChecks(ctx, top);\n      storyData = buildStoryData(ctx, top);\n      storyPanels = buildStoryPanels(ctx, top, riskItems, storyData);\n      troubleshooting = buildTroubleshootingCards(ctx, top);\n    \n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best fit for \" + (metrics.requestedThreadIdentity || \"the requested thread\") + \" - Through-Hole Thread Forming in \" + (getMaterialLabel(ctx) || \"the selected material\") + \".\",\n        headerPills: [\n          { tone: \"good\", text: \"Best fit\" },\n          { tone: top.score.confidence >= 0.88 ? \"good\" : top.score.confidence >= 0.75 ? \"default\" : \"watch\", text: \"Confidence: \" + (top.score.confidence >= 0.88 ? \"High\" : top.score.confidence >= 0.75 ? \"Medium\" : \"Review\") },\n          { tone: metrics.formabilitySuitabilityClass === \"good\" ? \"good\" : metrics.formabilitySuitabilityClass === \"conditional\" ? \"default\" : \"watch\", text: \"Formability: \" + titleCase(metrics.formabilitySuitabilityClass || \"review\") },\n          { tone: metrics.formingSeverity === \"high\" ? \"watch\" : \"default\", text: \"Risk: \" + titleCase(metrics.formingSeverity || \"medium\") },\n        ],\n      };\n    \n      threadBlock = threadIdentity({\n        standard: metrics.requestedThreadForm,\n        size: metrics.requestedThreadSize,\n        pitch: metrics.requestedPitchMm,\n        tolerance: metrics.requestedTolerance,\n        blindThrough: \"through\",\n      });\n      kpiBlock = fitKpis([\n        { key: \"thread_identity\", label: \"Thread identity\", value: (top.score.parts.threadIdentity || 0).toFixed(2), status: (top.score.parts.threadIdentity || 0) >= 2.5 ? \"good\" : \"ok\" },\n        { key: \"formability\", label: \"Formability\", value: (top.score.parts.formability || 0).toFixed(2), status: metrics.formabilitySuitabilityClass === \"good\" ? \"good\" : \"ok\" },\n        { key: \"predrill_fit\", label: \"Pre-drill fit\", value: (top.score.parts.predrillFit || 0).toFixed(2), status: (top.score.parts.predrillFit || 0) >= 1 ? \"good\" : \"ok\" },\n        { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.8 ? \"good\" : \"ok\" },\n      ]);\n      toleranceBlock = toleranceNotes([\n        \"Requested tolerance: \" + String(metrics.requestedTolerance || metrics.candidateTolerance || \"not specified\"),\n        \"Candidate tolerance: \" + String(metrics.candidateTolerance || \"not specified\"),\n      ]);\n      recipeBlock = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: buildRecipeValues(top),\n      });\n      recipeBlock.data.presentation = {\n        title: \"Start here\",\n        description: \"Use these as the first safe forming values. Keep feed synchronized to thread pitch and qualify the first threads before increasing output.\",\n        rowBackedValues: buildRowBackedValues(top),\n        machineValues: buildMachineValues(top),\n        trustCard: buildRecipeTrustCard(top),\n        holePrepCard: buildHolePrepCard(top),\n      };\n      riskBlock = riskNotes(riskItems);\n      machineBlock = machineFeasibility(machineChecks);\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine & lubrication\",\n          tone: metrics.lubricationAdequacy === \"good\" && metrics.machineMode && metrics.machineMode.indexOf(\"Rigid\") >= 0 ? \"good\" : metrics.lubricationAdequacy === \"poor\" ? \"high\" : \"limited\",\n          badge: metrics.lubricationAdequacy === \"good\" ? \"Checked\" : metrics.lubricationAdequacy === \"poor\" ? \"Risk\" : \"Review\",\n          value: metrics.machineMode + \" with \" + (metrics.coolantMode || \"unspecified lubrication\") + \".\",\n          note: \"Thread forming cares more about synchronized feed and lubrication quality than about chip evacuation.\",\n          items: dedupeTextItems(machineChecks.map(function mapCheck(item) {\n            return item.label + \": \" + item.note;\n          })),\n        },\n      };\n      setupBlock = setupNotes(buildSetupNotes(ctx, top));\n      setupBlock.data.presentation = {\n        stories: storyData,\n        storyPanels: storyPanels,\n        refine: buildRefineData(ctx, top),\n        detailPanels: buildDetailPanels(top, alternativeItems),\n        troubleshooting: troubleshooting,\n      };\n      alternativesBlock = alternatives(alternativeItems);\n      commerceBlock = commerceCta({\n        productUrl: candidate.catalog.url,\n        available: candidate.commerce.available,\n        priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n        ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n      });\n      commerceBlock.data.presentation = {\n        eyebrow: \"Order this tool\",\n        availabilityLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Ready to review\",\n        availabilityNote: candidate.ids.sku || \"\",\n      };\n    \n      return createResultViewModel({\n        processId: \"forming_through\",\n        outcome: top.score.total >= 5.1 ? \"match\" : \"limited_match\",\n        summary: \"Best through-hole thread-forming match based on thread identity, material formability, core-hole logic, lubrication and process robustness.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          threadBlock,\n          kpiBlock,\n          toleranceBlock,\n          recipeBlock,\n          riskBlock,\n          machineBlock,\n          setupBlock,\n          alternativesBlock,\n          commerceBlock,\n        ],\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust thread setup\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/forming-through/questions.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { toNullableDraftNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getQuestionDefinition } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function cloneQuestion(questionId, overrides) {\n      return createQuestionDef(Object.assign({}, getQuestionDefinition(questionId), overrides || {}));\n    }\n    \n    function createTokenQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: config.type || \"chips\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: config.options || [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableString(value);\n        },\n        validate: config.validate || null,\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function createNumberQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: \"number\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: config.unit || null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableDraftNumber(value);\n        },\n        validate: config.validate || function validate(value) {\n          if (value == null) return [];\n          return value > 0\n            ? []\n            : [{ field: config.id, message: \"Please enter a positive value.\", severity: \"error\", code: \"positive_required\" }];\n        },\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"half\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function createTextQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: \"text\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableString(value);\n        },\n        validate: config.validate || null,\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function getThreadStandardFromAnswers(ctx) {\n      var explicit = toNullableString(ctx && ctx.answers && ctx.answers.thread_standard_choice);\n      if (explicit) return explicit.toUpperCase();\n      explicit = toNullableString(ctx && ctx.derived && ctx.derived.thread_standard);\n      return explicit ? explicit.toUpperCase() : null;\n    }\n    \n    function looksLikePipeThread(ctx) {\n      var explicitStandard = getThreadStandardFromAnswers(ctx);\n      var designation = toNullableString(ctx && ctx.answers && ctx.answers.thread_designation_override);\n    \n      if (explicitStandard) {\n        return explicitStandard === \"G\" || explicitStandard === \"NPT\" || explicitStandard === \"R\";\n      }\n      if (!designation) return false;\n      designation = designation.toUpperCase();\n      return designation.indexOf(\"NPT\") >= 0 || designation.indexOf(\"G\") === 0 || designation.indexOf(\"R\") === 0;\n    }\n    \n    function getQuestions() {\n      return [\n        createTokenQuestion({\n          id: \"thread_standard_choice\",\n          label: \"Which thread type do you need?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: the thread type defines the standard family, the automatic pitch rule and the exact form-tap program that can fit.\",\n          options: [\n            { value: \"M\", label: \"M coarse\" },\n            { value: \"MF\", label: \"MF fine\" },\n            { value: \"UNC\", label: \"UNC\" },\n            { value: \"UNF\", label: \"UNF\" },\n            { value: \"G\", label: \"G / BSPP\" },\n            { value: \"NPT\", label: \"NPT\" },\n          ],\n        }),\n        createTextQuestion({\n          id: \"thread_nominal_size\",\n          label: \"What is the nominal thread size?\",\n          placeholder: \"Metric example: 10 | Inch example: 1/4\",\n          group: \"core\",\n          required: true,\n          viewHint: { width: \"half\", emphasis: \"high\" },\n          helpText: \"Why it matters: the nominal size is enough to derive the standard pitch automatically for the supported thread families, so the operator does not need to type a full designation.\",\n          validate: function validate(value) {\n            var text = toNullableString(value);\n            if (!text) {\n              return [{ field: \"thread_nominal_size\", message: \"Enter the nominal thread size.\", severity: \"error\", code: \"required\" }];\n            }\n            return [];\n          },\n        }),\n        createTokenQuestion({\n          id: \"material_formability_class\",\n          label: \"How formable is the workpiece material in practice?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: Step 1 already fixed the ISO subgroup. This extra input only captures the forming-specific gate: whether the material is really ductile enough for thread forming, or whether strength, hardness or cast structure make cutting safer.\",\n          options: [\n            { value: \"good_formable\", label: \"Good / standard formability\" },\n            { value: \"higher_strength\", label: \"Higher-strength\" },\n            { value: \"hard_hardened\", label: \"Hard / hardened\" },\n            { value: \"cast_iron\", label: \"Cast-iron like\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        cloneQuestion(\"thread_length_mm\", {\n          label: \"Required full thread length\",\n          helpText: \"Why it matters: even without chips, full thread length still drives usable length, APMX reserve, forming load and the severity of the setup.\",\n          group: \"core\",\n          required: true,\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        createTokenQuestion({\n          id: \"sync_tapping_capability\",\n          label: \"Which tapping mode is available on the machine?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: thread forming needs a synchronized feed-to-pitch relationship and carries higher torque than cut tapping, so weak synchronization quickly narrows the process window.\",\n          options: [\n            { value: \"rigid\", label: \"Rigid tapping\" },\n            { value: \"synchro_chuck\", label: \"Synchro chuck\" },\n            { value: \"unknown\", label: \"Unsure\" },\n            { value: \"no\", label: \"No sync mode\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"coolant_lubrication_mode\",\n          label: \"Which lubrication or cooling is available?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: lubrication is one of the dominant process levers in thread forming. It changes torque, cold welding risk, tool life and the final gauge behavior far more strongly than in many cut-tapping cases.\",\n          options: [\n            { value: \"through_emulsion\", label: \"Through coolant / emulsion\" },\n            { value: \"external_emulsion\", label: \"External emulsion\" },\n            { value: \"oil\", label: \"Cutting oil\" },\n            { value: \"mql\", label: \"MQL / mist\" },\n            { value: \"dry\", label: \"Dry\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"core_hole_status\",\n          label: \"What is the core-hole status?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: pre-drill diameter is more critical in thread forming than in cut tapping. Too small drives over-forming and torque; too large can weaken thread engagement and gauge fit.\",\n          options: [\n            { value: \"actual_known\", label: \"Actual drill diameter is known\" },\n            { value: \"fixed_unknown\", label: \"Prepared, but actual size is unknown\" },\n            { value: \"recommend\", label: \"Need a recommendation\" },\n            { value: \"missing\", label: \"No core hole prepared yet\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"entry_exit_sensitivity\",\n          label: \"How critical is burr or bulging at entry and exit?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: through-hole forming does not fight chip evacuation, but it does push material at entry and exit. That makes burr, feathering and bulging a real quality driver in the final recommendation.\",\n          options: [\n            { value: \"uncritical\", label: \"Not critical\" },\n            { value: \"entry_critical\", label: \"Critical at entry\" },\n            { value: \"exit_critical\", label: \"Critical at exit\" },\n            { value: \"both_critical\", label: \"Critical at both\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        cloneQuestion(\"thread_tolerance\", {\n          label: \"Target tolerance override\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: false,\n          helpText: \"Why it matters: if the standard default tolerance is not enough, this tightens the form-tap choice and the final fit-class check.\",\n          placeholder: \"e.g. 6H, 6HX or 2B\",\n          viewHint: { width: \"half\", emphasis: \"normal\" },\n        }),\n        createTextQuestion({\n          id: \"thread_designation_override\",\n          label: \"Custom thread designation override\",\n          placeholder: \"e.g. M10x1.5-6H or 1/4-20UNC-2B\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: use this only when the automatic type + size route does not cover the requested thread. The override wins over the simplified entry path.\",\n        }),\n        createTokenQuestion({\n          id: \"priority\",\n          label: \"What matters most?\",\n          group: \"advanced\",\n          required: false,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: when several form taps are technically valid, this biases the ranking toward process security, quality, tool life or productivity.\",\n          options: [\n            { value: \"process_security\", label: \"Process security\" },\n            { value: \"thread_quality\", label: \"Thread quality\" },\n            { value: \"tool_life\", label: \"Tool life\" },\n            { value: \"productivity\", label: \"Productivity\" },\n          ],\n        }),\n        createNumberQuestion({\n          id: \"actual_predrill_diameter_mm\",\n          label: \"Actual core-hole diameter\",\n          unit: \"mm\",\n          group: \"core\",\n          required: true,\n          expertOnly: false,\n          visibleWhen: function visibleWhen(ctx) {\n            return toNullableString(ctx && ctx.answers && ctx.answers.core_hole_status) === \"actual_known\";\n          },\n          helpText: \"Why it matters: when the real core hole is known, the module can judge over-forming or under-forming risk much more reliably.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        createTokenQuestion({\n          id: \"material_strength_class\",\n          label: \"Any extra strength or hardness clue?\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: this only refines the forming gate when the ISO subgroup is still too broad. It is not a replacement for the Step 1 material selection.\",\n          options: [\n            { value: \"standard\", label: \"No extra concern\" },\n            { value: \"higher_strength\", label: \"Higher strength\" },\n            { value: \"hard_hardened\", label: \"Hard / hardened\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"holder_type\",\n          label: \"Which holder is used?\",\n          group: \"machine\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: holder behavior changes how well the setup tolerates small pitch errors and how much torque shock reaches the tool during forming.\",\n          options: [\n            { value: \"rigid_holder\", label: \"Rigid holder\" },\n            { value: \"synchro_chuck\", label: \"Synchro chuck\" },\n            { value: \"length_comp\", label: \"Length compensation\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"entry_exit_protection\",\n          label: \"Is there any edge protection at entry or exit?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: protection features like chamfers, counterbores or controlled exit conditions can lower bulging and burr sensitivity in through-hole forming.\",\n          options: [\n            { value: \"none\", label: \"None\" },\n            { value: \"entry_only\", label: \"Entry protection only\" },\n            { value: \"exit_only\", label: \"Exit protection only\" },\n            { value: \"both\", label: \"Both entry and exit\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"quality_sensitivity\",\n          label: \"Is the thread quality target especially critical?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: gauge-critical, low-burr or appearance-critical formed threads justify a more conservative recommendation and tighter release notes.\",\n          options: [\n            { value: \"general\", label: \"General quality\" },\n            { value: \"gauge_critical\", label: \"Gauge critical\" },\n            { value: \"low_burr\", label: \"Low burr priority\" },\n            { value: \"appearance_critical\", label: \"Appearance critical\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"problem_history\",\n          label: \"What has gone wrong before, if anything?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: previous cold welding, high torque, gauge problems or burrs are strong indicators for a safer forming recommendation and better release guidance.\",\n          options: [\n            { value: \"none\", label: \"No recurring issue\" },\n            { value: \"cold_welding\", label: \"Cold welding / smearing\" },\n            { value: \"high_torque\", label: \"High torque\" },\n            { value: \"gauge_tight\", label: \"Thread too tight\" },\n            { value: \"gauge_loose\", label: \"Thread too loose\" },\n            { value: \"burrs\", label: \"Burrs / bulging\" },\n          ],\n        }),\n        cloneQuestion(\"sealing_relevant\", {\n          label: \"Is sealing or pipe-thread function relevant?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          visibleWhen: function visibleWhen(ctx) {\n            return looksLikePipeThread(ctx);\n          },\n          helpText: \"Why it matters: sealing function changes how strictly the thread standard and tolerance need to be respected, especially for pipe-thread styles.\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n        }),\n      ];\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/forming-through/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, createRecipe, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getAnswer, prefilterByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var AUTO_THREAD_LIBRARY = Object.freeze({\n      M: Object.freeze({ \"3\": \"0.5\", \"4\": \"0.7\", \"5\": \"0.8\", \"6\": \"1\", \"8\": \"1.25\", \"10\": \"1.5\", \"12\": \"1.75\", \"14\": \"2\", \"16\": \"2\", \"18\": \"2.5\", \"20\": \"2.5\" }),\n      MF: Object.freeze({ \"6\": \"0.75\", \"8\": \"1\", \"10\": \"1.25\", \"12\": \"1.5\", \"14\": \"1.5\", \"16\": \"1.5\" }),\n      UNC: Object.freeze({ \"1/4\": \"20\", \"5/16\": \"18\", \"3/8\": \"16\", \"1/2\": \"13\" }),\n      UNF: Object.freeze({ \"1/4\": \"28\", \"5/16\": \"24\", \"3/8\": \"24\", \"1/2\": \"20\" }),\n      G: Object.freeze({ \"1/8\": \"28\", \"1/4\": \"19\", \"3/8\": \"19\", \"1/2\": \"14\" }),\n      NPT: Object.freeze({ \"1/8\": \"27\", \"1/4\": \"18\", \"3/8\": \"18\", \"1/2\": \"14\" }),\n    });\n    \n    function clamp01(value) {\n      if (!Number.isFinite(value)) return 0;\n      return value <= 0 ? 0 : value >= 1 ? 1 : value;\n    }\n    \n    function roundValue(value, digits) {\n      var factor = Math.pow(10, digits == null ? 2 : digits);\n      return value == null || !Number.isFinite(value) ? null : Math.round(value * factor) / factor;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function normalizeTolerance(value) {\n      var text = toNullableString(value);\n      return text ? text.toUpperCase().replace(/\\s+/g, \"\") : null;\n    }\n    \n    function normalizeThreadForm(value) {\n      var text = toNullableString(value);\n      if (!text) return null;\n      text = text.toUpperCase();\n      if (text.indexOf(\"UNF\") >= 0) return \"UNF\";\n      if (text.indexOf(\"UNC\") >= 0) return \"UNC\";\n      if (text.indexOf(\"NPT\") >= 0) return \"NPT\";\n      if (text.indexOf(\"MF\") === 0) return \"MF\";\n      if (text.indexOf(\"M\") === 0) return \"M\";\n      if (text.indexOf(\"G\") === 0) return \"G\";\n      if (text.indexOf(\"R\") === 0) return \"R\";\n      return text;\n    }\n    \n    function normalizeNominalSize(threadStandard, nominalSize) {\n      var text = toNullableString(nominalSize);\n      if (!text) return null;\n      text = text.replace(/\\s+/g, \"\");\n      return threadStandard === \"UNC\" || threadStandard === \"UNF\" || threadStandard === \"G\" || threadStandard === \"NPT\"\n        ? text\n        : text.replace(/^M/i, \"\");\n    }\n    \n    function parseFraction(text) {\n      var token = toNullableString(text);\n      var parts;\n      if (!token) return null;\n      if (token.indexOf(\"-\") >= 0) {\n        parts = token.split(\"-\");\n        return parseFraction(parts[0]) + parseFraction(parts[1]);\n      }\n      if (token.indexOf(\"/\") >= 0) {\n        parts = token.split(\"/\");\n        return Number(parts[0]) / Number(parts[1]);\n      }\n      return toNullableNumber(token);\n    }\n    \n    function buildAutoDesignation(threadStandard, nominalSize, tolerance) {\n      var standard = normalizeThreadForm(threadStandard);\n      var sizeKey = normalizeNominalSize(standard, nominalSize);\n      var pitchToken = standard && sizeKey && AUTO_THREAD_LIBRARY[standard] ? AUTO_THREAD_LIBRARY[standard][sizeKey] : null;\n      if (!pitchToken) return { designation: null, supported: false, standard: standard, nominalSize: sizeKey };\n      if (standard === \"M\" || standard === \"MF\") {\n        return { designation: standard + sizeKey + \"x\" + pitchToken + (tolerance ? \"-\" + tolerance : \"\"), supported: true, standard: standard, nominalSize: sizeKey, pitchToken: pitchToken };\n      }\n      return { designation: sizeKey + \"-\" + pitchToken + standard + (tolerance ? \"-\" + tolerance : \"\"), supported: true, standard: standard, nominalSize: sizeKey, pitchToken: pitchToken };\n    }\n    \n    function buildManualDesignation(threadStandard, nominalSize) {\n      var standard = normalizeThreadForm(threadStandard);\n      var text = toNullableString(nominalSize);\n      var compact;\n      if (!standard || !text) return null;\n      compact = text.trim().toUpperCase().replace(/\\s+/g, \"\");\n      if (!compact) return null;\n      if (/^[A-Z]/.test(compact)) return compact;\n      if (standard === \"M\" || standard === \"MF\") return standard + compact;\n      if (standard === \"G\" || standard === \"R\") return standard + compact;\n      if (standard === \"UNC\" || standard === \"UNF\" || standard === \"NPT\") {\n        return compact.indexOf(\"-\") >= 0 ? compact + standard : compact;\n      }\n      return compact;\n    }\n    \n    function parseThreadIdentity(designation, explicitTolerance, explicitForm) {\n      var text = toNullableString(designation);\n      var tolerance = normalizeTolerance(explicitTolerance);\n      var form = normalizeThreadForm(explicitForm);\n      var compact;\n      var match;\n      if (!text) return { standard: null, size: null, pitch: null, pitchMm: null, tolerance: tolerance, pipeFlag: false, nominalDiameterMm: null, canonicalLabel: null, valid: false };\n      compact = text.replace(/\\s+/g, \"\").toUpperCase();\n      match = compact.match(/^([A-Z]+)([0-9]+(?:[.,][0-9]+)?)(?:X([0-9]+(?:[.,][0-9]+)?))?(?:-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = form || normalizeThreadForm(match[1]);\n        tolerance = tolerance || normalizeTolerance(match[4]);\n        return {\n          standard: form,\n          size: form + match[2] + (match[3] ? \"x\" + match[3].replace(\",\", \".\") : \"\"),\n          pitch: match[3] ? match[3].replace(\",\", \".\") : null,\n          pitchMm: match[3] ? toNullableNumber(match[3]) : null,\n          tolerance: tolerance,\n          pipeFlag: form === \"G\" || form === \"NPT\" || form === \"R\",\n          nominalDiameterMm: toNullableNumber(match[2]),\n          canonicalLabel: (form + match[2] + (match[3] ? \"x\" + match[3].replace(\",\", \".\") : \"\")) + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n      match = compact.match(/^([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)\\-([0-9]+)(UNC|UNF|NPT)(?:\\-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = form || normalizeThreadForm(match[3]);\n        tolerance = tolerance || normalizeTolerance(match[4]);\n        return {\n          standard: form,\n          size: match[1] + \"-\" + match[2] + form,\n          pitch: match[2],\n          pitchMm: toNullableNumber(match[2]) ? 25.4 / Number(match[2]) : null,\n          tolerance: tolerance,\n          pipeFlag: form === \"NPT\",\n          nominalDiameterMm: parseFraction(match[1]) != null ? parseFraction(match[1]) * 25.4 : null,\n          canonicalLabel: match[1] + \"-\" + match[2] + form + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n      return { standard: form || normalizeThreadForm(compact), size: compact, pitch: null, pitchMm: null, tolerance: tolerance, pipeFlag: compact.indexOf(\"NPT\") >= 0 || compact.indexOf(\"G\") === 0 || compact.indexOf(\"R\") === 0, nominalDiameterMm: null, canonicalLabel: compact + (tolerance ? \"-\" + tolerance : \"\"), valid: false };\n    }\n    \n    function getMaterialGroup(materialCode) {\n      var text = toNullableString(materialCode);\n      return text ? text.charAt(0).toUpperCase() : null;\n    }\n    \n    function mapSyncMode(value) {\n      switch (toNullableString(value)) {\n        case \"rigid\": return { code: \"rigid\", label: \"Rigid tapping\", score: 1, stable: true };\n        case \"synchro_chuck\": return { code: \"synchro\", label: \"Synchro chuck\", score: 0.92, stable: true };\n        case \"no\": return { code: \"none\", label: \"No synchronized tapping mode\", score: 0.12, stable: false };\n        case \"unknown\": return { code: \"unknown\", label: \"Unspecified tapping mode\", score: 0.55, stable: false };\n        default: return { code: \"unknown\", label: \"Unspecified tapping mode\", score: 0.45, stable: false };\n      }\n    }\n    \n    function mapLubrication(value) {\n      switch (toNullableString(value)) {\n        case \"through_emulsion\": return { code: \"through_emulsion\", normalized: \"through\", label: \"Through coolant / emulsion\", baseScore: 0.82 };\n        case \"external_emulsion\": return { code: \"external_emulsion\", normalized: \"external\", label: \"External emulsion\", baseScore: 0.72 };\n        case \"oil\": return { code: \"oil\", normalized: \"external\", label: \"Cutting oil\", baseScore: 1 };\n        case \"mql\": return { code: \"mql\", normalized: \"mist\", label: \"MQL / mist\", baseScore: 0.45 };\n        case \"dry\": return { code: \"dry\", normalized: \"dry\", label: \"Dry\", baseScore: 0.1 };\n        default: return { code: \"unknown\", normalized: \"unknown\", label: \"Unspecified lubrication\", baseScore: 0.38 };\n      }\n    }\n    \n    function mapEntryExit(value) {\n      switch (toNullableString(value)) {\n        case \"uncritical\": return { code: \"low\", label: \"Entry and exit not critical\", input: \"uncritical\", weight: 0.18 };\n        case \"entry_critical\": return { code: \"medium\", label: \"Entry quality critical\", input: \"entry_critical\", weight: 0.48 };\n        case \"exit_critical\": return { code: \"medium\", label: \"Exit quality critical\", input: \"exit_critical\", weight: 0.55 };\n        case \"both_critical\": return { code: \"high\", label: \"Entry and exit both critical\", input: \"both_critical\", weight: 0.86 };\n        case \"unknown\": return { code: \"medium\", label: \"Entry and exit sensitivity unknown\", input: \"unknown\", weight: 0.42 };\n        default: return { code: \"medium\", label: \"Entry and exit sensitivity unspecified\", input: null, weight: 0.45 };\n      }\n    }\n    \n    function deriveFormability(ctx, materialCode) {\n      var answer = toNullableString(getAnswer(ctx, \"material_formability_class\"));\n      var strengthHint = toNullableString(getAnswer(ctx, \"material_strength_class\"));\n      var group = getMaterialGroup(materialCode);\n      var code = group === \"N\" ? \"good\" : group === \"P\" ? (String(materialCode || \"\").toUpperCase() === \"P4\" || String(materialCode || \"\").toUpperCase() === \"P6\" ? \"conditional\" : \"good\") : group === \"M\" ? \"conditional\" : group === \"S\" ? \"conditional\" : \"poor\";\n      var score = code === \"good\" ? 0.9 : code === \"conditional\" ? 0.62 : 0.2;\n      var label = code === \"good\" ? \"Material formability supports forming\" : code === \"conditional\" ? \"Material formability narrows the forming window\" : \"Material formability is weak for standard forming\";\n      var hardStop = false;\n      if (answer === \"good_formable\" && code !== \"poor\") { code = \"good\"; score = Math.max(score, 0.92); label = \"Material described as formable\"; }\n      if (answer === \"higher_strength\") { code = code === \"poor\" ? \"poor\" : \"conditional\"; score = code === \"poor\" ? 0.24 : 0.56; label = \"Higher strength narrows the forming window\"; }\n      if (answer === \"cast_iron\") { code = \"reject\"; score = 0; label = \"Cast-iron-like material is outside the normal forming window\"; hardStop = true; }\n      if (answer === \"hard_hardened\" || strengthHint === \"hard_hardened\") { code = \"reject\"; score = 0; label = \"Hard or hardened material is outside the normal forming window\"; hardStop = true; }\n      if (strengthHint === \"higher_strength\" && code === \"good\") { code = \"conditional\"; score = 0.58; label = \"Strength hint narrows the forming window\"; }\n      return { code: code, label: label, score: score, hardStop: hardStop, input: answer };\n    }\n    \n    function deriveLubricationAdequacy(materialGroup, lubrication) {\n      var score = lubrication.baseScore;\n      if (materialGroup === \"M\" || materialGroup === \"S\") score = lubrication.code === \"oil\" ? 1 : lubrication.code === \"through_emulsion\" ? 0.85 : lubrication.code === \"external_emulsion\" ? 0.62 : lubrication.code === \"mql\" ? 0.3 : lubrication.code === \"dry\" ? 0.05 : 0.32;\n      if (materialGroup === \"N\") score = lubrication.code === \"oil\" ? 0.92 : lubrication.code === \"external_emulsion\" || lubrication.code === \"through_emulsion\" ? 0.82 : score;\n      if (materialGroup === \"K\" || materialGroup === \"H\") score = Math.min(score, 0.18);\n      return { code: score >= 0.82 ? \"good\" : score <= 0.3 ? \"poor\" : \"acceptable\", label: score >= 0.82 ? \"Lubrication supports forming well\" : score <= 0.3 ? \"Lubrication is weak for thread forming\" : \"Lubrication is workable with caution\", fitScore: clamp01(score) };\n    }\n    \n    function normalizeCoreHoleRoute(value) {\n      return toNullableString(value) || \"recommend\";\n    }\n    \n    function normalizeChamferType(value) {\n      var text = toNullableString(value);\n      if (!text) return null;\n      text = text.toUpperCase();\n      if (text.indexOf(\"PLUG\") >= 0 || text.indexOf(\"4P\") >= 0 || text.indexOf(\"3P\") >= 0 || text.indexOf(\"2P\") >= 0 || text === \"B\") return \"plug\";\n      if (text.indexOf(\"BOTTOM\") >= 0 || text === \"E\") return \"bottoming\";\n      if (text.indexOf(\"SHORT\") >= 0 || text === \"C\") return \"short\";\n      return text.toLowerCase();\n    }\n    \n    function buildDerived(ctx) {\n      var tolerance = normalizeTolerance(getAnswer(ctx, \"thread_tolerance\"));\n      var simpleThread = buildAutoDesignation(getAnswer(ctx, \"thread_standard_choice\"), getAnswer(ctx, \"thread_nominal_size\"), tolerance);\n      var designation = toNullableString(getAnswer(ctx, \"thread_designation_override\")) || simpleThread.designation || toNullableString(getAnswer(ctx, \"thread_designation\"));\n      var parsed = parseThreadIdentity(designation, tolerance, getAnswer(ctx, \"thread_standard_choice\"));\n      var materialCode = ctx.material && ctx.material.subgroupCode;\n      var materialGroup = getMaterialGroup(materialCode);\n      var lubrication = mapLubrication(getAnswer(ctx, \"coolant_lubrication_mode\"));\n      return {\n        parsed: parsed,\n        simpleThread: simpleThread,\n        canonicalDesignation: designation,\n        materialCode: materialCode,\n        materialGroup: materialGroup,\n        formability: deriveFormability(ctx, materialCode),\n        lubrication: lubrication,\n        lubricationAdequacy: deriveLubricationAdequacy(materialGroup, lubrication),\n        machineMode: mapSyncMode(getAnswer(ctx, \"sync_tapping_capability\")),\n        coreHoleRoute: normalizeCoreHoleRoute(getAnswer(ctx, \"core_hole_status\")),\n        entryExit: mapEntryExit(getAnswer(ctx, \"entry_exit_sensitivity\")),\n        threadLengthMm: toNullableNumber(getAnswer(ctx, \"thread_length_mm\")),\n        actualPredrillMm: toNullableNumber(getAnswer(ctx, \"actual_predrill_diameter_mm\")),\n        nominalDiameterMm: parsed.nominalDiameterMm,\n        pitchMm: parsed.pitchMm,\n        threadTolerance: tolerance || parsed.tolerance,\n        threadDepthRatio: parsed.nominalDiameterMm && toNullableNumber(getAnswer(ctx, \"thread_length_mm\")) ? Number(getAnswer(ctx, \"thread_length_mm\")) / parsed.nominalDiameterMm : null,\n        recommendedChamferClass: \"Plug\",\n        holderType: toNullableString(getAnswer(ctx, \"holder_type\")),\n        qualitySensitivity: toNullableString(getAnswer(ctx, \"quality_sensitivity\")),\n        problemHistory: toNullableString(getAnswer(ctx, \"problem_history\")),\n        priority: toNullableString(getAnswer(ctx, \"priority\")),\n        sealingRelevant: toNullableString(getAnswer(ctx, \"sealing_relevant\")) === \"yes\",\n        entryExitProtection: toNullableString(getAnswer(ctx, \"entry_exit_protection\")),\n      };\n    }\n    \n    function derive(ctx) {\n      var derived = buildDerived(ctx);\n      return {\n        thread_designation: derived.canonicalDesignation,\n        thread_standard: derived.parsed.standard,\n        thread_size: derived.parsed.size,\n        pitch: derived.parsed.pitch,\n        pitch_mm: derived.parsed.pitchMm,\n        pipe_flag: derived.parsed.pipeFlag,\n        thread_tolerance_target: derived.threadTolerance,\n        requested_thread_nominal_mm: derived.nominalDiameterMm,\n        required_full_thread_length_mm: derived.threadLengthMm,\n        required_depth_ratio: derived.threadDepthRatio,\n        machine_mode_class: derived.machineMode.label,\n        coolant_mode_normalized: derived.lubrication.normalized,\n        predrill_validation_route: derived.coreHoleRoute,\n        recommended_chamfer_class: derived.recommendedChamferClass,\n        formability_suitability_class: derived.formability.code,\n        formability_suitability_label: derived.formability.label,\n        entry_exit_risk_class: derived.entryExit.code,\n        entry_exit_risk_label: derived.entryExit.label,\n      };\n    }\n    \n    function validate(ctx) {\n      var derived = buildDerived(ctx);\n      var issues = [];\n      if (getAnswer(ctx, \"thread_standard_choice\") && getAnswer(ctx, \"thread_nominal_size\") && !derived.simpleThread.supported && !getAnswer(ctx, \"thread_designation_override\")) issues.push({ field: \"thread_nominal_size\", message: \"This nominal size is not yet available for automatic pitch derivation. Use the custom designation override for this thread.\", severity: \"error\", code: \"thread_size_not_supported\" });\n      if (derived.lubricationAdequacy.code === \"poor\") issues.push({ field: \"coolant_lubrication_mode\", message: \"Lubrication is weak for thread forming. Treat torque, smearing and gauge behavior conservatively.\", severity: \"warning\", code: \"lubrication_risk_high\" });\n      if (derived.formability.code !== \"good\") issues.push({ field: \"material_formability_class\", message: derived.formability.label + \". Qualify the material window carefully before releasing thread forming.\", severity: \"warning\", code: \"formability_guardrail\" });\n      if (derived.entryExit.code === \"high\") issues.push({ field: \"entry_exit_sensitivity\", message: \"Entry and exit quality are critical. Expect bulging or burr sensitivity to stay high until the first holes are qualified.\", severity: \"warning\", code: \"entry_exit_risk_high\" });\n      if (derived.sealingRelevant && !derived.parsed.pipeFlag) issues.push({ field: \"sealing_relevant\", message: \"Sealing relevance is set, but the current designation is not a pipe-thread style.\", severity: \"warning\", code: \"sealing_non_pipe\" });\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"forming_through\", pool);\n    }\n    \n    function computeLengthMetrics(candidate, requiredLengthMm) {\n      var apmxMm = toNullableNumber(candidate.common.apmxMm);\n      var usableLengthMm = toNullableNumber(candidate.common.usableLengthMm);\n      var apmxMarginMm = apmxMm != null && requiredLengthMm != null ? apmxMm - requiredLengthMm : null;\n      var usableMarginMm = usableLengthMm != null && requiredLengthMm != null ? usableLengthMm - requiredLengthMm : null;\n      var fitScore = apmxMarginMm != null && usableMarginMm != null\n        ? (apmxMarginMm >= 1 && usableMarginMm >= 1 ? 1 : apmxMarginMm >= 0 && usableMarginMm >= 0 ? 0.82 : 0)\n        : apmxMarginMm != null ? (apmxMarginMm >= 0 ? 0.78 : 0)\n        : usableMarginMm != null ? (usableMarginMm >= 0 ? 0.78 : 0)\n        : 0.6;\n      return { apmxMm: apmxMm, usableLengthMm: usableLengthMm, apmxMarginMm: apmxMarginMm, usableMarginMm: usableMarginMm, fitScore: clamp01(fitScore) };\n    }\n    \n    function computePredrillMetrics(candidate, derived) {\n      var recommendedMm = toNullableNumber(candidate.drilling.preDrillDiameterMm);\n      var actualMm = derived.actualPredrillMm;\n      var deltaMm = actualMm != null && recommendedMm != null ? actualMm - recommendedMm : null;\n      var fitScore = recommendedMm == null ? 0.35 : deltaMm == null ? (derived.coreHoleRoute === \"recommend\" ? 0.72 : derived.coreHoleRoute === \"fixed_unknown\" ? 0.55 : 0.5) : Math.abs(deltaMm) <= 0.03 ? 1 : Math.abs(deltaMm) <= 0.08 ? 0.8 : Math.abs(deltaMm) <= 0.14 ? 0.52 : 0.18;\n      var riskClass = deltaMm == null ? (derived.coreHoleRoute === \"recommend\" ? \"nominal\" : \"unknown\") : Math.abs(deltaMm) <= 0.03 ? \"nominal\" : deltaMm < 0 ? \"overforming-risk\" : \"underformed-risk\";\n      return { recommendedMm: recommendedMm, actualMm: actualMm, deltaMm: deltaMm, fitScore: clamp01(fitScore), riskClass: riskClass };\n    }\n    \n    function computeChamferMetrics(candidate, derived) {\n      var type = normalizeChamferType(candidate.threading.tapChamferForm);\n      var lengthP = toNullableNumber(candidate.threading.tapChamferLengthP);\n      var lengthMm = lengthP != null && derived.pitchMm != null ? roundValue(lengthP * derived.pitchMm, 2) : null;\n      var fitScore = type === \"plug\" ? 1 : type === \"short\" ? (derived.entryExit.code === \"high\" ? 0.72 : 0.58) : type === \"bottoming\" ? 0.32 : 0.62;\n      if (derived.entryExit.code === \"high\" && lengthP != null && lengthP > 4) fitScore -= 0.12;\n      return { type: type, lengthP: lengthP, lengthMm: lengthMm, fitScore: clamp01(fitScore) };\n    }\n    \n    function computeEntryExitFit(derived, chamferMetrics) {\n      var score = derived.entryExit.code === \"low\" ? 0.92 : derived.entryExit.code === \"medium\" ? 0.68 : 0.38;\n      if (chamferMetrics.type === \"short\" && derived.entryExit.code === \"high\") score += 0.08;\n      if (chamferMetrics.type === \"plug\" && derived.entryExit.code === \"high\") score -= 0.08;\n      if (derived.entryExitProtection === \"both\") score += 0.12;\n      else if (derived.entryExitProtection === \"entry_only\" || derived.entryExitProtection === \"exit_only\") score += 0.06;\n      if ((derived.materialGroup === \"N\" || derived.materialGroup === \"M\") && derived.entryExit.code !== \"low\") score -= 0.04;\n      return { riskClass: derived.entryExit.code, fitScore: clamp01(score) };\n    }\n    \n    function computeCoolantFit(derived, rowCoolantMode) {\n      var requested = derived.lubrication.normalized;\n      var score = derived.lubricationAdequacy.fitScore;\n      if (!rowCoolantMode || rowCoolantMode === \"unknown\") return score;\n      if (rowCoolantMode === requested) return clamp01(score + 0.1);\n      if ((rowCoolantMode === \"through\" && requested === \"external\") || (rowCoolantMode === \"external\" && requested === \"through\")) return clamp01(score - 0.08);\n      return clamp01(score - (requested === \"dry\" ? 0.18 : 0.12));\n    }\n    \n    function computeProgramFit(candidate, materialGroup) {\n      var catalog = candidate.attachments && candidate.attachments.catalogContext || {};\n      var materialContext = candidate.attachments && candidate.attachments.materialContext || {};\n      var series = toNullableString(catalog.series);\n      var isoGroups = materialContext.isoGroups && materialContext.isoGroups.codes || [];\n      var seriesUpper = series ? series.toUpperCase() : null;\n      if (seriesUpper && (seriesUpper.indexOf(\"ROLL\") >= 0 || seriesUpper.indexOf(\"FORM\") >= 0 || seriesUpper.indexOf(\"FURCH\") >= 0)) return 1;\n      if (isoGroups.length > 0 && isoGroups.indexOf(materialGroup) >= 0) return 0.82;\n      if (catalog.substrate || catalog.coating) return 0.68;\n      return 0.55;\n    }\n    \n    function computePriorityBias(priority, values) {\n      switch (priority) {\n        case \"process_security\": return clamp01((values.formabilityFit + values.lubricationFit + values.machineFit + values.predrillFit) / 4);\n        case \"thread_quality\": return clamp01((values.predrillFit + values.entryExitFit + values.toleranceFit + values.lengthFit) / 4);\n        case \"tool_life\": return clamp01((values.lubricationFit + values.formabilityFit + values.chamferFit + values.programFit) / 4);\n        case \"productivity\": return clamp01((values.programFit + values.recipeFit + values.lengthFit + values.chamferFit) / 4);\n        default: return 0.55;\n      }\n    }\n    \n    function computeToleranceFit(candidate, targetTolerance) {\n      var candidateTolerance = normalizeTolerance(candidate.threading.tapTolerance);\n      if (!targetTolerance && !candidateTolerance) return 0.72;\n      if (!targetTolerance || !candidateTolerance) return 0.62;\n      return candidateTolerance === targetTolerance ? 1 : 0.52;\n    }\n    \n    function computeSeverity(derived, lengthMetrics, predrillMetrics) {\n      var weight = 0.25;\n      if (derived.formability.code === \"conditional\") weight += 0.18;\n      if (derived.formability.code === \"poor\") weight += 0.32;\n      if (derived.lubricationAdequacy.code === \"poor\") weight += 0.24;\n      else if (derived.lubricationAdequacy.code === \"acceptable\") weight += 0.08;\n      if (derived.threadDepthRatio != null && derived.threadDepthRatio > 1.5) weight += 0.14;\n      if (derived.entryExit.code === \"high\") weight += 0.12;\n      if (predrillMetrics.fitScore < 0.3) weight += 0.22;\n      else if (predrillMetrics.fitScore < 0.75) weight += 0.1;\n      if (lengthMetrics.fitScore < 0.7) weight += 0.08;\n      return { code: weight >= 0.72 ? \"high\" : weight >= 0.44 ? \"medium\" : \"low\", label: weight >= 0.72 ? \"High\" : weight >= 0.44 ? \"Medium\" : \"Low\", weight: weight };\n    }\n    \n    function computeRpmWindow(recipe, nominalDiameterMm) {\n      function rpmFromVc(vc) {\n        return vc == null || nominalDiameterMm == null || nominalDiameterMm <= 0 ? null : roundValue((1000 * vc) / (Math.PI * nominalDiameterMm), 0);\n      }\n      return { min: rpmFromVc(recipe && recipe.vc && recipe.vc.min), typ: rpmFromVc(recipe && recipe.vc && recipe.vc.typ), max: rpmFromVc(recipe && recipe.vc && recipe.vc.max) };\n    }\n    \n    function computeFeedWindow(rpmWindow, pitchMm) {\n      function feedFromRpm(rpm) {\n        return rpm == null || pitchMm == null ? null : roundValue(rpm * pitchMm, 0);\n      }\n      return { min: feedFromRpm(rpmWindow.min), typ: feedFromRpm(rpmWindow.typ), max: feedFromRpm(rpmWindow.max) };\n    }\n    \n    function buildReasons(metrics, scoreParts) {\n      var reasons = [];\n      if ((scoreParts.threadIdentity || 0) >= 2.4) reasons.push(\"Thread form, size and tolerance match exactly.\");\n      if (metrics.formabilitySuitabilityClass === \"good\") reasons.push(\"Material formability supports chipless thread forming well.\");\n      else if (metrics.formabilitySuitabilityClass === \"conditional\") reasons.push(\"Material formability is workable, but the forming window stays narrower.\");\n      if (metrics.predrillRecommendedMm != null) reasons.push(\"Core-hole guidance aligns with the selected forming tap.\");\n      if (metrics.lubricationAdequacy === \"good\") reasons.push(\"Lubrication is strong enough for the expected forming load.\");\n      if (metrics.entryExitRiskClass === \"high\") reasons.push(\"Entry and exit quality remain one of the main release checks.\");\n      return reasons.slice(0, 5);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var threadingTools = toolkits.threading;\n      var derived = buildDerived(ctx);\n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = threadingTools.resolveRows(candidate, ctx);\n        var recipeResult = threadingTools.resolveRecipe(candidate, ctx);\n        var recipeRow = recipeResult.row || null;\n        var candidateThread = parseThreadIdentity(candidate.threading.threadSize, candidate.threading.tapTolerance, candidate.threading.threadForm);\n        var rowCoolantMode = recipeRow && recipeRow.constraints ? recipeRow.constraints.coolantMode : null;\n        var lengthMetrics = computeLengthMetrics(candidate, derived.threadLengthMm);\n        var predrillMetrics = computePredrillMetrics(candidate, derived);\n        var chamferMetrics = computeChamferMetrics(candidate, derived);\n        var entryExitMetrics = computeEntryExitFit(derived, chamferMetrics);\n        var coolantFit = computeCoolantFit(derived, rowCoolantMode);\n        var programFit = computeProgramFit(candidate, derived.materialGroup);\n        var toleranceFit = computeToleranceFit(candidate, derived.threadTolerance);\n        var machineFit = clamp01((derived.machineMode.score + (toNullableString(derived.holderType) === \"synchro_chuck\" ? 1 : derived.machineMode.score)) / 2);\n        var severity = computeSeverity(derived, lengthMetrics, predrillMetrics);\n        var requestedForm = normalizeThreadForm(derived.parsed.standard);\n        var candidateForm = normalizeThreadForm(candidate.threading.threadForm || candidateThread.standard);\n        var hardRejectReason = null;\n        var recipe = recipeResult.recipe;\n        var priorityBias;\n        var riskPenalty;\n        var parts;\n        var total;\n        var confidence;\n        var rpmWindow;\n        var feedWindow;\n        var metrics;\n    \n        if (derived.parsed.size && candidateThread.size && derived.parsed.size !== candidateThread.size) hardRejectReason = \"Candidate thread size does not match the requested formed thread.\";\n        if (!hardRejectReason && requestedForm && candidateForm && requestedForm !== candidateForm) hardRejectReason = \"Candidate thread form does not match the requested formed thread.\";\n        if (!hardRejectReason && derived.machineMode.code === \"none\") hardRejectReason = \"Thread forming requires a synchronized tapping cycle or synchro holder.\";\n        if (!hardRejectReason && derived.coreHoleRoute === \"missing\") hardRejectReason = \"Thread forming needs a prepared core hole before a safe recommendation can be released.\";\n        if (!hardRejectReason && derived.formability.hardStop) hardRejectReason = derived.formability.label + \". Use a cut tap or another process instead of standard through-hole forming.\";\n        if (!hardRejectReason && derived.materialCode && candidate.classification.materialSubgroupCodes.length > 0 && kernel.materialFit(candidate, ctx) <= 0) hardRejectReason = \"Candidate material subgroup fit does not cover the selected ISO subgroup.\";\n        if (!hardRejectReason && ((lengthMetrics.apmxMarginMm != null && lengthMetrics.apmxMarginMm < 0) || (lengthMetrics.usableMarginMm != null && lengthMetrics.usableMarginMm < 0))) hardRejectReason = \"Candidate length reserve is below the required full thread length.\";\n    \n        priorityBias = computePriorityBias(derived.priority, {\n          formabilityFit: derived.formability.score,\n          predrillFit: predrillMetrics.fitScore,\n          lubricationFit: coolantFit,\n          machineFit: machineFit,\n          entryExitFit: entryExitMetrics.fitScore,\n          toleranceFit: toleranceFit,\n          lengthFit: lengthMetrics.fitScore,\n          chamferFit: chamferMetrics.fitScore,\n          recipeFit: recipeResult.source === \"exact\" ? 1 : recipeResult.source === \"near\" ? 0.78 : 0.52,\n          programFit: programFit,\n        });\n    \n        riskPenalty = clamp01((kernel.risk(candidate, ctx) || 0) + (derived.formability.code === \"poor\" ? 0.2 : derived.formability.code === \"conditional\" ? 0.08 : 0) + (derived.lubricationAdequacy.code === \"poor\" ? 0.22 : 0) + (predrillMetrics.fitScore < 0.3 ? 0.18 : predrillMetrics.fitScore < 0.7 ? 0.08 : 0) + (entryExitMetrics.riskClass === \"high\" ? 0.12 : entryExitMetrics.riskClass === \"medium\" ? 0.05 : 0) + (severity.code === \"high\" ? 0.16 : severity.code === \"medium\" ? 0.06 : 0));\n    \n        if (recipeResult.source !== \"none\" && derived.pitchMm != null) recipe = createRecipe({ vc: recipeResult.recipe && recipeResult.recipe.vc, fn: { min: derived.pitchMm, typ: derived.pitchMm, max: derived.pitchMm } });\n        rpmWindow = computeRpmWindow(recipe, derived.nominalDiameterMm);\n        feedWindow = computeFeedWindow(rpmWindow, derived.pitchMm);\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.1,\n          process: kernel.processFit(candidate, ctx),\n          formability: derived.formability.score * 1.55,\n          threadIdentity: derived.parsed.size && candidateThread.size && derived.parsed.size === candidateThread.size ? 2.6 : 0.4,\n          toleranceFit: toleranceFit * 0.95,\n          chamferFit: chamferMetrics.fitScore * 0.95,\n          lengthWindow: lengthMetrics.fitScore * 1.05,\n          predrillFit: predrillMetrics.fitScore * 1.45,\n          lubricationFit: coolantFit * 1.3,\n          entryExitFit: entryExitMetrics.fitScore * 0.95,\n          machineFit: machineFit * 1.05,\n          programFit: programFit * 0.6,\n          rowMatch: recipeRow || rows.length > 0 ? 0.45 : 0.15,\n          priorityBias: priorityBias * 0.35,\n          riskPenalty: -riskPenalty,\n        };\n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.93 : recipeResult.source === \"near\" ? 0.84 : 0.7;\n        if (derived.coreHoleRoute !== \"actual_known\") confidence -= 0.06;\n        if (derived.formability.code === \"conditional\") confidence -= 0.08;\n        if (derived.formability.code === \"poor\") confidence -= 0.14;\n        if (derived.lubricationAdequacy.code === \"poor\") confidence -= 0.08;\n        if (hardRejectReason) confidence = 0;\n        confidence = clamp01(confidence);\n    \n        metrics = Object.assign({}, threadingTools.getSharedMetrics(candidate, ctx), {\n          requestedThreadIdentity: derived.canonicalDesignation,\n          requestedThreadForm: requestedForm,\n          requestedThreadSize: derived.parsed.size,\n          requestedPitchMm: derived.pitchMm,\n          requestedTolerance: derived.threadTolerance,\n          nominalThreadDiameterMm: derived.nominalDiameterMm,\n          requiredFullThreadLengthMm: derived.threadLengthMm,\n          requiredDepthRatio: derived.threadDepthRatio != null ? roundValue(derived.threadDepthRatio, 2) : null,\n          recommendedChamferClass: derived.recommendedChamferClass,\n          formabilitySuitabilityClass: derived.formability.code,\n          formabilityLabel: derived.formability.label,\n          entryExitRiskClass: entryExitMetrics.riskClass,\n          entryExitLabel: derived.entryExit.label,\n          machineMode: derived.machineMode.label,\n          coolantMode: derived.lubrication.label,\n          qualitySensitivity: derived.qualitySensitivity,\n          problemHistory: derived.problemHistory,\n          holderType: derived.holderType,\n          candidateThreadForm: candidateForm,\n          candidateThreadSize: candidateThread.size,\n          candidateTolerance: normalizeTolerance(candidate.threading.tapTolerance),\n          tapChamferForm: toNullableString(candidate.threading.tapChamferForm),\n          tapChamferType: chamferMetrics.type,\n          tapChamferLengthP: chamferMetrics.lengthP,\n          tapChamferLengthMm: chamferMetrics.lengthMm,\n          tapHelixDeg: toNullableNumber(candidate.threading.tapHelixDeg),\n          predrillRecommendedMm: predrillMetrics.recommendedMm,\n          predrillActualMm: predrillMetrics.actualMm,\n          predrillDeltaMm: predrillMetrics.deltaMm != null ? roundValue(predrillMetrics.deltaMm, 3) : null,\n          underOverFormRisk: predrillMetrics.riskClass,\n          lubricationAdequacy: derived.lubricationAdequacy.code,\n          apmxMm: lengthMetrics.apmxMm,\n          usableLengthMm: lengthMetrics.usableLengthMm,\n          apmxMarginMm: lengthMetrics.apmxMarginMm != null ? roundValue(lengthMetrics.apmxMarginMm, 2) : null,\n          usableLengthMarginMm: lengthMetrics.usableMarginMm != null ? roundValue(lengthMetrics.usableMarginMm, 2) : null,\n          chamferSuitability: chamferMetrics.fitScore,\n          coolantFit: coolantFit,\n          machineFit: machineFit,\n          lengthFit: lengthMetrics.fitScore,\n          predrillFit: predrillMetrics.fitScore,\n          toleranceFit: toleranceFit,\n          programFit: programFit,\n          rowCoolantMode: rowCoolantMode,\n          recipeOperationId: recipeRow && recipeRow.constraints && recipeRow.constraints.processIds && recipeRow.constraints.processIds[0] || null,\n          rowMatchCount: rows.length,\n          recipeVcMin: recipe && recipe.vc ? recipe.vc.min : null,\n          recipeVcTyp: recipe && recipe.vc ? recipe.vc.typ : null,\n          recipeVcMax: recipe && recipe.vc ? recipe.vc.max : null,\n          rpmMin: rpmWindow.min,\n          rpmTyp: rpmWindow.typ,\n          rpmMax: rpmWindow.max,\n          feedMinMmMin: feedWindow.min,\n          feedTypMmMin: feedWindow.typ,\n          feedMaxMmMin: feedWindow.max,\n          formingSeverity: severity.code,\n          formingSeverityWeight: roundValue(severity.weight, 2),\n          alternativeProcessFlag: derived.formability.code === \"poor\" || derived.lubricationAdequacy.code === \"poor\" || severity.code === \"high\" || (derived.materialGroup === \"S\" && entryExitMetrics.riskClass !== \"low\"),\n          alternativePrimary: derived.formability.code === \"poor\" || derived.formability.hardStop ? \"cut_tap\" : (severity.code === \"high\" && derived.qualitySensitivity === \"gauge_critical\" ? \"thread_mill\" : \"cut_tap\"),\n          series: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.series),\n          substrate: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.substrate),\n          coating: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.coating),\n        });\n    \n        return createScoredCandidate(candidate, { eligible: !hardRejectReason && total > 0, hardRejectReason: hardRejectReason, total: total, parts: parts, confidence: confidence, recipeConfidence: recipeResult.source, reasons: buildReasons(metrics, parts) }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/grooving/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/grooving/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/grooving/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/grooving/presenter.js\");\n    exports.default = createStubProcessModule(\"grooving\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/grooving/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, recipeStartValues, riskNotes, setupNotes } = __bundle.require(\"core/result-blocks.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        return true;\n      });\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var riskItems = [];\n      var setupItems = [];\n    \n      if (getAnswer(ctx, \"chip_evac_condition\")) {\n        setupItems.push({ area: \"evacuation\", message: \"Chip evacuation: \" + getAnswer(ctx, \"chip_evac_condition\") });\n      }\n      if (getAnswer(ctx, \"internal_external\")) {\n        setupItems.push({ area: \"access\", message: \"Groove mode: \" + getAnswer(ctx, \"internal_external\") });\n      }\n      if ((top.score.parts.access || 0) < 0.6) {\n        riskItems.push({ severity: \"warning\", title: \"Access\", message: \"Access is limited for the selected groove type and mode.\" });\n      }\n      if ((top.score.parts.chipEvacuation || 0) < 0.5) {\n        riskItems.push({ severity: \"warning\", title: \"Chip evacuation\", message: \"Poor chip evacuation can destabilize narrow grooving operations.\" });\n      }\n    \n      return createResultViewModel({\n        processId: \"grooving\",\n        outcome: top.score.total >= 4 ? \"match\" : \"limited_match\",\n        summary: \"Best grooving result based on groove width fit, access and chip evacuation.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 3),\n          }),\n          featureSummary([\n            { key: \"operation\", label: \"Groove operation\", value: String(getAnswer(ctx, \"groove_operation_type\") || \"unknown\") },\n            { key: \"mode\", label: \"Internal / external\", value: String(getAnswer(ctx, \"internal_external\") || \"unknown\") },\n            { key: \"width\", label: \"Groove width\", value: String(getAnswer(ctx, \"feature_width_mm\")) + \" mm\" },\n            { key: \"depth\", label: \"Groove depth\", value: String(getAnswer(ctx, \"groove_depth_mm\")) + \" mm\" },\n          ]),\n          geometryFit([\n            {\n              key: \"insert_width\",\n              label: \"Insert width\",\n              actual: candidate.turning.turnThicknessMm != null ? String(candidate.turning.turnThicknessMm) + \" mm\" : null,\n              target: getAnswer(ctx, \"feature_width_mm\") != null ? String(getAnswer(ctx, \"feature_width_mm\")) + \" mm\" : null,\n              result: candidate.turning.turnThicknessMm != null && getAnswer(ctx, \"feature_width_mm\") != null && Number(candidate.turning.turnThicknessMm) <= Number(getAnswer(ctx, \"feature_width_mm\")) ? \"fit\" : \"mismatch\",\n            },\n          ]),\n          fitKpis([\n            { key: \"width\", label: \"Width fit\", value: (top.score.parts.widthFit || 0).toFixed(2), status: (top.score.parts.widthFit || 0) >= 1.4 ? \"good\" : \"ok\" },\n            { key: \"access\", label: \"Access\", value: (top.score.parts.access || 0).toFixed(2), status: (top.score.parts.access || 0) >= 0.75 ? \"good\" : \"ok\" },\n            { key: \"evac\", label: \"Evacuation\", value: (top.score.parts.chipEvacuation || 0).toFixed(2), status: (top.score.parts.chipEvacuation || 0) >= 0.65 ? \"good\" : \"weak\" },\n            { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.75 ? \"good\" : \"ok\" },\n          ]),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: [\n              { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n              { key: \"fn\", label: \"fn\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n              { key: \"ap\", label: \"ap\", min: top.recipe && top.recipe.ap.min, typ: top.recipe && top.recipe.ap.typ, max: top.recipe && top.recipe.ap.max, unit: \"mm\" },\n            ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n          }),\n          riskNotes(riskItems),\n          setupNotes(setupItems),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative grooving option\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust groove inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/grooving/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"grooving\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/grooving/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function tokenScore(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"grooving\", ctx, toolkits));\n      var width = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"groove_depth_mm\"));\n      derived.groove_access_mode = [getAnswer(ctx, \"groove_operation_type\"), getAnswer(ctx, \"internal_external\")].filter(Boolean).join(\"_\") || null;\n      if (width != null && depth != null && width > 0) {\n        derived.width_depth_ratio = depth / width;\n      }\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"grooving\", ctx);\n      var width = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"groove_depth_mm\"));\n      if (width != null && depth != null && width > 0 && depth / width > 4) {\n        issues.push({\n          field: \"groove_depth_mm\",\n          message: \"Deep narrow grooves need a careful stability and chip evacuation review.\",\n          severity: \"warning\",\n          code: \"narrow_groove_ratio\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"grooving\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var turningTools = toolkits.turning;\n      var grooveType = getAnswer(ctx, \"groove_operation_type\");\n      var internalExternal = getAnswer(ctx, \"internal_external\");\n      var width = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"groove_depth_mm\"));\n      var chipEvac = getAnswer(ctx, \"chip_evac_condition\");\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = turningTools.resolveRows(candidate, ctx);\n        var recipeResult = turningTools.resolveRecipe(candidate, ctx);\n        var insertWidth = toNullableNumber(candidate.turning.turnThicknessMm);\n        var insertIc = toNullableNumber(candidate.turning.turnSizeIcMm);\n        var widthFit = 0;\n        var accessFit = tokenScore(internalExternal, { internal: 0.7, external: 1 }, 0.6) * tokenScore(grooveType, { parting: 0.9, od_groove: 1, id_groove: 0.75, face_groove: 0.85 }, 0.7);\n        var reachFit = depth != null ? kernel.reachFit(candidate, depth) : 0.6;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (rows.length === 0) {\n          hardRejectReason = \"No turning row is available for grooving.\";\n        }\n        if (width != null && insertWidth != null) {\n          if (insertWidth > width) {\n            hardRejectReason = \"Insert width exceeds the requested groove width.\";\n          } else {\n            widthFit = clamp(1 - Math.abs(width - insertWidth) / width, 0, 1);\n          }\n        }\n        if (!hardRejectReason && depth != null && reachFit < 0.75) {\n          hardRejectReason = \"Reach is insufficient for the requested groove depth.\";\n        }\n        if (!hardRejectReason && internalExternal === \"internal\" && insertIc != null && depth != null && insertIc > depth * 2) {\n          hardRejectReason = \"Internal groove access is too limited for the selected insert size.\";\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          widthFit: widthFit * 2,\n          access: accessFit,\n          chipEvacuation: tokenScore(chipEvac, { good: 1, limited: 0.65, poor: 0.25 }, 0.5),\n          stability: internalExternal === \"internal\" ? reachFit : Math.max(reachFit, 0.7),\n          rowMatch: rows.length > 0 ? 1 : 0,\n          machine: kernel.machineWindow(candidate, ctx),\n          riskPenalty: -kernel.risk(candidate, ctx),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.78 : 0.55;\n        if (hardRejectReason) confidence = 0;\n    \n        metrics = Object.assign({}, turningTools.getSharedMetrics(candidate, ctx), {\n          requestedWidthMm: width,\n          requestedDepthMm: depth,\n          insertWidthMm: insertWidth,\n          grooveType: grooveType,\n          internalExternal: internalExternal,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            widthFit >= 0.75 ? \"Insert width fits the requested groove geometry.\" : \"Insert width remains workable for the requested groove.\",\n            accessFit >= 0.75 ? \"Access conditions support the requested groove type.\" : \"Access is possible but limited for the requested groove mode.\",\n            tokenScore(chipEvac, { good: 1, limited: 0.65, poor: 0.25 }, 0.5) >= 0.65 ? \"Chip evacuation supports a stable grooving pass.\" : \"Chip evacuation is the main grooving constraint.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/high-feed-milling/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/high-feed-milling/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/high-feed-milling/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/high-feed-milling/presenter.js\");\n    exports.default = createStubProcessModule(\"high_feed_milling\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/high-feed-milling/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    function formatPriceLabel(priceCents) { return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(2); }\n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = String(item || \"\").replace(/\\s+/g, \" \").trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) { return item && item.score && item.score.eligible; }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative high-feed option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        metrics.shoulderConflictClass === \"true90_conflict\" ? { severity: \"warning\", title: \"True 90 boundary\", message: \"A small entering-angle cutter should not be sold as the main route straight into a finish-critical true-90 shoulder.\" } : null,\n        metrics.shoulderConflictClass === \"near_wall_warning\" ? { severity: \"warning\", title: \"Wall proximity\", message: \"The low-angle high-feed effect starts to weaken as the path moves closer to the wall boundary.\" } : null,\n        metrics.axialForceConflictClass === \"high\" ? { severity: \"warning\", title: \"Axial-force conflict\", message: \"The spindle likes this strategy more than a thin floor or axially weak surface does.\" } : null,\n        metrics.camCapabilityClass === \"absent\" && metrics.accessFitClass !== \"strong\" ? { severity: \"warning\", title: \"CAM support\", message: \"Confined high-feed side milling should not be overpromised without CAM support for the intended path style.\" } : null,\n        metrics.nearNetCapabilityClass === \"uncertain\" ? { severity: \"warning\", title: \"Finish split\", message: \"Keep high-feed milling as the roughing route and hand the final wall or shoulder to a cleaner finishing process.\" } : null,\n      ].filter(Boolean).slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"ap\", label: \"Low-ap fit\", result: metrics.lowApFitClass === \"strong\" || metrics.lowApFitClass === \"usable\" ? \"pass\" : metrics.lowApFitClass === \"conditional\" ? \"limited\" : \"fail\", note: \"State: \" + titleCase(metrics.lowApFitClass || \"review\") + \".\" },\n        { key: \"reach\", label: \"Reach reserve\", result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 && metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"pass\" : \"fail\", note: \"Usable length and APMX must both clear the requested ap.\" },\n        { key: \"cam\", label: \"CAM / path support\", result: metrics.camCapabilityClass === \"confirmed\" ? \"pass\" : metrics.camCapabilityClass === \"likely\" || metrics.camCapabilityClass === \"unknown\" ? \"limited\" : \"fail\", note: \"State: \" + (metrics.camCapabilityLabel || \"Review\") + \".\" },\n        { key: \"machine\", label: \"Machine window\", result: metrics.machineWindowClass === \"strong\" ? \"pass\" : metrics.machineWindowClass === \"usable\" ? \"limited\" : \"limited\", note: \"Torque window: \" + titleCase(metrics.machineWindowClass || \"review\") + \".\" },\n      ];\n    }\n    \n    function buildFeatureItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"geometry\", label: \"Primary geometry\", value: metrics.requestedGeometryLabel || \"Review\" },\n        { key: \"ap\", label: \"Requested ap\", value: metrics.requestedApMm != null ? formatDisplayNumber(metrics.requestedApMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"boundary\", label: \"90-degree wall\", value: metrics.requestedShoulderLabel || \"Review\" },\n        { key: \"access\", label: \"Access class\", value: metrics.requestedAccessLabel || \"Review\" },\n        { key: \"finish\", label: \"Process target\", value: metrics.requestedFinishStrategyLabel || \"Review\" },\n        { key: \"stability\", label: \"Stability class\", value: metrics.requestedStabilityLabel || \"Review\" },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"ap_recipe\", label: \"Requested ap vs recipe\", actual: metrics.requestedApMm != null ? formatDisplayNumber(metrics.requestedApMm, 2) + \" mm\" : null, target: metrics.recipeApUpperMm != null ? \"<= \" + formatDisplayNumber(metrics.recipeApUpperMm, 2) + \" mm\" : null, result: metrics.recipeApFitClass === \"good\" || metrics.recipeApFitClass === \"light\" ? \"fit\" : metrics.recipeApFitClass === \"conditional\" ? \"near\" : \"mismatch\" },\n        { key: \"reach\", label: \"Usable length vs reach\", actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null, target: metrics.reachRequirementMm != null ? formatDisplayNumber(metrics.reachRequirementMm, 2) + \" mm\" : null, result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\" },\n        { key: \"apmx\", label: \"APMX vs ap\", actual: metrics.candidateApmxMm != null ? formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm\" : null, target: metrics.requestedApMm != null ? formatDisplayNumber(metrics.requestedApMm, 2) + \" mm\" : null, result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"fit\" : \"mismatch\" },\n        { key: \"boundary\", label: \"Wall boundary\", actual: metrics.requestedShoulderLabel || \"Review\", target: \"Clear of true-90 finish shoulder\", result: metrics.shoulderConflictClass === \"none\" ? \"fit\" : metrics.shoulderConflictClass === \"near_wall_warning\" ? \"near\" : \"mismatch\" },\n      ];\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"hfm\", label: \"HFM case\", value: metrics.hfmSuitabilityLabel || \"Review\", status: metrics.hfmSuitabilityClass === \"strong_case\" ? \"good\" : metrics.hfmSuitabilityClass === \"valid_case\" ? \"ok\" : \"weak\" },\n        { key: \"ap\", label: \"Low-ap fit\", value: titleCase(metrics.lowApFitClass || \"review\"), status: metrics.lowApFitClass === \"strong\" || metrics.lowApFitClass === \"usable\" ? \"good\" : metrics.lowApFitClass === \"conditional\" ? \"ok\" : \"weak\" },\n        { key: \"concept\", label: \"Tool concept\", value: metrics.toolConceptDesiredLabel || \"Review\", status: metrics.toolConceptFitClass === \"strong\" ? \"good\" : metrics.toolConceptFitClass === \"usable\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatDisplayNumber(top.score.confidence, 2) || \"n/a\", status: top.score.confidence >= 0.82 ? \"good\" : top.score.confidence >= 0.65 ? \"ok\" : \"weak\" },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n      });\n      block.data.presentation = {\n        title: \"Start here\",\n        description: \"High-feed release values only make sense when ap stays low and the path really uses the chip-thinning effect of the small entering angle.\",\n        rowBackedValues: [\n          { label: \"Geometry\", value: metrics.requestedGeometryLabel || \"Review\", tone: \"text\" },\n          { label: \"90 wall\", value: metrics.requestedShoulderLabel || \"Review\", tone: \"text\" },\n          { label: \"ap fit\", value: titleCase(metrics.recipeApFitClass || \"review\"), tone: \"text\" },\n          { label: \"Chip thinning\", value: metrics.chipThinningGainLabel || \"Review\", tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"ap typ\", value: formatDisplayNumber(metrics.recipeApTyp, 2) || \"n/a\", unit: \"mm\" },\n        ],\n        machineValues: [\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n        ],\n        trustCard: {\n          title: \"Process credibility\",\n          tone: metrics.hfmSuitabilityClass === \"strong_case\" ? \"good\" : metrics.hfmSuitabilityClass === \"valid_case\" ? \"default\" : \"watch\",\n          badge: metrics.hfmSuitabilityLabel || \"Review\",\n          value: \"Concept: \" + (metrics.toolConceptDesiredLabel || \"Review\"),\n          note: \"Table feed is only a start value. Real HFM performance depends on low ap, chip thinning and how close the path stays to a true-90 wall.\",\n          items: dedupeTextItems([\n            metrics.longOverhangValueLabel ? \"Overhang value: \" + metrics.longOverhangValueLabel + \".\" : null,\n            metrics.nearNetCapabilityLabel ? \"Near-net route: \" + metrics.nearNetCapabilityLabel + \".\" : null,\n            metrics.camCapabilityLabel ? \"CAM support: \" + metrics.camCapabilityLabel + \".\" : null,\n          ]),\n        },\n      };\n      return block;\n    }\n    \n    function buildSetupBlock(top, riskItems) {\n      var metrics = top.metrics || {};\n      var block = setupNotes([\n        { area: \"concept\", message: \"Preferred concept: \" + (metrics.toolConceptDesiredLabel || \"Review\") },\n        { area: \"cam\", message: \"CAM support: \" + (metrics.camCapabilityLabel || \"Review\") },\n        { area: \"machine\", message: \"Machine window: \" + titleCase(metrics.machineWindowClass || \"review\") },\n      ]);\n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Fit\",\n            highlight: \"This recommendation is driven mainly by low ap, productivity bias, overhang benefit and whether the path stays clear of a true-90 boundary.\",\n            items: dedupeTextItems([\n              metrics.hfmSuitabilityClass === \"strong_case\" || metrics.hfmSuitabilityClass === \"valid_case\" ? \"The current use case still benefits from a high-feed strategy.\" : null,\n              metrics.lowApFitClass === \"strong\" || metrics.lowApFitClass === \"usable\" ? \"Requested ap stays inside a believable high-feed window.\" : null,\n              metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            ]).slice(0, 3),\n          },\n          how: {\n            title: \"How to start\",\n            tone: \"default\",\n            badge: metrics.chipThinningGainLabel || \"Release\",\n            highlight: \"Keep ap low, let the chip-thinning effect do the work, and do not treat the first feed value as universal if the boundary or access changes.\",\n            items: dedupeTextItems([\n              \"Hold ap inside the row-backed window before pushing feed.\",\n              metrics.camCapabilityClass === \"confirmed\" || metrics.camCapabilityClass === \"likely\" ? \"Use the intended CAM path style consistently once the first pass is stable.\" : null,\n              metrics.nearNetCapabilityClass === \"uncertain\" ? \"Plan a separate finishing route for the wall or shoulder.\" : null,\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: \"High-feed helps the spindle by shifting force axially, but that same force direction can punish a weak floor or a true-90 boundary.\",\n            items: dedupeTextItems(riskItems.map(function mapRisk(item) { return item.title + \": \" + item.message; })).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"Strategy basis\",\n            tone: metrics.hfmSuitabilityClass === \"strong_case\" ? \"good\" : \"default\",\n            badge: metrics.hfmSuitabilityLabel || \"Review\",\n            value: \"The case reads as \" + (metrics.requestedGeometryLabel || \"Review\") + \" with \" + (metrics.requestedAccessLabel || \"Review\") + \".\",\n            note: metrics.longOverhangValueLabel ? \"Overhang value: \" + metrics.longOverhangValueLabel + \".\" : null,\n            items: dedupeTextItems([\n              metrics.requestedFinishStrategyLabel ? \"Process target: \" + metrics.requestedFinishStrategyLabel + \".\" : null,\n              metrics.requestedShoulderLabel ? \"Boundary: \" + metrics.requestedShoulderLabel + \".\" : null,\n              metrics.camCapabilityLabel ? \"CAM support: \" + metrics.camCapabilityLabel + \".\" : null,\n            ]),\n          },\n          {\n            title: \"Boundary and force control\",\n            tone: metrics.axialForceConflictClass === \"high\" || metrics.shoulderConflictClass === \"true90_conflict\" ? \"watch\" : \"default\",\n            badge: titleCase(metrics.axialForceConflictClass || \"review\"),\n            value: \"Wall proximity and axial force direction decide whether HFM stays efficient or turns into a geometry risk.\",\n            note: dedupeTextItems([\n              metrics.maxToolDiameterMm != null ? \"Max tool diameter \" + formatDisplayNumber(metrics.maxToolDiameterMm, 2) + \" mm\" : null,\n              metrics.maxToolDiameterMarginMm != null ? \"Clearance margin \" + formatDisplayNumber(metrics.maxToolDiameterMarginMm, 2) + \" mm\" : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.requestedAxialForceLabel ? \"Axial-force sensitivity: \" + metrics.requestedAxialForceLabel + \".\" : null,\n              metrics.reachMarginMm != null ? \"Reach margin: \" + formatDisplayNumber(metrics.reachMarginMm, 2) + \" mm.\" : null,\n              metrics.apmxMarginMm != null ? \"APMX margin: \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm.\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Boundary drift\",\n            tone: metrics.shoulderConflictClass === \"true90_conflict\" ? \"high\" : \"default\",\n            category: \"Geometry\",\n            cause: \"Once the path runs straight into a true-90 wall, the small entering-angle advantage drops away and the cut stops behaving like a clean HFM route.\",\n            actions: dedupeTextItems([\n              \"Do not run the low-angle HFM cutter all the way into a finish-critical shoulder.\",\n              \"Hand the final wall to a cleaner shoulder or finishing process.\",\n              \"Reduce feed first if wall proximity starts to climb before switching strategy.\",\n            ]),\n          },\n          {\n            title: \"Axial-force control\",\n            tone: metrics.axialForceConflictClass === \"high\" ? \"watch\" : \"default\",\n            category: \"Workpiece load\",\n            cause: \"The process lowers radial pressure on the spindle, but it pushes more force axially into a weak floor or thin feature.\",\n            actions: dedupeTextItems([\n              \"Reduce feed before increasing ap if the workpiece begins to deflect.\",\n              \"Prefer solid or exchangeable side-milling logic when geometry control matters more than open-face productivity.\",\n              \"Keep roughing and finishing separate when the component is axially weak.\",\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var riskItems;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"high_feed_milling\",\n          outcome: \"no_match\",\n          summary: \"No credible high-feed-milling recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current high-feed-milling inputs do not support a credible recommendation.\"),\n            noMatchGuidance({\n              message: \"Check the requested ap, wall proximity, access class, CAM support and whether the process should stay roughing-first instead of being asked to finish a true-90 wall.\",\n              steps: [\n                \"Confirm the required ap per pass and compare it against a genuinely low-ap HFM route.\",\n                \"Clarify whether the cutter must run into a true-90 shoulder or stay clear of it.\",\n                \"Separate open-face productivity cases from confined CAM-supported side-milling cases.\",\n                \"Review axial-force sensitivity if the floor or feature is thin or weak.\",\n                \"Keep roughing and finishing split when final wall quality is critical.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust high-feed inputs\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      riskItems = buildRiskItems(top);\n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best high-feed-milling fit for \" + (metrics.requestedApMm != null ? formatDisplayNumber(metrics.requestedApMm, 2) + \" mm ap\" : \"the stated ap\") + \" with \" + (metrics.requestedShoulderLabel || \"the stated boundary\") + \".\",\n        headerPills: [\n          { tone: metrics.hfmSuitabilityClass === \"strong_case\" ? \"good\" : metrics.hfmSuitabilityClass === \"valid_case\" ? \"default\" : \"watch\", text: metrics.hfmSuitabilityLabel || \"Best fit\" },\n          { tone: metrics.lowApFitClass === \"strong\" || metrics.lowApFitClass === \"usable\" ? \"good\" : metrics.lowApFitClass === \"conditional\" ? \"default\" : \"watch\", text: \"ap: \" + titleCase(metrics.lowApFitClass || \"review\") },\n          { tone: metrics.shoulderConflictClass === \"none\" ? \"good\" : metrics.shoulderConflictClass === \"near_wall_warning\" ? \"default\" : \"watch\", text: \"Boundary: \" + (metrics.requestedShoulderLabel || \"Review\") },\n          { tone: metrics.axialForceConflictClass === \"low\" ? \"good\" : metrics.axialForceConflictClass === \"medium\" ? \"default\" : \"watch\", text: \"Axial force: \" + (metrics.requestedAxialForceLabel || \"Review\") },\n        ],\n      };\n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine fit\",\n          tone: metrics.machineWindowClass === \"strong\" ? \"good\" : \"default\",\n          badge: titleCase(metrics.machineWindowClass || \"review\"),\n          value: \"CAM: \" + (metrics.camCapabilityLabel || \"Review\"),\n          note: \"High-feed often earns its keep when the setup wants spindle-side stability or overhang help, but it still needs low ap and a realistic path style.\",\n          items: dedupeTextItems([\n            metrics.longOverhangValueLabel ? \"Overhang value: \" + metrics.longOverhangValueLabel + \".\" : null,\n            metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            metrics.nearNetCapabilityLabel ? \"Near-net route: \" + metrics.nearNetCapabilityLabel + \".\" : null,\n          ]),\n        },\n      };\n    \n      return createResultViewModel({\n        processId: \"high_feed_milling\",\n        outcome: top.score.total >= 8 ? \"match\" : \"limited_match\",\n        summary: \"Best high-feed-milling result based on low-ap fit, boundary realism, overhang benefit and tool-concept suitability.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          buildMillingBundleRecommendation(candidate),\n          featureSummary(buildFeatureItems(top)),\n          geometryFit(buildGeometryItems(top)),\n          fitKpis(buildFitItems(top)),\n          recipeBlock,\n          machineBlock,\n          buildSetupBlock(top, riskItems),\n          riskNotes(riskItems),\n          alternatives(buildAlternativeItems(scored)),\n          commerceCta(Object.assign({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }, buildMillingCompositeCommerceData(candidate) || {})),\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust high-feed inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/high-feed-milling/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"high_feed_milling\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/high-feed-milling/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) { return Math.max(min, Math.min(max, value)); }\n    function avg(values) {\n      var filtered = (values || []).filter(function keep(value) { return value != null && Number.isFinite(value); });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) { return total + value; }, 0) / filtered.length;\n    }\n    function sumParts(parts) { return Object.keys(parts || {}).reduce(function sum(total, key) { return total + (Number(parts[key]) || 0); }, 0); }\n    function scoreToken(value, map, fallback) { return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback); }\n    function normalizeConceptPreference(value) {\n      if (value === \"solid_carbide_only\") return \"solid_carbide\";\n      if (value === \"exchangeable_head_only\") return \"exchangeable_head\";\n      if (value === \"solid_or_exchangeable\") return \"solid_or_exchangeable\";\n      if (value === \"indexable_only\") return \"indexable\";\n      return \"either\";\n    }\n    function formatLabel(value, map, fallback) { return map[value] || fallback || \"Review\"; }\n    function getGeometryLabel(value) { return formatLabel(value, { face_milling: \"Face milling\", open_contour: \"Open contour / freeform\", pocket_roughing: \"Pocket roughing\", corner_semi_finish: \"Corner semi-finish\", plunge_related_roughing: \"Plunge-related roughing\" }, \"High-feed geometry\"); }\n    function getShoulderLabel(value) { return formatLabel(value, { clear_of_90: \"Clear of 90-degree wall\", near_wall: \"Near wall\", direct_true_90: \"Direct true-90 shoulder\" }, \"Boundary review\"); }\n    function getStabilityLabel(value) { return formatLabel(value, { stable: \"Stable\", normal: \"Normal\", long_overhang: \"Long overhang\", poor_stability: \"Poor stability\" }); }\n    function getFinishLabel(value) { return formatLabel(value, { roughing_only: \"Roughing only\", rough_plus_semi_finish: \"Rough + semi-finish\", finish_critical: \"Finish-critical wall\" }, \"Process target\"); }\n    function getAccessLabel(value) { return formatLabel(value, { open_access: \"Open access\", moderately_confined: \"Moderately confined\", reach_critical: \"Reach-critical / deep\" }); }\n    function getConceptLabel(value) { return formatLabel(value, { solid_carbide: \"Solid carbide\", exchangeable_head: \"Exchangeable head\", solid_or_exchangeable: \"Solid / exchangeable\", indexable: \"Indexable\", either: \"Either\" }); }\n    function getCamLabel(value) { return formatLabel(value, { confirmed: \"Confirmed\", likely: \"Likely\", absent: \"Absent\", unknown: \"Unknown\" }); }\n    function getAxialForceLabel(value) { return formatLabel(value, { low: \"Low\", medium: \"Medium\", high: \"High\" }); }\n    function getSuitabilityLabel(value) { return formatLabel(value, { strong_case: \"Strong case\", valid_case: \"Valid case\", weak_case: \"Weak case\", not_credible: \"Not credible\" }); }\n    function getNearNetLabel(value) { return formatLabel(value, { roughing_only: \"Roughing only\", roughing_plus_semifinish: \"Rough + semi-finish\", near_net_possible: \"Near-net possible\", uncertain: \"Uncertain\" }); }\n    function getChipThinningLabel(value) { return formatLabel(value, { moderate: \"Moderate\", high: \"High\", extreme: \"Extreme\" }); }\n    function getLongOverhangLabel(value) { return formatLabel(value, { low: \"Low\", medium: \"Medium\", high: \"High\" }); }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var helix = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neck = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var text = [candidate.catalog && candidate.catalog.productTitle, candidate.catalog && candidate.catalog.variantTitle, candidate.ids && candidate.ids.sku].join(\" \").toLowerCase();\n      if (text.indexOf(\"head\") >= 0 || text.indexOf(\"multi-master\") >= 0 || text.indexOf(\"multimaster\") >= 0) return \"exchangeable_head\";\n      if (text.indexOf(\"solid\") >= 0 || text.indexOf(\"plura\") >= 0 || text.indexOf(\"hfs\") >= 0 || text.indexOf(\"end mill\") >= 0) return \"solid_carbide\";\n      if (text.indexOf(\"cutter\") >= 0 || text.indexOf(\"coromill\") >= 0 || text.indexOf(\"feed\") >= 0 || text.indexOf(\"body\") >= 0) return \"indexable\";\n      if (diameter != null && diameter >= 25) return \"indexable\";\n      if (diameter != null && diameter <= 16 && helix != null && helix >= 30) return \"solid_carbide\";\n      if (neck != null && diameter != null && neck < diameter) return \"solid_carbide\";\n      if (diameter != null && diameter <= 20) return \"solid_or_exchangeable\";\n      return \"either\";\n    }\n    \n    function deriveSuggestedConcept(inputs) {\n      var solid = 0;\n      var exchangeable = 0;\n      var indexable = 0;\n      if (inputs.geometryClass === \"face_milling\" || inputs.geometryClass === \"plunge_related_roughing\") indexable += 2;\n      if (inputs.geometryClass === \"open_contour\") { indexable += 1; solid += 1; exchangeable += 1; }\n      if (inputs.geometryClass === \"pocket_roughing\") { solid += 1; exchangeable += 1; }\n      if (inputs.geometryClass === \"corner_semi_finish\") { solid += 2; exchangeable += 1; }\n      if (inputs.accessClass === \"open_access\") indexable += 2;\n      if (inputs.accessClass === \"moderately_confined\") { solid += 1; exchangeable += 1; }\n      if (inputs.accessClass === \"reach_critical\") { solid += 2; exchangeable += 2; }\n      if (inputs.camCapability === \"confirmed\" || inputs.camCapability === \"likely\") { solid += 1; exchangeable += 1; }\n      if (inputs.stabilityClass === \"long_overhang\" || inputs.stabilityClass === \"poor_stability\") { indexable += 2; exchangeable += 1; }\n      if (inputs.priority === \"productivity\") indexable += 2;\n      if (inputs.priority === \"safety\") { solid += 1; exchangeable += 1; }\n      if (inputs.finishStrategy === \"rough_plus_semi_finish\") { solid += 1; exchangeable += 1; }\n      if (inputs.finishStrategy === \"finish_critical\") { solid += 2; exchangeable += 1; indexable -= 1; }\n      if (inputs.materialSeverityScore >= 0.55) { solid += 1; exchangeable += 1; }\n      if (inputs.longOverhangClass === \"high\" && inputs.geometryClass !== \"corner_semi_finish\") indexable += 1;\n      if (solid >= indexable + 2 && solid >= exchangeable + 1) return solid >= exchangeable + 2 ? \"solid_carbide\" : \"solid_or_exchangeable\";\n      if (exchangeable >= solid + 1 && exchangeable >= indexable + 1) return \"exchangeable_head\";\n      if (indexable >= solid + 1 && indexable >= exchangeable + 1) return \"indexable\";\n      return \"solid_or_exchangeable\";\n    }\n    \n    function conceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var explicitDesired = explicitConcept !== \"either\" ? explicitConcept : desiredConcept;\n      var score = 0.76;\n      if (explicitDesired === \"either\" || candidateConcept === \"either\") score = 0.82;\n      else if (explicitDesired === \"solid_or_exchangeable\" && (candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\")) score = 0.96;\n      else if (candidateConcept === explicitDesired) score = explicitConcept === \"either\" ? 0.92 : 1;\n      else if ((candidateConcept === \"solid_or_exchangeable\" && (explicitDesired === \"solid_carbide\" || explicitDesired === \"exchangeable_head\")) || (explicitDesired === \"solid_or_exchangeable\" && candidateConcept === \"either\")) score = explicitConcept === \"either\" ? 0.8 : 0.7;\n      else if (explicitDesired === \"indexable\" && candidateConcept === \"exchangeable_head\") score = 0.62;\n      else score = explicitConcept === \"either\" ? 0.5 : 0.24;\n      return { score: score, className: score >= 0.9 ? \"strong\" : score >= 0.7 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\" };\n    }\n    \n    function bandFit(requested, band, tolerance) {\n      var min = toNullableNumber(band && band.min);\n      var typ = toNullableNumber(band && band.typ);\n      var max = toNullableNumber(band && band.max);\n      var upper = max != null ? max : (typ != null ? typ : min);\n      var overflow;\n      var score;\n      if (requested == null) return { score: 0.5, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (upper == null) return { score: 0.58, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (requested > upper) {\n        overflow = upper > 0 ? (requested - upper) / upper : 1;\n        score = clamp(0.62 - overflow * 0.84, 0.12, 0.62);\n        return { score: score, className: overflow <= (tolerance == null ? 0.4 : tolerance) ? \"conditional\" : \"over\", hardFail: overflow > (tolerance == null ? 0.4 : tolerance), min: min, typ: typ, max: max, upper: upper };\n      }\n      if (typ != null && requested > typ) {\n        score = clamp(1 - ((requested - typ) / Math.max((upper - typ) || typ || 1, 1)) * 0.26, 0.78, 1);\n        return { score: score, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      }\n      if (min != null && requested < min) return { score: 0.88, className: \"light\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      return { score: 0.96, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 5) return 1;\n      if (margin >= 2) return 0.88;\n      if (margin >= 0.5) return 0.74;\n      if (margin >= 0) return 0.58;\n      if (margin >= -1) return 0.18;\n      return 0;\n    }\n    \n    function maxDiameterFit(candidateDiameter, maxToolDiameter) {\n      var margin;\n      if (maxToolDiameter == null) return { score: 0.76, className: \"open\", hardFail: false, margin: null };\n      if (candidateDiameter == null) return { score: 0.52, className: \"unknown\", hardFail: false, margin: null };\n      margin = maxToolDiameter - candidateDiameter;\n      if (margin < 0) return { score: 0, className: \"over\", hardFail: true, margin: margin };\n      return { score: marginScore(margin), className: margin >= 1 ? \"good\" : margin >= 0 ? \"tight\" : \"over\", hardFail: false, margin: margin };\n    }\n    \n    function materialSeverity(ctx, materialCondition) {\n      var materialCode = String(ctx && ctx.materialCode || \"\").toUpperCase();\n      var base = scoreToken(materialCode.charAt(0), { P: 0.22, M: 0.54, K: 0.18, N: 0.2, S: 0.76, H: 0.58 }, 0.3);\n      var score = clamp(base + scoreToken(materialCondition, { standard: 0, tough_long_chipping: 0.1, sticky_bue: 0.08, work_hardening: 0.18, hard_abrasive: 0.16, unknown: 0.06 }, 0.06), 0, 1);\n      return { score: score, className: score >= 0.74 ? \"severe\" : score >= 0.52 ? \"difficult\" : score >= 0.3 ? \"normal\" : \"easy\" };\n    }\n    \n    function lowApFit(apRatio) {\n      var score;\n      if (apRatio == null) return { score: 0.5, className: \"unknown\" };\n      if (apRatio <= 0.12) score = 1;\n      else if (apRatio <= 0.2) score = 0.94;\n      else if (apRatio <= 0.3) score = 0.82;\n      else if (apRatio <= 0.42) score = 0.6;\n      else if (apRatio <= 0.55) score = 0.34;\n      else score = 0.12;\n      return { score: score, className: score >= 0.92 ? \"strong\" : score >= 0.74 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\" };\n    }\n    \n    function shoulderConflict(shoulderProximity, geometryClass) {\n      var score = scoreToken(shoulderProximity, { clear_of_90: 1, near_wall: geometryClass === \"corner_semi_finish\" ? 0.7 : 0.56, direct_true_90: 0.16 }, 0.56);\n      return { score: score, className: shoulderProximity === \"direct_true_90\" ? \"true90_conflict\" : shoulderProximity === \"near_wall\" ? \"near_wall_warning\" : \"none\" };\n    }\n    \n    function axialForceConflict(axialForceSensitivity, geometryClass, finishStrategy) {\n      var score = scoreToken(axialForceSensitivity, { low: 1, medium: geometryClass === \"face_milling\" ? 0.72 : 0.78, high: geometryClass === \"face_milling\" || geometryClass === \"open_contour\" ? 0.28 : 0.36 }, 0.72);\n      if (finishStrategy === \"finish_critical\") score = clamp(score - 0.08, 0, 1);\n      return { score: score, className: score >= 0.82 ? \"low\" : score >= 0.52 ? \"medium\" : \"high\" };\n    }\n    \n    function longOverhangValue(stabilityClass) {\n      var score = scoreToken(stabilityClass, { stable: 0.24, normal: 0.46, long_overhang: 1, poor_stability: 0.9 }, 0.46);\n      var className = score >= 0.82 ? \"high\" : score >= 0.52 ? \"medium\" : \"low\";\n      return { score: score, className: className, label: getLongOverhangLabel(className) };\n    }\n    \n    function camCapability(value, desiredConcept, accessClass) {\n      var sideMilling = desiredConcept === \"solid_carbide\" || desiredConcept === \"exchangeable_head\" || desiredConcept === \"solid_or_exchangeable\" || accessClass === \"reach_critical\";\n      var score = sideMilling ? scoreToken(value, { confirmed: 1, likely: 0.82, absent: 0.2, unknown: 0.58 }, 0.58) : scoreToken(value, { confirmed: 0.9, likely: 0.8, absent: 0.56, unknown: 0.66 }, 0.66);\n      return { score: score, className: value || \"unknown\", label: getCamLabel(value), isSolidSideMilling: sideMilling };\n    }\n    \n    function accessFit(accessClass, candidateConcept, cam, maxFitScore) {\n      var score = 0.72;\n      if (accessClass === \"open_access\") score = candidateConcept === \"indexable\" ? 1 : candidateConcept === \"exchangeable_head\" ? 0.82 : 0.72;\n      else if (accessClass === \"moderately_confined\") score = candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\" ? 0.92 : 0.58;\n      else if (accessClass === \"reach_critical\") score = candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\" ? 0.96 : 0.4;\n      if (accessClass !== \"open_access\" && cam.className === \"absent\" && cam.isSolidSideMilling) score = clamp(score - 0.18, 0, 1);\n      score = avg([score, maxFitScore]);\n      return { score: score, className: score >= 0.9 ? \"strong\" : score >= 0.72 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\" };\n    }\n    \n    function nearNetCapability(finishStrategy, desiredConcept, geometryClass, shoulderClass, cam) {\n      if (finishStrategy === \"roughing_only\") return { score: 1, className: \"roughing_only\", label: getNearNetLabel(\"roughing_only\") };\n      if (finishStrategy === \"rough_plus_semi_finish\") {\n        if (desiredConcept !== \"indexable\" && shoulderClass !== \"true90_conflict\" && cam.className !== \"absent\") return { score: 0.88, className: \"near_net_possible\", label: getNearNetLabel(\"near_net_possible\") };\n        return { score: 0.76, className: \"roughing_plus_semifinish\", label: getNearNetLabel(\"roughing_plus_semifinish\") };\n      }\n      if (geometryClass === \"corner_semi_finish\" && desiredConcept !== \"indexable\" && shoulderClass === \"none\" && cam.className === \"confirmed\") return { score: 0.58, className: \"near_net_possible\", label: getNearNetLabel(\"near_net_possible\") };\n      return { score: 0.34, className: \"uncertain\", label: getNearNetLabel(\"uncertain\") };\n    }\n    \n    function chipThinningGain(lowApScore, desiredConcept, geometryClass) {\n      var className = \"moderate\";\n      if (lowApScore >= 0.9 && desiredConcept === \"indexable\" && (geometryClass === \"face_milling\" || geometryClass === \"plunge_related_roughing\")) className = \"extreme\";\n      else if (lowApScore >= 0.78) className = \"high\";\n      return { className: className, label: getChipThinningLabel(className) };\n    }\n    \n    function coolantFit(coolantCapability, candidate) {\n      var tsc = candidate.common && candidate.common.coolantTsc === true;\n      var score = coolantCapability === \"through\" ? (tsc ? 1 : 0.72) : coolantCapability === \"external\" ? 0.76 : coolantCapability === \"dry\" ? 0.48 : 0.58;\n      return { score: score, className: score >= 0.9 ? \"strong\" : score >= 0.72 ? \"usable\" : score >= 0.5 ? \"conditional\" : \"weak\" };\n    }\n    \n    function machineWindow(machineTorqueCapability, overhangValue) {\n      var score = scoreToken(machineTorqueCapability, { high: 0.9, medium: 0.78, low: 0.64 }, 0.74);\n      if (overhangValue.className === \"high\") score = clamp(score + 0.08, 0, 1);\n      return { score: score, className: score >= 0.84 ? \"strong\" : score >= 0.68 ? \"usable\" : \"limited\" };\n    }\n    \n    function hfmSuitability(inputs) {\n      var score = 0.14;\n      score += inputs.lowApFitScore * 0.28;\n      score += scoreToken(inputs.geometryClass, { face_milling: 0.14, open_contour: 0.12, pocket_roughing: 0.1, corner_semi_finish: 0.08, plunge_related_roughing: 0.12 }, 0.1);\n      score += inputs.overhangScore * 0.18;\n      score += inputs.materialSeverityScore * 0.12;\n      score += inputs.accessFitScore * 0.08;\n      score += inputs.camCapabilityScore * 0.06;\n      score -= inputs.shoulderClass === \"true90_conflict\" ? 0.24 : inputs.shoulderClass === \"near_wall_warning\" ? 0.08 : 0;\n      score -= inputs.axialForceClass === \"high\" ? 0.18 : inputs.axialForceClass === \"medium\" ? 0.06 : 0;\n      score -= inputs.finishStrategy === \"finish_critical\" ? 0.16 : 0;\n      score = clamp(score, 0, 1);\n      return { score: score, className: score >= 0.78 ? \"strong_case\" : score >= 0.58 ? \"valid_case\" : score >= 0.38 ? \"weak_case\" : \"not_credible\", label: getSuitabilityLabel(score >= 0.78 ? \"strong_case\" : score >= 0.58 ? \"valid_case\" : score >= 0.38 ? \"weak_case\" : \"not_credible\") };\n    }\n    \n    function requestedStage(finishStrategy) { return finishStrategy === \"rough_plus_semi_finish\" || finishStrategy === \"finish_critical\" ? \"semi-finishing\" : \"roughing\"; }\n    \n    function stageFit(requested, row) {\n      var rowStage = row && row.constraints ? row.constraints.conditionStage : null;\n      if (!requested || !rowStage) return 0.76;\n      if (requested === rowStage) return 1;\n      if (rowStage === \"roughing\" && requested === \"semi-finishing\") return 0.72;\n      if (rowStage === \"semi-finishing\" && requested === \"roughing\") return 0.82;\n      return 0.62;\n    }\n    \n    function estimatedAePct(recipe, desiredConcept, accessClass) {\n      var aeTyp = toNullableNumber(recipe && recipe.aePct && recipe.aePct.typ);\n      if (aeTyp == null) return null;\n      if (accessClass === \"reach_critical\") return aeTyp * 0.75;\n      if (desiredConcept === \"solid_carbide\" || desiredConcept === \"exchangeable_head\" || desiredConcept === \"solid_or_exchangeable\") return aeTyp * 0.88;\n      return aeTyp;\n    }\n    \n    function rpm(vc, diameter) { return vc == null || diameter == null || diameter <= 0 ? null : (1000 * vc) / Math.PI / diameter; }\n    function feed(fz, n, z) { return fz == null || n == null || z == null || z <= 0 ? null : fz * n * z; }\n    function mrr(ap, ae, vf) { return ap == null || ae == null || vf == null ? null : (ap * ae * vf) / 1000; }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"high_feed_milling\", ctx, toolkits));\n      var geometryClass = getAnswer(ctx, \"high_feed_geometry_class\");\n      var finishStrategy = getAnswer(ctx, \"high_feed_finish_strategy\");\n      derived.condition_stage = requestedStage(finishStrategy);\n      derived.high_feed_geometry_label = getGeometryLabel(geometryClass);\n      derived.high_feed_shoulder_label = getShoulderLabel(getAnswer(ctx, \"high_feed_shoulder_proximity\"));\n      derived.high_feed_stability_label = getStabilityLabel(getAnswer(ctx, \"high_feed_stability_class\"));\n      derived.high_feed_finish_label = getFinishLabel(finishStrategy);\n      derived.high_feed_access_label = getAccessLabel(getAnswer(ctx, \"high_feed_access_class\"));\n      derived.high_feed_cam_label = getCamLabel(getAnswer(ctx, \"high_feed_cam_side_milling_capability\"));\n      derived.high_feed_axial_force_label = getAxialForceLabel(getAnswer(ctx, \"high_feed_axial_force_sensitivity\"));\n      derived.finish_split_required = finishStrategy === \"rough_plus_semi_finish\" || finishStrategy === \"finish_critical\";\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"high_feed_milling\", ctx);\n      var geometryClass = getAnswer(ctx, \"high_feed_geometry_class\");\n      var shoulderProximity = getAnswer(ctx, \"high_feed_shoulder_proximity\");\n      var finishStrategy = getAnswer(ctx, \"high_feed_finish_strategy\");\n      var stabilityClass = getAnswer(ctx, \"high_feed_stability_class\");\n      var accessClass = getAnswer(ctx, \"high_feed_access_class\");\n      var cam = getAnswer(ctx, \"high_feed_cam_side_milling_capability\");\n      var axialForce = getAnswer(ctx, \"high_feed_axial_force_sensitivity\");\n    \n      if (shoulderProximity === \"direct_true_90\") {\n        issues.push({ field: \"high_feed_shoulder_proximity\", message: \"High-feed milling should not be sold as the default route straight into a true 90-degree finish shoulder.\", severity: \"warning\", code: \"high_feed_true90_conflict\" });\n      }\n      if (finishStrategy === \"finish_critical\") {\n        issues.push({ field: \"high_feed_finish_strategy\", message: \"High-feed milling is primarily roughing to semi-finish. Keep the final wall or shoulder finish as a separate route.\", severity: \"warning\", code: \"high_feed_finish_split\" });\n      }\n      if (axialForce === \"high\") {\n        issues.push({ field: \"high_feed_axial_force_sensitivity\", message: \"The small entering angle helps the spindle, but it pushes more axial load into weak floors and thin surfaces.\", severity: \"warning\", code: \"high_feed_axial_force_conflict\" });\n      }\n      if ((accessClass === \"reach_critical\" || geometryClass === \"pocket_roughing\" || geometryClass === \"corner_semi_finish\") && cam === \"absent\") {\n        issues.push({ field: \"high_feed_cam_side_milling_capability\", message: \"Confined or reach-critical high-feed side milling usually needs CAM support to stay technically credible.\", severity: \"warning\", code: \"high_feed_cam_missing\" });\n      }\n      if ((geometryClass === \"face_milling\" || geometryClass === \"open_contour\") && stabilityClass === \"stable\" && finishStrategy === \"roughing_only\") {\n        issues.push({ field: \"high_feed_geometry_class\", message: \"High-feed milling is valid here, but it is not automatically the best choice when the setup is already easy and stable.\", severity: \"warning\", code: \"high_feed_not_mandatory\" });\n      }\n    \n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"high_feed_milling\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var geometryClass = getAnswer(ctx, \"high_feed_geometry_class\");\n      var requestedAp = toNullableNumber(getAnswer(ctx, \"high_feed_ap_mm\"));\n      var shoulderProximity = getAnswer(ctx, \"high_feed_shoulder_proximity\") || \"clear_of_90\";\n      var stabilityClass = getAnswer(ctx, \"high_feed_stability_class\") || \"normal\";\n      var materialCondition = getAnswer(ctx, \"material_condition_class\") || \"standard\";\n      var finishStrategy = getAnswer(ctx, \"high_feed_finish_strategy\") || \"roughing_only\";\n      var accessClass = getAnswer(ctx, \"high_feed_access_class\") || \"open_access\";\n      var priority = getAnswer(ctx, \"priority\") || \"balanced\";\n      var maxToolDiameter = toNullableNumber(getAnswer(ctx, \"max_tool_diameter_mm\"));\n      var reachRequirement = toNullableNumber(getAnswer(ctx, \"high_feed_reach_mm\")) || requestedAp;\n      var explicitConcept = normalizeConceptPreference(getAnswer(ctx, \"high_feed_tool_concept_preference\"));\n      var rawCam = getAnswer(ctx, \"high_feed_cam_side_milling_capability\") || \"unknown\";\n      var axialForceSensitivity = getAnswer(ctx, \"high_feed_axial_force_sensitivity\") || \"medium\";\n      var coolantCapability = getAnswer(ctx, \"coolant_capability\") || \"unknown\";\n      var machineTorqueCapability = getAnswer(ctx, \"machine_torque_capability\") || \"medium\";\n      var mat = materialSeverity(ctx, materialCondition);\n      var overhang = longOverhangValue(stabilityClass);\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var row = recipeResult.row || rows[0] || null;\n        var recipe = recipeResult.recipe || {};\n        var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var usableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var apmx = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var flutes = getCandidateFluteCount(candidate);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var apRatio = requestedAp != null && diameter != null && diameter > 0 ? requestedAp / diameter : null;\n        var lowAp = lowApFit(apRatio);\n        var maxFit = maxDiameterFit(diameter, maxToolDiameter);\n        var desiredConcept = explicitConcept === \"either\"\n          ? deriveSuggestedConcept({\n              geometryClass: geometryClass,\n              accessClass: accessClass,\n              camCapability: rawCam,\n              stabilityClass: stabilityClass,\n              priority: priority,\n              finishStrategy: finishStrategy,\n              materialSeverityScore: mat.score,\n              longOverhangClass: overhang.className,\n            })\n          : explicitConcept;\n        var cam = camCapability(rawCam, desiredConcept, accessClass);\n        var concept = conceptFit(candidateConcept, desiredConcept, explicitConcept);\n        var access = accessFit(accessClass, candidateConcept, cam, maxFit.score);\n        var shoulder = shoulderConflict(shoulderProximity, geometryClass);\n        var axialForce = axialForceConflict(axialForceSensitivity, geometryClass, finishStrategy);\n        var nearNet = nearNetCapability(finishStrategy, desiredConcept, geometryClass, shoulder.className, cam);\n        var chipGain = chipThinningGain(lowAp.score, desiredConcept, geometryClass);\n        var coolant = coolantFit(coolantCapability, candidate);\n        var machine = machineWindow(machineTorqueCapability, overhang);\n        var apBand = bandFit(requestedAp, recipe.ap, 0.4);\n        var reachMargin = usableLength != null && reachRequirement != null ? usableLength - reachRequirement : null;\n        var apmxMargin = apmx != null && requestedAp != null ? apmx - requestedAp : null;\n        var reach = avg([marginScore(reachMargin), marginScore(apmxMargin)]);\n        var aePct = estimatedAePct(recipe, desiredConcept, accessClass);\n        var aeMm = diameter != null && aePct != null ? (diameter * aePct) / 100 : null;\n        var suitability = hfmSuitability({\n          geometryClass: geometryClass,\n          lowApFitScore: lowAp.score,\n          overhangScore: overhang.score,\n          materialSeverityScore: mat.score,\n          accessFitScore: access.score,\n          camCapabilityScore: cam.score,\n          shoulderClass: shoulder.className,\n          axialForceClass: axialForce.className,\n          finishStrategy: finishStrategy,\n        });\n        var stage = stageFit(requestedStage(finishStrategy), row);\n        var n = rpm(toNullableNumber(recipe.vc && recipe.vc.typ), diameter);\n        var vf = feed(toNullableNumber(recipe.fz && recipe.fz.typ), n, flutes);\n        var q = mrr(requestedAp, aeMm, vf);\n        var hardRejectReason = null;\n        var riskPenalty;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (!rows.length) hardRejectReason = \"No valid high-feed milling row is available for this material and process context.\";\n        if (!hardRejectReason && maxFit.hardFail) hardRejectReason = \"Tool diameter exceeds the stated maximum tool size.\";\n        if (!hardRejectReason && apBand.hardFail) hardRejectReason = \"Requested ap exceeds the current high-feed recipe window.\";\n        if (!hardRejectReason && reachMargin != null && reachMargin < 0) hardRejectReason = \"Usable length is shorter than the requested high-feed reach.\";\n        if (!hardRejectReason && apmxMargin != null && apmxMargin < 0) hardRejectReason = \"APMX is shorter than the requested high-feed ap.\";\n    \n        metrics = {\n          requestedGeometryClass: geometryClass,\n          requestedGeometryLabel: getGeometryLabel(geometryClass),\n          requestedApMm: requestedAp,\n          requestedShoulderProximity: shoulderProximity,\n          requestedShoulderLabel: getShoulderLabel(shoulderProximity),\n          requestedStabilityClass: stabilityClass,\n          requestedStabilityLabel: getStabilityLabel(stabilityClass),\n          requestedFinishStrategy: finishStrategy,\n          requestedFinishStrategyLabel: getFinishLabel(finishStrategy),\n          requestedAccessClass: accessClass,\n          requestedAccessLabel: getAccessLabel(accessClass),\n          requestedPriority: priority,\n          requestedMaterialCondition: materialCondition,\n          requestedAxialForceSensitivity: axialForceSensitivity,\n          requestedAxialForceLabel: getAxialForceLabel(axialForceSensitivity),\n          requestedCoolantCapability: coolantCapability,\n          requestedMachineTorqueCapability: machineTorqueCapability,\n          maxToolDiameterMm: maxToolDiameter,\n          maxToolDiameterMarginMm: maxFit.margin,\n          reachRequirementMm: reachRequirement,\n          candidateDiameterMm: diameter,\n          candidateUsableLengthMm: usableLength,\n          candidateApmxMm: apmx,\n          candidateFluteCount: flutes,\n          candidateHelixAngleDeg: toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg),\n          apRatio: apRatio,\n          lowApFitClass: lowAp.className,\n          lowApFitScore: lowAp.score,\n          recipeVcMin: toNullableNumber(recipe.vc && recipe.vc.min),\n          recipeVcTyp: toNullableNumber(recipe.vc && recipe.vc.typ),\n          recipeVcMax: toNullableNumber(recipe.vc && recipe.vc.max),\n          recipeFzMin: toNullableNumber(recipe.fz && recipe.fz.min),\n          recipeFzTyp: toNullableNumber(recipe.fz && recipe.fz.typ),\n          recipeFzMax: toNullableNumber(recipe.fz && recipe.fz.max),\n          recipeApMin: apBand.min,\n          recipeApTyp: apBand.typ,\n          recipeApMax: apBand.max,\n          recipeApUpperMm: apBand.upper,\n          recipeAePctMin: toNullableNumber(recipe.aePct && recipe.aePct.min),\n          recipeAePctTyp: toNullableNumber(recipe.aePct && recipe.aePct.typ),\n          recipeAePctMax: toNullableNumber(recipe.aePct && recipe.aePct.max),\n          recipeApFitClass: apBand.className,\n          recipeApFitScore: apBand.score,\n          reachMarginMm: reachMargin,\n          apmxMarginMm: apmxMargin,\n          reachReserveScore: reach,\n          toolConceptGuess: candidateConcept,\n          toolConceptDesired: desiredConcept,\n          toolConceptDesiredLabel: getConceptLabel(desiredConcept),\n          toolConceptExplicit: explicitConcept,\n          toolConceptFitClass: concept.className,\n          toolConceptScore: concept.score,\n          accessFitClass: access.className,\n          accessFitScore: access.score,\n          shoulderConflictClass: shoulder.className,\n          shoulderConflictScore: shoulder.score,\n          axialForceConflictClass: axialForce.className,\n          axialForceConflictScore: axialForce.score,\n          longOverhangValueClass: overhang.className,\n          longOverhangValueLabel: overhang.label,\n          longOverhangValueScore: overhang.score,\n          camCapabilityClass: cam.className,\n          camCapabilityLabel: cam.label,\n          camCapabilityScore: cam.score,\n          nearNetCapabilityClass: nearNet.className,\n          nearNetCapabilityLabel: nearNet.label,\n          nearNetCapabilityScore: nearNet.score,\n          chipThinningGainClass: chipGain.className,\n          chipThinningGainLabel: chipGain.label,\n          coolantSupportClass: coolant.className,\n          coolantSupportScore: coolant.score,\n          machineWindowClass: machine.className,\n          machineWindowScore: machine.score,\n          hfmSuitabilityClass: suitability.className,\n          hfmSuitabilityLabel: suitability.label,\n          hfmSuitabilityScore: suitability.score,\n          estimatedAePctReq: aePct,\n          estimatedAeMmReq: aeMm,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          rowRecipeKind: row && row.familyData ? row.familyData.recipeRowKind : null,\n          rpmTyp: n,\n          feedTypMmMin: vf,\n          mrrTyp: q,\n        };\n        Object.assign(metrics, recipeResult.debug || {});\n    \n        riskPenalty = clamp(\n          (1 - shoulder.score) * 0.24 +\n          (1 - axialForce.score) * 0.18 +\n          (cam.isSolidSideMilling ? (1 - cam.score) * 0.16 : 0) +\n          (finishStrategy === \"finish_critical\" ? 0.12 : 0) +\n          (suitability.className === \"not_credible\" ? 0.14 : suitability.className === \"weak_case\" ? 0.06 : 0),\n          0,\n          1\n        );\n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.08,\n          process: kernel.processFit(candidate, ctx) * 1.12,\n          hfmSuitability: suitability.score * 1.46,\n          lowAp: lowAp.score * 1.52,\n          reach: reach * 1.34,\n          toolConcept: concept.score * 1.08,\n          shoulderBoundary: shoulder.score * 1.12,\n          axialForce: axialForce.score * 0.96,\n          access: access.score * 0.92,\n          camCapability: cam.score * 0.84,\n          stabilityBenefit: overhang.score * 0.82,\n          coolant: coolant.score * 0.46,\n          machine: machine.score * 0.62,\n          nearNet: nearNet.score * 0.56,\n          stage: stage * 0.42,\n          riskPenalty: -riskPenalty,\n        };\n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.82 : recipeResult.source === \"estimated\" ? 0.68 : 0.5;\n        confidence -= shoulder.className === \"true90_conflict\" ? 0.14 : shoulder.className === \"near_wall_warning\" ? 0.05 : 0;\n        confidence -= axialForce.className === \"high\" ? 0.08 : axialForce.className === \"medium\" ? 0.03 : 0;\n        confidence -= cam.isSolidSideMilling && cam.className === \"absent\" ? 0.14 : cam.isSolidSideMilling && cam.className === \"unknown\" ? 0.05 : 0;\n        confidence -= finishStrategy === \"finish_critical\" ? 0.08 : finishStrategy === \"rough_plus_semi_finish\" ? 0.02 : 0;\n        confidence -= suitability.className === \"weak_case\" ? 0.06 : suitability.className === \"not_credible\" ? 0.14 : 0;\n        confidence = clamp(confidence, 0, 0.97);\n        if (hardRejectReason) confidence = 0;\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            suitability.className === \"strong_case\" ? \"Low ap, long-overhang benefit and the current roughing target make this a strong high-feed use case.\" : suitability.className === \"valid_case\" ? \"The case still supports a believable high-feed strategy, mainly through low ap and stable chip-thinning behavior.\" : \"High-feed milling stays possible here, but the process need is weaker than in a classic long-overhang roughing case.\",\n            shoulder.className === \"none\" ? \"The current path stays clear enough of a true 90-degree shoulder.\" : shoulder.className === \"near_wall_warning\" ? \"The cut is getting close to a wall boundary where the low entering-angle effect begins to weaken.\" : \"Direct true-90 shoulder contact is the main technical limitation of this high-feed route.\",\n            concept.className === \"strong\" ? \"The selected tool concept lines up well with the current geometry and access class.\" : \"Tool concept remains a trade-off between open-face productivity and side-milling geometry control.\",\n            axialForce.className === \"low\" ? \"The workpiece still tolerates the axial load direction of a small entering-angle cutter.\" : \"Axial load on the workpiece is one of the main watch-outs in this case.\",\n            cam.isSolidSideMilling && cam.className !== \"confirmed\" ? \"Solid high-feed side milling needs CAM support to stay credible in this geometry.\" : \"The current release can start from the row-backed vc and fz values, then tune feed around the chip-thinning effect.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/plunging/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/plunging/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/plunging/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/plunging/presenter.js\");\n    exports.default = createStubProcessModule(\"plunging\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/plunging/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(2);\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = String(item || \"\").replace(/\\s+/g, \" \").trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative plunging option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        metrics.openingFitClass !== \"ready\" ? {\n          severity: \"warning\",\n          title: \"Opening strategy\",\n          message: \"Plunging needs a credible starting hole or opening route before the process becomes trustworthy.\",\n        } : null,\n        metrics.finishFitClass === \"final_contour_not_credible\" ? {\n          severity: \"warning\",\n          title: \"Finish split\",\n          message: \"Keep plunging as the roughing route only. A follow-up wall or contour finish should stay visible.\",\n        } : metrics.finishFitClass === \"roughing_plus_finish_needed\" ? {\n          severity: \"warning\",\n          title: \"Rough + finish\",\n          message: \"Release plunging first, then finish the contour with a cleaner follow-up path.\",\n        } : null,\n        metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\" ? {\n          severity: \"warning\",\n          title: \"Chip evacuation\",\n          message: \"Deep cavity chip evacuation is one of the main risk drivers. Use coolant or air and avoid recutting on the return stroke.\",\n        } : null,\n        metrics.drillAlternativeFlag ? {\n          severity: \"warning\",\n          title: \"Drill alternative\",\n          message: \"For this mainly axial opening, drilling may still be the more direct first choice up to about 35 mm.\",\n        } : null,\n      ].filter(Boolean).slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"opening\",\n          label: \"Opening route\",\n          result: metrics.openingFitClass === \"ready\" ? \"pass\" : metrics.openingFitClass === \"possible_with_opening_strategy\" ? \"limited\" : \"fail\",\n          note: metrics.openingFitLabel || \"Review\",\n        },\n        {\n          key: \"chip\",\n          label: \"Chip evacuation\",\n          result: metrics.chipEvacuationSeverityClass === \"low\" ? \"pass\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"limited\" : \"fail\",\n          note: \"Severity: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") + \".\",\n        },\n        {\n          key: \"load\",\n          label: \"Machine load\",\n          result: metrics.machineLoadClass === \"light\" || metrics.machineLoadClass === \"normal\" ? \"pass\" : metrics.machineLoadClass === \"high\" ? \"limited\" : \"fail\",\n          note: \"Load: \" + titleCase(metrics.machineLoadClass || \"review\") + \".\",\n        },\n        {\n          key: \"strategy\",\n          label: \"Plunge value\",\n          result: metrics.plungeValueClass === \"strong_case\" ? \"pass\" : metrics.plungeValueClass === \"valid\" ? \"limited\" : \"limited\",\n          note: metrics.plungeValueLabel || \"Review\",\n        },\n      ];\n    }\n    \n    function buildFeatureItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"feature\", label: \"Feature type\", value: metrics.requestedFeatureTypeLabel || \"Review\" },\n        { key: \"width\", label: \"Opening width\", value: metrics.requestedFeatureWidthMm != null ? formatDisplayNumber(metrics.requestedFeatureWidthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"depth\", label: \"Plunge depth\", value: metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"opening\", label: \"Starting hole\", value: metrics.requestedStartingHoleLabel || \"Review\" },\n        { key: \"finish\", label: \"Finish strategy\", value: metrics.requestedFinishStrategyLabel || \"Review\" },\n        { key: \"stability\", label: \"Stability class\", value: metrics.requestedStabilityLabel || \"Review\" },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"tool_width\",\n          label: \"Tool diameter vs opening\",\n          actual: metrics.candidateDiameterMm != null ? formatDisplayNumber(metrics.candidateDiameterMm, 2) + \" mm\" : null,\n          target: metrics.requestedFeatureWidthMm != null ? formatDisplayNumber(metrics.requestedFeatureWidthMm, 2) + \" mm\" : null,\n          result: metrics.widthRatioFitClass === \"good\" ? \"fit\" : metrics.widthRatioFitClass === \"conditional\" ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"ap_recipe\",\n          label: \"Requested ap vs recipe\",\n          actual: metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm\" : null,\n          target: metrics.recipeApUpperMm != null ? \"<= \" + formatDisplayNumber(metrics.recipeApUpperMm, 2) + \" mm\" : null,\n          result: metrics.recipeApFitClass === \"good\" || metrics.recipeApFitClass === \"light\" ? \"fit\" : metrics.recipeApFitClass === \"conditional\" ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"reach\",\n          label: \"Usable length vs depth\",\n          actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null,\n          target: metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm\" : null,\n          result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n        {\n          key: \"apmx\",\n          label: \"APMX vs depth\",\n          actual: metrics.candidateApmxMm != null ? formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm\" : null,\n          target: metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm\" : null,\n          result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n      ];\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"value\", label: \"Plunge value\", value: metrics.plungeValueLabel || \"Review\", status: metrics.plungeValueClass === \"strong_case\" ? \"good\" : metrics.plungeValueClass === \"valid\" ? \"ok\" : \"weak\" },\n        { key: \"opening\", label: \"Opening fit\", value: metrics.openingFitLabel || \"Review\", status: metrics.openingFitClass === \"ready\" ? \"good\" : metrics.openingFitClass === \"possible_with_opening_strategy\" ? \"ok\" : \"weak\" },\n        { key: \"ap\", label: \"Recipe ap fit\", value: titleCase(metrics.recipeApFitClass || \"review\"), status: metrics.recipeApFitClass === \"good\" ? \"good\" : metrics.recipeApFitClass === \"conditional\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatDisplayNumber(top.score.confidence, 2) || \"n/a\", status: top.score.confidence >= 0.82 ? \"good\" : top.score.confidence >= 0.65 ? \"ok\" : \"weak\" },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n      });\n    \n      block.data.presentation = {\n        title: \"Start here\",\n        description: \"These start values are row-backed release points. Feed and side-step stay a controlled approximation because real plunge stepping still depends on tool concept and cavity behavior.\",\n        rowBackedValues: [\n          { label: \"Feature\", value: metrics.requestedFeatureTypeLabel || \"Review\", tone: \"text\" },\n          { label: \"Opening\", value: metrics.openingFitLabel || \"Review\", tone: \"text\" },\n          { label: \"ap fit\", value: titleCase(metrics.recipeApFitClass || \"review\"), tone: \"text\" },\n          { label: \"Step-over\", value: metrics.stepOverLabel || \"Review\", tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"ae typ\", value: formatDisplayNumber(metrics.estimatedAePctReq, 1) || \"n/a\", unit: \"%\" },\n        ],\n        machineValues: [\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n        ],\n        trustCard: {\n          title: \"Process credibility\",\n          tone: metrics.plungeValueClass === \"strong_case\" ? \"good\" : metrics.plungeValueClass === \"valid\" ? \"default\" : \"watch\",\n          badge: metrics.plungeValueLabel || \"Review\",\n          value: \"Opening route: \" + (metrics.openingFitLabel || \"Review\"),\n          note: \"Treat feed and side-step as release values. Final stepping still depends on cavity behavior, chip flow and whether a dedicated plunge cutter is used.\",\n          items: dedupeTextItems([\n            metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            metrics.requestedMachineLimitLabel ? \"Machine limit: \" + metrics.requestedMachineLimitLabel + \".\" : null,\n            metrics.requestedFinishStrategyLabel ? \"Finish route: \" + metrics.requestedFinishStrategyLabel + \".\" : null,\n          ]),\n        },\n      };\n      return block;\n    }\n    \n    function buildSetupBlock(top, riskItems) {\n      var metrics = top.metrics || {};\n      var block = setupNotes([\n        { area: \"opening\", message: \"Opening route: \" + (metrics.requestedOpeningMethodLabel || \"Review\") },\n        { area: \"coolant\", message: \"Coolant support: \" + (metrics.requestedCoolantSupportLabel || \"Review\") },\n        { area: \"concept\", message: \"Preferred concept: \" + (metrics.toolConceptDesiredLabel || \"Review\") },\n      ]);\n    \n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Fit\",\n            highlight: \"Plunging earns its place mainly when the application benefits from shifting force toward the spindle axis instead of pushing radial side-load into a weak setup.\",\n            items: dedupeTextItems([\n              metrics.plungeValueClass === \"strong_case\" || metrics.plungeValueClass === \"valid\" ? \"The current setup still benefits from a lower-radial-force plunge route.\" : null,\n              metrics.recipeApFitClass === \"good\" ? \"Requested plunge depth still fits the current recipe window.\" : null,\n              metrics.widthRatioFitClass === \"good\" ? \"The cutter still fits the opening without forcing a geometry conflict.\" : null,\n            ]).slice(0, 3),\n          },\n          how: {\n            title: \"How to start\",\n            tone: \"default\",\n            badge: metrics.stepOverLabel || \"Strategy\",\n            highlight: \"Start with a credible opening, keep the return stroke clean, and release side-step conservatively if chip flow or vibration starts to drift.\",\n            items: dedupeTextItems([\n              metrics.requestedOpeningMethodLabel ? \"Preferred opening route: \" + metrics.requestedOpeningMethodLabel + \".\" : null,\n              metrics.estimatedAePctReq != null ? \"Release the first side-step around \" + formatDisplayNumber(metrics.estimatedAePctReq, 1) + \"% of Dc.\" : null,\n              \"Avoid recutting on the return stroke and reduce plunge depth if the bottom starts to load up.\",\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: \"Plunging is a problem-solver strategy, not a universal first choice. Watch opening credibility, chip evacuation and finish expectations together.\",\n            items: dedupeTextItems(riskItems.map(function mapRisk(item) {\n              return item.title + \": \" + item.message;\n            })).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"Strategy basis\",\n            tone: metrics.plungeValueClass === \"strong_case\" ? \"good\" : \"default\",\n            badge: metrics.plungeValueLabel || \"Review\",\n            value: \"The case reads as \" + (metrics.requestedFeatureTypeLabel || \"Review\") + \" with \" + (metrics.requestedStabilityLabel || \"Review\") + \".\",\n            note: metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            items: dedupeTextItems([\n              metrics.requestedStartingHoleLabel ? \"Starting hole: \" + metrics.requestedStartingHoleLabel + \".\" : null,\n              metrics.requestedMachineLimitLabel ? \"Machine limit: \" + metrics.requestedMachineLimitLabel + \".\" : null,\n              metrics.requestedBottomContactLabel ? \"Bottom contact: \" + metrics.requestedBottomContactLabel + \".\" : null,\n            ]),\n          },\n          {\n            title: \"Depth and release\",\n            tone: metrics.recipeApFitClass === \"good\" ? \"good\" : \"watch\",\n            badge: titleCase(metrics.recipeApFitClass || \"review\"),\n            value: \"Depth reserve, step-over class and chip flow together decide whether the axial strategy stays calm enough to be believable.\",\n            note: dedupeTextItems([\n              metrics.reachMarginMm != null ? \"Usable-length margin \" + formatDisplayNumber(metrics.reachMarginMm, 2) + \" mm\" : null,\n              metrics.apmxMarginMm != null ? \"APMX margin \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm\" : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.stepOverLabel ? \"Step-over class: \" + metrics.stepOverLabel + \".\" : null,\n              metrics.requestedCoolantSupportLabel ? \"Coolant support: \" + metrics.requestedCoolantSupportLabel + \".\" : null,\n              metrics.drillAlternativeFlag ? \"Drilling remains a plausible alternative for the opening phase.\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Opening and return stroke\",\n            tone: metrics.openingFitClass === \"not_credible\" ? \"high\" : \"default\",\n            category: \"Opening\",\n            cause: \"Closed deep features become risky fast if plunging starts without a trustworthy entry route or if the return stroke begins to recut chips.\",\n            actions: dedupeTextItems([\n              \"Create or confirm the starting hole before trusting the plunge route.\",\n              \"Keep the return stroke clear of chips and reduce plunge depth if the bottom begins to load up.\",\n              metrics.drillAlternativeFlag ? \"Compare the opening phase against drilling before committing to plunging.\" : null,\n            ]),\n          },\n          {\n            title: \"Chip and stability control\",\n            tone: metrics.chipEvacuationSeverityClass === \"critical\" || metrics.chatterRiskClass === \"high\" ? \"watch\" : \"default\",\n            category: \"Process risk\",\n            cause: \"Deep cavities, long overhangs and difficult materials can turn a believable plunge route into a noisy, heat-loaded process very quickly.\",\n            actions: dedupeTextItems([\n              \"Upgrade coolant or air support before pushing feed.\",\n              \"Shorten gauge length and release the first passes conservatively.\",\n              \"Split roughing and finishing when the contour must end up accurate or clean.\",\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var riskItems;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"plunging\",\n          outcome: \"no_match\",\n          summary: \"No credible plunge-milling recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current plunging inputs do not support a credible recommendation.\"),\n            noMatchGuidance({\n              message: \"Check the minimum opening width, plunge depth, starting hole strategy, stability class and whether the process should stay roughing-only or split into roughing plus finish.\",\n              steps: [\n                \"Confirm the minimum opening width and the full plunge depth.\",\n                \"Clarify whether a starting hole or an existing opening is really available.\",\n                \"Check if plunging is solving a real stability, overhang or machine-limit problem.\",\n                \"Review chip evacuation support for deep cavities and inner contours.\",\n                \"Keep drilling or a finish follow-up visible when the case asks for it.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust plunging inputs\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      riskItems = buildRiskItems(top);\n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best plunge-milling fit for \" + (metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm ap\" : \"the stated depth\") + \" and \" + (metrics.requestedFeatureWidthMm != null ? formatDisplayNumber(metrics.requestedFeatureWidthMm, 2) + \" mm opening\" : \"the stated opening\") + \".\",\n        headerPills: [\n          { tone: metrics.plungeValueClass === \"strong_case\" ? \"good\" : metrics.plungeValueClass === \"valid\" ? \"default\" : \"watch\", text: metrics.plungeValueLabel || \"Best fit\" },\n          { tone: metrics.openingFitClass === \"ready\" ? \"good\" : metrics.openingFitClass === \"possible_with_opening_strategy\" ? \"default\" : \"watch\", text: \"Opening: \" + (metrics.openingFitLabel || \"Review\") },\n          { tone: metrics.chipEvacuationSeverityClass === \"low\" ? \"good\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"default\" : \"watch\", text: \"Chip: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") },\n          { tone: metrics.finishFitClass === \"roughing_native\" ? \"good\" : \"watch\", text: metrics.finishFitClass === \"roughing_native\" ? \"Route: Roughing-native\" : \"Route: Finish split\" },\n        ],\n      };\n    \n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine fit\",\n          tone: metrics.plungeValueClass === \"strong_case\" ? \"good\" : metrics.plungeValueClass === \"valid\" ? \"default\" : \"watch\",\n          badge: metrics.requestedMachineLimitLabel || \"Review\",\n          value: \"Chip severity: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\"),\n          note: \"Plunging becomes valuable when the setup wants lower radial force, but it still needs clean chip handling and a believable opening route.\",\n          items: dedupeTextItems([\n            metrics.stepOverLabel ? \"Step-over class: \" + metrics.stepOverLabel + \".\" : null,\n            metrics.requestedStabilityLabel ? \"Stability: \" + metrics.requestedStabilityLabel + \".\" : null,\n            metrics.requestedCoolantSupportLabel ? \"Coolant support: \" + metrics.requestedCoolantSupportLabel + \".\" : null,\n          ]),\n        },\n      };\n    \n      return createResultViewModel({\n        processId: \"plunging\",\n        outcome: top.score.total >= 8 ? \"match\" : \"limited_match\",\n        summary: \"Best plunge-milling result based on axial depth fit, opening credibility, stability benefits and roughing realism.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          buildMillingBundleRecommendation(candidate),\n          featureSummary(buildFeatureItems(top)),\n          geometryFit(buildGeometryItems(top)),\n          fitKpis(buildFitItems(top)),\n          recipeBlock,\n          machineBlock,\n          buildSetupBlock(top, riskItems),\n          riskNotes(riskItems),\n          alternatives(buildAlternativeItems(scored)),\n          commerceCta(Object.assign({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }, buildMillingCompositeCommerceData(candidate) || {})),\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust plunging inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/plunging/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"plunging\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/plunging/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function average(values) {\n      var filtered = (values || []).filter(function keep(value) {\n        return value != null && Number.isFinite(value);\n      });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) {\n        return total + value;\n      }, 0) / filtered.length;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function scoreToken(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function normalizeConceptPreference(value) {\n      if (value === \"solid_carbide_only\") return \"solid_carbide\";\n      if (value === \"solid_or_exchangeable\") return \"solid_or_exchangeable\";\n      if (value === \"plunge_cutter_only\") return \"plunge_cutter\";\n      if (value === \"indexable_only\") return \"indexable\";\n      return \"either\";\n    }\n    \n    function getFeatureTypeLabel(value) {\n      return {\n        deep_cavity: \"Deep cavity / pocket\",\n        corner_rest_material: \"Corner rest material\",\n        inner_contour: \"Inner contour\",\n        axial_opening: \"Axial opening / roughing\",\n      }[value] || \"Plunging feature\";\n    }\n    \n    function getStartingHoleLabel(value) {\n      return {\n        yes: \"Existing hole / opening\",\n        no: \"No starting hole\",\n        unsure: \"Opening unclear\",\n      }[value] || \"Opening review\";\n    }\n    \n    function getFinishStrategyLabel(value) {\n      return {\n        roughing_only: \"Roughing only\",\n        rough_plus_finish: \"Rough + finish\",\n        final_contour_critical: \"Final contour critical\",\n      }[value] || \"Process target\";\n    }\n    \n    function getCoolantSupportLabel(value) {\n      return {\n        internal: \"Internal coolant\",\n        external: \"External coolant\",\n        air: \"Air blast\",\n        dry: \"Dry\",\n        unknown: \"Unknown\",\n      }[value] || \"Review\";\n    }\n    \n    function getStabilityLabel(value) {\n      return {\n        stable: \"Stable\",\n        normal: \"Normal\",\n        long_overhang: \"Long overhang\",\n        poor_stability: \"Poor stability\",\n        low_power: \"Low power / torque\",\n      }[value] || \"Review\";\n    }\n    \n    function getConceptLabel(value) {\n      return {\n        solid_carbide: \"Solid carbide\",\n        exchangeable_head: \"Exchangeable head\",\n        solid_or_exchangeable: \"Solid / exchangeable\",\n        plunge_cutter: \"Dedicated plunge cutter\",\n        indexable: \"Indexable\",\n        either: \"Either\",\n      }[value] || \"Review\";\n    }\n    \n    function getOpeningMethodLabel(value) {\n      return {\n        any: \"Any\",\n        drilling: \"Drilling\",\n        existing_hole: \"Existing hole\",\n        ramp_alternative: \"Ramp alternative\",\n        plunge_only: \"Plunge only\",\n        review: \"Review\",\n      }[value] || \"Review\";\n    }\n    \n    function getMachineLimitLabel(value) {\n      return {\n        high_power: \"No issue\",\n        normal: \"Normal\",\n        low_power: \"Low power\",\n        low_torque: \"Low torque\",\n        unknown: \"Unknown\",\n      }[value] || \"Review\";\n    }\n    \n    function getBottomContactLabel(value) {\n      return {\n        no: \"Not critical\",\n        yes: \"Critical\",\n        unknown: \"Unknown\",\n      }[value] || \"Review\";\n    }\n    \n    function getPlungeValueLabel(value) {\n      return {\n        weak_need: \"Weak need\",\n        valid: \"Valid case\",\n        strong_case: \"Strong case\",\n      }[value] || \"Review\";\n    }\n    \n    function getOpeningFitLabel(value) {\n      return {\n        ready: \"Ready\",\n        possible_with_opening_strategy: \"Possible with opening strategy\",\n        not_credible: \"Not credible yet\",\n      }[value] || \"Review\";\n    }\n    \n    function getFinishFitLabel(value) {\n      return {\n        roughing_native: \"Roughing-native\",\n        roughing_plus_finish_needed: \"Finish split recommended\",\n        final_contour_not_credible: \"Final contour needs another route\",\n      }[value] || \"Review\";\n    }\n    \n    function getStepOverLabel(value) {\n      return {\n        full_plunge_step: \"Full plunge step\",\n        reduced_step: \"Reduced step\",\n        conservative_step: \"Conservative step\",\n      }[value] || \"Review\";\n    }\n    \n    function deriveRequestedConditionStage() {\n      return \"roughing\";\n    }\n    \n    function deriveMachineLimitClass(stabilityClass, explicitClass) {\n      if (explicitClass) return explicitClass;\n      if (stabilityClass === \"low_power\") return \"low_power\";\n      return \"normal\";\n    }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var helixAngle = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neckDiameter = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var productText = [\n        candidate.catalog && candidate.catalog.productTitle,\n        candidate.catalog && candidate.catalog.variantTitle,\n        candidate.ids && candidate.ids.sku,\n      ].join(\" \").toLowerCase();\n    \n      if (productText.indexOf(\"plunge\") >= 0) return \"plunge_cutter\";\n      if (productText.indexOf(\"head\") >= 0 || productText.indexOf(\"multi-master\") >= 0 || productText.indexOf(\"multimaster\") >= 0) return \"exchangeable_head\";\n      if (productText.indexOf(\"body\") >= 0 || productText.indexOf(\"index\") >= 0 || productText.indexOf(\"cutter\") >= 0) return \"indexable\";\n      if (diameter != null && diameter >= 32) return \"indexable\";\n      if (diameter != null && diameter <= 16 && helixAngle != null && helixAngle >= 30) return \"solid_carbide\";\n      if (neckDiameter != null && diameter != null && neckDiameter < diameter) return \"solid_carbide\";\n      if (diameter != null && diameter <= 20) return \"solid_or_exchangeable\";\n      return \"either\";\n    }\n    \n    function deriveSuggestedConcept(inputs) {\n      var solidBias = 0;\n      var exchangeableBias = 0;\n      var plungeBias = 0;\n      var indexableBias = 0;\n    \n      if (inputs.featureType === \"inner_contour\" || inputs.featureType === \"corner_rest_material\") {\n        solidBias += 2;\n        exchangeableBias += 1;\n      }\n      if (inputs.featureType === \"deep_cavity\") {\n        solidBias += 1;\n        exchangeableBias += 1;\n        plungeBias += 1;\n      }\n      if (inputs.featureType === \"axial_opening\" && inputs.machineLimitClass !== \"high_power\") {\n        plungeBias += 2;\n      }\n      if (inputs.toolToWidthRatio != null && inputs.toolToWidthRatio <= 0.8) {\n        solidBias += 2;\n        exchangeableBias += 1;\n      }\n      if (inputs.featureDepthRatio != null && inputs.featureDepthRatio >= 1.2) {\n        plungeBias += 1;\n        exchangeableBias += 1;\n      }\n      if (inputs.stabilityClass === \"long_overhang\" || inputs.stabilityClass === \"poor_stability\") {\n        plungeBias += 2;\n        solidBias += 1;\n      }\n      if (inputs.machineLimitClass === \"low_power\" || inputs.machineLimitClass === \"low_torque\") {\n        plungeBias += 2;\n        indexableBias += 1;\n      }\n      if (inputs.materialSeverityScore >= 0.6) {\n        plungeBias += 1;\n        solidBias += 1;\n      }\n      if (inputs.finishStrategy === \"final_contour_critical\") {\n        solidBias += 2;\n        exchangeableBias += 1;\n      }\n      if (inputs.priority === \"productivity\" && inputs.featureType === \"deep_cavity\" && (inputs.toolToWidthRatio == null || inputs.toolToWidthRatio >= 0.8)) {\n        plungeBias += 1;\n        indexableBias += 2;\n      }\n    \n      if (solidBias >= plungeBias + 2 && solidBias >= indexableBias + 1) {\n        return solidBias >= exchangeableBias + 2 ? \"solid_carbide\" : \"solid_or_exchangeable\";\n      }\n      if (exchangeableBias >= solidBias + 1 && exchangeableBias >= plungeBias + 1 && exchangeableBias >= indexableBias) {\n        return \"exchangeable_head\";\n      }\n      if (plungeBias >= solidBias + 1 && plungeBias >= exchangeableBias + 1 && plungeBias >= indexableBias) {\n        return \"plunge_cutter\";\n      }\n      if (indexableBias >= solidBias + 2 && indexableBias >= plungeBias + 1) {\n        return \"indexable\";\n      }\n      return \"solid_or_exchangeable\";\n    }\n    \n    function evaluateConceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var explicitDesired = explicitConcept !== \"either\" ? explicitConcept : desiredConcept;\n      var score = 0.76;\n    \n      if (explicitDesired === \"either\" || candidateConcept === \"either\") score = 0.82;\n      else if (explicitDesired === \"solid_or_exchangeable\" && (candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\")) score = 0.96;\n      else if (explicitDesired === \"plunge_cutter\" && candidateConcept === \"plunge_cutter\") score = 1;\n      else if (explicitDesired === \"indexable\" && (candidateConcept === \"indexable\" || candidateConcept === \"plunge_cutter\")) score = candidateConcept === \"plunge_cutter\" ? 0.88 : 1;\n      else if (candidateConcept === explicitDesired) score = explicitConcept === \"either\" ? 0.92 : 1;\n      else if ((candidateConcept === \"solid_or_exchangeable\" && (explicitDesired === \"solid_carbide\" || explicitDesired === \"exchangeable_head\"))\n        || (explicitDesired === \"solid_or_exchangeable\" && candidateConcept === \"either\")) {\n        score = explicitConcept === \"either\" ? 0.8 : 0.7;\n      } else if (explicitDesired === \"plunge_cutter\" && candidateConcept === \"indexable\") {\n        score = 0.72;\n      } else {\n        score = explicitConcept === \"either\" ? 0.5 : 0.24;\n      }\n    \n      return {\n        score: score,\n        className: score >= 0.9 ? \"strong\" : score >= 0.7 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\",\n      };\n    }\n    \n    function evaluateWidthRatio(toolToWidthRatio, featureType) {\n      var preferredLimit = scoreToken(featureType, {\n        deep_cavity: 0.9,\n        corner_rest_material: 0.75,\n        inner_contour: 0.8,\n        axial_opening: 0.95,\n      }, 0.88);\n      var hardLimit = 1;\n      var score;\n    \n      if (toolToWidthRatio == null) {\n        return { score: 0.5, className: \"unknown\", hardFail: false, preferredLimit: preferredLimit };\n      }\n      if (toolToWidthRatio > hardLimit) {\n        return { score: 0, className: \"over\", hardFail: true, preferredLimit: preferredLimit };\n      }\n      if (toolToWidthRatio <= preferredLimit) {\n        score = toolToWidthRatio <= preferredLimit * 0.82 ? 1 : 0.92;\n        return { score: score, className: \"good\", hardFail: false, preferredLimit: preferredLimit };\n      }\n      score = clamp(0.84 - ((toolToWidthRatio - preferredLimit) / Math.max(hardLimit - preferredLimit, 0.01)) * 0.56, 0.22, 0.84);\n      return {\n        score: score,\n        className: toolToWidthRatio <= preferredLimit + 0.08 ? \"conditional\" : \"poor\",\n        hardFail: false,\n        preferredLimit: preferredLimit,\n      };\n    }\n    \n    function evaluateBandFit(requestedValue, band, options) {\n      var min = toNullableNumber(band && band.min);\n      var typ = toNullableNumber(band && band.typ);\n      var max = toNullableNumber(band && band.max);\n      var upper = max != null ? max : (typ != null ? typ : min);\n      var tolerance = options && options.overflowTolerance != null ? options.overflowTolerance : 0.35;\n      var overflowRatio;\n      var score;\n    \n      if (requestedValue == null) return { score: 0.5, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (upper == null) return { score: 0.58, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (requestedValue > upper) {\n        overflowRatio = upper > 0 ? (requestedValue - upper) / upper : 1;\n        score = clamp(0.62 - overflowRatio * 0.8, 0.12, 0.62);\n        return {\n          score: score,\n          className: overflowRatio <= tolerance ? \"conditional\" : \"over\",\n          hardFail: overflowRatio > tolerance,\n          min: min,\n          typ: typ,\n          max: max,\n          upper: upper,\n        };\n      }\n      if (typ != null && requestedValue > typ) {\n        score = clamp(1 - ((requestedValue - typ) / Math.max((upper - typ) || typ || 1, 1)) * 0.24, 0.8, 1);\n        return { score: score, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      }\n      if (min != null && requestedValue < min) return { score: 0.86, className: \"light\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      return { score: 0.95, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 5) return 1;\n      if (margin >= 2) return 0.88;\n      if (margin >= 0.5) return 0.74;\n      if (margin >= 0) return 0.58;\n      if (margin >= -1) return 0.18;\n      return 0;\n    }\n    \n    function classifyMaterialSeverity(ctx, materialCondition) {\n      var materialCode = String(ctx && ctx.materialCode || \"\").toUpperCase();\n      var base = scoreToken(materialCode.charAt(0), {\n        P: 0.24,\n        M: 0.54,\n        K: 0.18,\n        N: 0.22,\n        S: 0.78,\n        H: 0.64,\n      }, 0.32);\n      var score = clamp(base + scoreToken(materialCondition, {\n        standard: 0,\n        tough_long_chipping: 0.1,\n        sticky_bue: 0.12,\n        work_hardening: 0.2,\n        hard_abrasive: 0.18,\n        unknown: 0.08,\n      }, 0.08), 0, 1);\n    \n      return {\n        score: score,\n        className: score >= 0.74 ? \"critical\" : score >= 0.52 ? \"high\" : score >= 0.3 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyCoolantSupport(inputs, candidate) {\n      var candidateHasTsc = candidate.common && candidate.common.coolantTsc === true;\n      var answer = inputs.coolantSupport;\n      if (!answer || answer === \"unknown\") return { score: 0.56, className: \"unknown\" };\n      if (answer === \"internal\") return { score: candidateHasTsc ? 1 : 0.72, className: candidateHasTsc ? \"strong\" : \"conditional\" };\n      if (answer === \"external\") return { score: 0.74, className: \"acceptable\" };\n      if (answer === \"air\") return { score: 0.66, className: \"limited\" };\n      if (answer === \"dry\") return { score: 0.42, className: \"weak\" };\n      return { score: 0.56, className: \"unknown\" };\n    }\n    \n    function classifyChipEvacuationSeverity(inputs) {\n      var score = 0;\n      score += inputs.materialSeverityScore * 0.34;\n      score += scoreToken(inputs.featureType, {\n        deep_cavity: 0.22,\n        corner_rest_material: 0.14,\n        inner_contour: 0.18,\n        axial_opening: 0.08,\n      }, 0.12);\n      score += clamp((inputs.featureDepthRatio || 0) / 3.5, 0, 1) * 0.18;\n      score += (1 - inputs.coolantSupportScore) * 0.2;\n      score += inputs.startingHoleStatus === \"no\" ? 0.06 : inputs.startingHoleStatus === \"unsure\" ? 0.03 : 0;\n      score += inputs.bottomContactCritical === \"yes\" ? 0.08 : 0;\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.74 ? \"critical\" : score >= 0.54 ? \"high\" : score >= 0.3 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyChatterRisk(inputs) {\n      var score = 0;\n      score += scoreToken(inputs.stabilityClass, {\n        stable: 0.04,\n        normal: 0.14,\n        long_overhang: 0.42,\n        poor_stability: 0.52,\n        low_power: 0.26,\n      }, 0.16);\n      score += scoreToken(inputs.featureType, {\n        deep_cavity: 0.18,\n        corner_rest_material: 0.14,\n        inner_contour: 0.18,\n        axial_opening: 0.06,\n      }, 0.1);\n      score += clamp((inputs.apRatio || 0) / 2.8, 0, 1) * 0.14;\n      score += inputs.materialSeverityScore * 0.16;\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.6 ? \"high\" : score >= 0.32 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyMachineLoad(inputs) {\n      var score = 0;\n      score += clamp((inputs.apRatio || 0) / 2.5, 0, 1) * 0.34;\n      score += inputs.materialSeverityScore * 0.16;\n      score += scoreToken(inputs.machineLimitClass, {\n        high_power: 0,\n        normal: 0.06,\n        low_power: 0.18,\n        low_torque: 0.22,\n        unknown: 0.08,\n      }, 0.08);\n      score += inputs.stepOverClass === \"conservative_step\" ? 0 : inputs.stepOverClass === \"reduced_step\" ? 0.04 : 0.08;\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.68 ? \"critical\" : score >= 0.48 ? \"high\" : score >= 0.24 ? \"normal\" : \"light\",\n      };\n    }\n    \n    function classifyPlungeValue(inputs) {\n      var score = 0.08;\n      score += scoreToken(inputs.stabilityClass, {\n        stable: 0.02,\n        normal: 0.08,\n        long_overhang: 0.26,\n        poor_stability: 0.3,\n        low_power: 0.24,\n      }, 0.08);\n      score += scoreToken(inputs.machineLimitClass, {\n        high_power: 0,\n        normal: 0.04,\n        low_power: 0.16,\n        low_torque: 0.18,\n        unknown: 0.06,\n      }, 0.06);\n      score += scoreToken(inputs.featureType, {\n        deep_cavity: 0.18,\n        corner_rest_material: 0.14,\n        inner_contour: 0.12,\n        axial_opening: 0.08,\n      }, 0.12);\n      score += inputs.materialSeverityScore * 0.22;\n      score -= inputs.finishStrategy === \"final_contour_critical\" ? 0.12 : 0;\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.68 ? \"strong_case\" : score >= 0.42 ? \"valid\" : \"weak_need\",\n        label: getPlungeValueLabel(score >= 0.68 ? \"strong_case\" : score >= 0.42 ? \"valid\" : \"weak_need\"),\n      };\n    }\n    \n    function evaluateOpeningFit(startingHoleStatus, openingMethod, featureType) {\n      var score;\n      var className;\n    \n      if (startingHoleStatus === \"yes\") {\n        score = featureType === \"corner_rest_material\" ? 0.94 : 1;\n        className = \"ready\";\n      } else if (startingHoleStatus === \"unsure\") {\n        score = 0.48;\n        className = \"possible_with_opening_strategy\";\n      } else if (featureType === \"corner_rest_material\") {\n        score = openingMethod === \"plunge_only\" ? 0.64 : 0.72;\n        className = \"possible_with_opening_strategy\";\n      } else if (openingMethod === \"drilling\" || openingMethod === \"existing_hole\") {\n        score = 0.64;\n        className = \"possible_with_opening_strategy\";\n      } else if (openingMethod === \"ramp_alternative\") {\n        score = 0.56;\n        className = \"possible_with_opening_strategy\";\n      } else {\n        score = openingMethod === \"plunge_only\" ? 0.18 : 0.28;\n        className = \"not_credible\";\n      }\n    \n      return {\n        score: score,\n        className: className,\n        label: getOpeningFitLabel(className),\n      };\n    }\n    \n    function evaluateFinishFit(finishStrategy) {\n      if (finishStrategy === \"roughing_only\") return { score: 1, className: \"roughing_native\", label: getFinishFitLabel(\"roughing_native\") };\n      if (finishStrategy === \"rough_plus_finish\") return { score: 0.9, className: \"roughing_plus_finish_needed\", label: getFinishFitLabel(\"roughing_plus_finish_needed\") };\n      return { score: 0.42, className: \"final_contour_not_credible\", label: getFinishFitLabel(\"final_contour_not_credible\") };\n    }\n    \n    function classifyStepOverClass(toolConcept, stabilityClass, machineLimitClass) {\n      if (stabilityClass === \"long_overhang\" || stabilityClass === \"poor_stability\" || machineLimitClass === \"low_power\" || machineLimitClass === \"low_torque\") {\n        return \"conservative_step\";\n      }\n      if (toolConcept === \"plunge_cutter\" || toolConcept === \"indexable\") {\n        return \"full_plunge_step\";\n      }\n      return \"reduced_step\";\n    }\n    \n    function getStepOverFactor(stepOverClass) {\n      return {\n        full_plunge_step: 1,\n        reduced_step: 0.82,\n        conservative_step: 0.65,\n      }[stepOverClass] || 0.82;\n    }\n    \n    function scoreStageFit(requestedStage, row) {\n      var rowStage = row && row.constraints ? row.constraints.conditionStage : null;\n      if (!requestedStage || !rowStage) return 0.76;\n      if (requestedStage === rowStage) return 1;\n      if (rowStage === \"semi-finishing\") return 0.82;\n      return 0.62;\n    }\n    \n    function computeRpm(vc, diameter) {\n      if (vc == null || diameter == null || diameter <= 0) return null;\n      return (1000 * vc) / (Math.PI * diameter);\n    }\n    \n    function computeFeed(fz, rpm, fluteCount) {\n      if (fz == null || rpm == null || fluteCount == null || fluteCount <= 0) return null;\n      return fz * rpm * fluteCount;\n    }\n    \n    function computeMrr(ap, ae, feed) {\n      if (ap == null || ae == null || feed == null) return null;\n      return (ap * ae * feed) / 1000;\n    }\n    \n    function computeDrillAlternativeFlag(featureType, featureWidth, startingHoleStatus) {\n      return featureType === \"axial_opening\" && featureWidth != null && featureWidth <= 35 && startingHoleStatus !== \"yes\";\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"plunging\", ctx, toolkits));\n      var featureType = getAnswer(ctx, \"plunging_feature_type\");\n      var startingHoleStatus = getAnswer(ctx, \"plunging_starting_hole_status\");\n      var finishStrategy = getAnswer(ctx, \"plunging_finish_strategy\");\n      var stabilityClass = getAnswer(ctx, \"plunging_stability_class\");\n      var machineLimitClass = deriveMachineLimitClass(stabilityClass, getAnswer(ctx, \"plunging_machine_limit_class\"));\n      var featureWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var featureDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n    \n      derived.condition_stage = deriveRequestedConditionStage();\n      derived.plunging_feature_type_label = getFeatureTypeLabel(featureType);\n      derived.plunging_starting_hole_label = getStartingHoleLabel(startingHoleStatus);\n      derived.plunging_finish_strategy_label = getFinishStrategyLabel(finishStrategy);\n      derived.plunging_stability_label = getStabilityLabel(stabilityClass);\n      derived.plunging_machine_limit_label = getMachineLimitLabel(machineLimitClass);\n      derived.opening_strategy_class = getAnswer(ctx, \"plunging_opening_method\") || \"review\";\n      derived.machine_limit_class = machineLimitClass;\n      derived.finish_split_required = finishStrategy === \"rough_plus_finish\" || finishStrategy === \"final_contour_critical\";\n      if (featureWidth != null && featureDepth != null && featureWidth > 0) {\n        derived.plunging_depth_ratio = featureDepth / featureWidth;\n      }\n    \n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"plunging\", ctx);\n      var featureType = getAnswer(ctx, \"plunging_feature_type\");\n      var featureWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var featureDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var startingHoleStatus = getAnswer(ctx, \"plunging_starting_hole_status\");\n      var stabilityClass = getAnswer(ctx, \"plunging_stability_class\");\n      var finishStrategy = getAnswer(ctx, \"plunging_finish_strategy\");\n      var coolantSupport = getAnswer(ctx, \"plunging_coolant_support\");\n      var conceptPreference = normalizeConceptPreference(getAnswer(ctx, \"plunging_tool_concept_preference\"));\n      var depthRatio = featureWidth != null && featureDepth != null && featureWidth > 0 ? featureDepth / featureWidth : null;\n    \n      if ((featureType === \"deep_cavity\" || featureType === \"inner_contour\" || featureType === \"axial_opening\") && startingHoleStatus === \"no\") {\n        issues.push({\n          field: \"plunging_starting_hole_status\",\n          message: \"Plunge milling in deep inner features needs a credible starting hole or opening strategy before the process is believable.\",\n          severity: \"warning\",\n          code: \"plunging_starting_hole_missing\",\n        });\n      }\n      if (finishStrategy === \"final_contour_critical\") {\n        issues.push({\n          field: \"plunging_finish_strategy\",\n          message: \"Plunging is primarily a roughing strategy. Keep the finish split visible when the final contour is critical.\",\n          severity: \"warning\",\n          code: \"plunging_finish_split\",\n        });\n      }\n      if (featureType === \"deep_cavity\" && (coolantSupport === \"dry\" || coolantSupport === \"unknown\")) {\n        issues.push({\n          field: \"plunging_coolant_support\",\n          message: \"Deep cavity plunging gets risky quickly without a reliable chip evacuation route.\",\n          severity: \"warning\",\n          code: \"plunging_chip_control_risk\",\n        });\n      }\n      if ((featureType === \"inner_contour\" || featureType === \"corner_rest_material\") && conceptPreference === \"indexable\") {\n        issues.push({\n          field: \"plunging_tool_concept_preference\",\n          message: \"Indexable-only is usually a poor fit for very narrow or contour-driven plunge cases. Solid or exchangeable logic is more credible.\",\n          severity: \"warning\",\n          code: \"plunging_indexable_conflict\",\n        });\n      }\n      if (depthRatio != null && depthRatio >= 2.2) {\n        issues.push({\n          field: \"feature_depth_mm\",\n          message: \"This depth-to-opening ratio is demanding. Reach, chip evacuation and step-over need a conservative release.\",\n          severity: \"warning\",\n          code: \"plunging_depth_ratio_high\",\n        });\n      }\n      if ((stabilityClass === \"stable\" || stabilityClass === \"normal\") && featureType === \"axial_opening\" && getAnswer(ctx, \"material_condition_class\") === \"standard\") {\n        issues.push({\n          field: \"plunging_feature_type\",\n          message: \"Under favorable conditions, plunge milling is often not the first-choice strategy because side milling or drilling may be more productive.\",\n          severity: \"warning\",\n          code: \"plunging_not_first_choice\",\n        });\n      }\n    \n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"plunging\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var featureType = getAnswer(ctx, \"plunging_feature_type\");\n      var featureWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var featureDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var startingHoleStatus = getAnswer(ctx, \"plunging_starting_hole_status\") || \"unsure\";\n      var stabilityClass = getAnswer(ctx, \"plunging_stability_class\") || \"normal\";\n      var materialCondition = getAnswer(ctx, \"material_condition_class\") || \"standard\";\n      var finishStrategy = getAnswer(ctx, \"plunging_finish_strategy\") || \"roughing_only\";\n      var coolantSupport = getAnswer(ctx, \"plunging_coolant_support\") || \"unknown\";\n      var priority = getAnswer(ctx, \"priority\") || \"balanced\";\n      var maxToolDiameter = toNullableNumber(getAnswer(ctx, \"max_tool_diameter_mm\"));\n      var reachRequirement = toNullableNumber(getAnswer(ctx, \"plunging_reach_mm\")) || featureDepth;\n      var explicitConcept = normalizeConceptPreference(getAnswer(ctx, \"plunging_tool_concept_preference\"));\n      var openingMethod = getAnswer(ctx, \"plunging_opening_method\") || \"any\";\n      var machineLimitClass = deriveMachineLimitClass(stabilityClass, getAnswer(ctx, \"plunging_machine_limit_class\"));\n      var bottomContactCritical = getAnswer(ctx, \"plunging_bottom_contact_critical\") || \"unknown\";\n      var materialSeverity = classifyMaterialSeverity(ctx, materialCondition);\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var row = recipeResult.row || rows[0] || null;\n        var recipe = recipeResult.recipe || {};\n        var candidateDiameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var candidateUsableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var candidateApmx = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var candidateFluteCount = getCandidateFluteCount(candidate);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var toolToWidthRatio = featureWidth != null && candidateDiameter != null && featureWidth > 0 ? candidateDiameter / featureWidth : null;\n        var widthFit = evaluateWidthRatio(toolToWidthRatio, featureType);\n        var featureDepthRatio = featureWidth != null && featureDepth != null && featureWidth > 0 ? featureDepth / featureWidth : null;\n        var apRatio = featureDepth != null && candidateDiameter != null && candidateDiameter > 0 ? featureDepth / candidateDiameter : null;\n        var axialDepthFit = evaluateBandFit(featureDepth, recipe.ap, { overflowTolerance: 0.65 });\n        var reachMargin = candidateUsableLength != null && featureDepth != null ? candidateUsableLength - featureDepth : null;\n        var apmxMargin = candidateApmx != null && featureDepth != null ? candidateApmx - featureDepth : null;\n        var reachReserveScore = average([marginScore(reachMargin), marginScore(apmxMargin)]);\n        var desiredConcept = explicitConcept === \"either\"\n          ? deriveSuggestedConcept({\n              featureType: featureType,\n              toolToWidthRatio: toolToWidthRatio,\n              featureDepthRatio: featureDepthRatio,\n              stabilityClass: stabilityClass,\n              machineLimitClass: machineLimitClass,\n              materialSeverityScore: materialSeverity.score,\n              finishStrategy: finishStrategy,\n              priority: priority,\n            })\n          : explicitConcept;\n        var conceptFit = evaluateConceptFit(candidateConcept, desiredConcept, explicitConcept);\n        var stepOverClass = classifyStepOverClass(desiredConcept, stabilityClass, machineLimitClass);\n        var recipeAePctTyp = toNullableNumber(recipe.aePct && recipe.aePct.typ);\n        var estimatedAePct = recipeAePctTyp != null ? recipeAePctTyp * getStepOverFactor(stepOverClass) : null;\n        var estimatedAeMm = candidateDiameter != null && estimatedAePct != null ? (candidateDiameter * estimatedAePct) / 100 : null;\n        var coolantFit = classifyCoolantSupport({ coolantSupport: coolantSupport }, candidate);\n        var chipSeverity = classifyChipEvacuationSeverity({\n          materialSeverityScore: materialSeverity.score,\n          featureType: featureType,\n          featureDepthRatio: featureDepthRatio,\n          coolantSupportScore: coolantFit.score,\n          startingHoleStatus: startingHoleStatus,\n          bottomContactCritical: bottomContactCritical,\n        });\n        var chatterRisk = classifyChatterRisk({\n          stabilityClass: stabilityClass,\n          featureType: featureType,\n          apRatio: apRatio,\n          materialSeverityScore: materialSeverity.score,\n        });\n        var openingFit = evaluateOpeningFit(startingHoleStatus, openingMethod, featureType);\n        var finishFit = evaluateFinishFit(finishStrategy);\n        var plungeValue = classifyPlungeValue({\n          stabilityClass: stabilityClass,\n          machineLimitClass: machineLimitClass,\n          featureType: featureType,\n          materialSeverityScore: materialSeverity.score,\n          finishStrategy: finishStrategy,\n        });\n        var machineLoad = classifyMachineLoad({\n          apRatio: apRatio,\n          materialSeverityScore: materialSeverity.score,\n          machineLimitClass: machineLimitClass,\n          stepOverClass: stepOverClass,\n        });\n        var drillAlternativeFlag = computeDrillAlternativeFlag(featureType, featureWidth, startingHoleStatus);\n        var stageFitScore = scoreStageFit(getAnswer(ctx, \"condition_stage\") || \"roughing\", row);\n        var rpmTyp = computeRpm(toNullableNumber(recipe.vc && recipe.vc.typ), candidateDiameter);\n        var feedTyp = computeFeed(toNullableNumber(recipe.fz && recipe.fz.typ), rpmTyp, candidateFluteCount);\n        var mrrTyp = computeMrr(featureDepth, estimatedAeMm, feedTyp);\n        var hardRejectReason = null;\n        var metrics;\n        var parts;\n        var total;\n        var confidence;\n        var riskPenalty;\n    \n        if (!rows.length) hardRejectReason = \"No valid plunging row is available for this material and process context.\";\n        if (!hardRejectReason && maxToolDiameter != null && candidateDiameter != null && candidateDiameter > maxToolDiameter) hardRejectReason = \"Tool diameter exceeds the stated clearance limit.\";\n        if (!hardRejectReason && widthFit.hardFail) hardRejectReason = \"Tool diameter exceeds the available opening.\";\n        if (!hardRejectReason && axialDepthFit.hardFail) hardRejectReason = \"Requested axial depth exceeds the current plunging recipe window.\";\n        if (!hardRejectReason && reachMargin != null && reachMargin < 0) hardRejectReason = \"Usable length is shorter than the requested plunge depth.\";\n        if (!hardRejectReason && apmxMargin != null && apmxMargin < 0) hardRejectReason = \"APMX is shorter than the requested plunge depth.\";\n    \n        metrics = {\n          requestedFeatureType: featureType,\n          requestedFeatureTypeLabel: getFeatureTypeLabel(featureType),\n          requestedFeatureWidthMm: featureWidth,\n          requestedFeatureDepthMm: featureDepth,\n          requestedStartingHoleStatus: startingHoleStatus,\n          requestedStartingHoleLabel: getStartingHoleLabel(startingHoleStatus),\n          requestedFinishStrategy: finishStrategy,\n          requestedFinishStrategyLabel: getFinishStrategyLabel(finishStrategy),\n          requestedStabilityClass: stabilityClass,\n          requestedStabilityLabel: getStabilityLabel(stabilityClass),\n          requestedCoolantSupport: coolantSupport,\n          requestedCoolantSupportLabel: getCoolantSupportLabel(coolantSupport),\n          requestedOpeningMethod: openingMethod,\n          requestedOpeningMethodLabel: getOpeningMethodLabel(openingMethod),\n          requestedMachineLimitClass: machineLimitClass,\n          requestedMachineLimitLabel: getMachineLimitLabel(machineLimitClass),\n          requestedMaterialCondition: materialCondition,\n          requestedBottomContactCritical: bottomContactCritical,\n          requestedBottomContactLabel: getBottomContactLabel(bottomContactCritical),\n          maxToolDiameterMm: maxToolDiameter,\n          reachRequirementMm: reachRequirement,\n          candidateDiameterMm: candidateDiameter,\n          candidateUsableLengthMm: candidateUsableLength,\n          candidateApmxMm: candidateApmx,\n          candidateFluteCount: candidateFluteCount,\n          candidateHelixAngleDeg: toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg),\n          toolToFeatureWidthRatio: toolToWidthRatio,\n          widthRatioPreferredLimit: widthFit.preferredLimit,\n          widthRatioFitClass: widthFit.className,\n          widthRatioFitScore: widthFit.score,\n          apRatio: apRatio,\n          featureDepthRatio: featureDepthRatio,\n          recipeVcMin: toNullableNumber(recipe.vc && recipe.vc.min),\n          recipeVcTyp: toNullableNumber(recipe.vc && recipe.vc.typ),\n          recipeVcMax: toNullableNumber(recipe.vc && recipe.vc.max),\n          recipeFzMin: toNullableNumber(recipe.fz && recipe.fz.min),\n          recipeFzTyp: toNullableNumber(recipe.fz && recipe.fz.typ),\n          recipeFzMax: toNullableNumber(recipe.fz && recipe.fz.max),\n          recipeApMin: axialDepthFit.min,\n          recipeApTyp: axialDepthFit.typ,\n          recipeApMax: axialDepthFit.max,\n          recipeApUpperMm: axialDepthFit.upper,\n          recipeAePctMin: toNullableNumber(recipe.aePct && recipe.aePct.min),\n          recipeAePctTyp: recipeAePctTyp,\n          recipeAePctMax: toNullableNumber(recipe.aePct && recipe.aePct.max),\n          recipeApFitClass: axialDepthFit.className,\n          recipeApFitScore: axialDepthFit.score,\n          reachMarginMm: reachMargin,\n          apmxMarginMm: apmxMargin,\n          reachReserveScore: reachReserveScore,\n          openingFitClass: openingFit.className,\n          openingFitLabel: openingFit.label,\n          openingFitScore: openingFit.score,\n          plungeValueClass: plungeValue.className,\n          plungeValueLabel: plungeValue.label,\n          plungeValueScore: plungeValue.score,\n          toolConceptGuess: candidateConcept,\n          toolConceptDesired: desiredConcept,\n          toolConceptDesiredLabel: getConceptLabel(desiredConcept),\n          toolConceptExplicit: explicitConcept,\n          toolConceptFitClass: conceptFit.className,\n          toolConceptScore: conceptFit.score,\n          coolantSupportClass: coolantFit.className,\n          coolantSupportScore: coolantFit.score,\n          chipEvacuationSeverityClass: chipSeverity.className,\n          chipEvacuationSeverityScore: chipSeverity.score,\n          chatterRiskClass: chatterRisk.className,\n          chatterRiskScore: chatterRisk.score,\n          machineLoadClass: machineLoad.className,\n          machineLoadScore: machineLoad.score,\n          finishFitClass: finishFit.className,\n          finishFitLabel: finishFit.label,\n          finishFitScore: finishFit.score,\n          stepOverClass: stepOverClass,\n          stepOverLabel: getStepOverLabel(stepOverClass),\n          estimatedAePctReq: estimatedAePct,\n          estimatedAeMmReq: estimatedAeMm,\n          drillAlternativeFlag: drillAlternativeFlag,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          rowCoolantMode: row && row.constraints ? row.constraints.coolantMode : null,\n          rowRecipeKind: row && row.familyData ? row.familyData.recipeRowKind : null,\n          rpmTyp: rpmTyp,\n          feedTypMmMin: feedTyp,\n          mrrTyp: mrrTyp,\n        };\n        Object.assign(metrics, recipeResult.debug || {});\n    \n        riskPenalty = clamp(\n          (1 - openingFit.score) * 0.26 +\n          chipSeverity.score * 0.22 +\n          chatterRisk.score * 0.18 +\n          (finishFit.className === \"final_contour_not_credible\" ? 0.14 : 0) +\n          (drillAlternativeFlag ? 0.08 : 0),\n          0,\n          1\n        );\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.1,\n          process: kernel.processFit(candidate, ctx) * 1.15,\n          plungeValue: plungeValue.score * 1.45,\n          axialDepth: axialDepthFit.score * 1.6,\n          clearance: widthFit.score * 1.25,\n          reach: reachReserveScore * 1.45,\n          opening: openingFit.score * 1.15,\n          toolConcept: conceptFit.score * 0.95,\n          chipControl: (1 - chipSeverity.score) * 1.05,\n          stability: (1 - chatterRisk.score) * 1.05,\n          coolant: coolantFit.score * 0.55,\n          finishFit: finishFit.score * 0.92,\n          machine: (1 - machineLoad.score) * 0.7,\n          stage: stageFitScore * 0.45,\n          riskPenalty: -riskPenalty,\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.82 : recipeResult.source === \"estimated\" ? 0.68 : 0.48;\n        confidence -= openingFit.className === \"not_credible\" ? 0.18 : openingFit.className === \"possible_with_opening_strategy\" ? 0.06 : 0;\n        confidence -= finishFit.className === \"final_contour_not_credible\" ? 0.1 : finishFit.className === \"roughing_plus_finish_needed\" ? 0.03 : 0;\n        confidence -= widthFit.className === \"poor\" ? 0.06 : widthFit.className === \"conditional\" ? 0.03 : 0;\n        confidence -= chipSeverity.className === \"critical\" ? 0.08 : chipSeverity.className === \"high\" ? 0.04 : 0;\n        confidence -= drillAlternativeFlag ? 0.05 : 0;\n        confidence = clamp(confidence, 0, 0.97);\n        if (hardRejectReason) confidence = 0;\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            plungeValue.className === \"strong_case\"\n              ? \"Long overhang, difficult material or machine limits make an axial-force plunge route technically attractive here.\"\n              : plungeValue.className === \"valid\"\n                ? \"Plunging still looks technically plausible, mainly because the setup benefits from lower radial loading.\"\n                : \"This case does not strongly need plunging unless the surrounding roughing route stays difficult.\",\n            axialDepthFit.score >= 0.9\n              ? \"The requested plunge depth still fits the available recipe window.\"\n              : \"The requested plunge depth is close to the edge of the current recipe window.\",\n            openingFit.className === \"ready\"\n              ? \"A credible opening route already exists for the plunge strategy.\"\n              : openingFit.className === \"possible_with_opening_strategy\"\n                ? \"The plunge route depends on creating or confirming a reliable opening first.\"\n                : \"Opening strategy is the main technical weakness of this plunge case.\",\n            conceptFit.className === \"strong\"\n              ? \"The current tool concept lines up well with the expected plunge use case.\"\n              : \"Tool concept remains a trade-off between cavity confinement, economy and plunge robustness.\",\n            drillAlternativeFlag\n              ? \"For this mainly axial opening, drilling may still be the more direct first choice up to roughly 35 mm.\"\n              : finishFit.className === \"roughing_plus_finish_needed\" || finishFit.className === \"final_contour_not_credible\"\n                ? \"Keep plunging as the roughing route and plan a follow-up wall or contour finish.\"\n                : \"This process can stay focused on roughing without overpromising a final-contour result.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/pocket-milling/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/pocket-milling/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/pocket-milling/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/pocket-milling/presenter.js\");\n    exports.default = createStubProcessModule(\"pocket_milling\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/pocket-milling/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(2);\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = String(item || \"\").replace(/\\s+/g, \" \").trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative pocket-milling option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        metrics.closedAngleCapabilityClass === \"4axis_needed\" || metrics.closedAngleCapabilityClass === \"5axis_needed\" ? {\n          severity: \"warning\",\n          title: \"Closed-angle access\",\n          message: \"Closed pocket angles should not be treated as a standard 3-axis pocket route without reviewing 4-axis or 5-axis access.\",\n        } : null,\n        metrics.chipEvacuationClass === \"high\" || metrics.chipEvacuationClass === \"critical\" ? {\n          severity: \"warning\",\n          title: \"Chip evacuation\",\n          message: \"The pocket depth and topology create a high chip-removal load. Reduce engagement or split the strategy before forcing a heavy route.\",\n        } : null,\n        metrics.chatterRiskClass === \"high\" ? {\n          severity: \"warning\",\n          title: \"Stability risk\",\n          message: \"This pocket reads as reach-sensitive or wall-sensitive, so heavy conventional roughing is less credible than a lighter route.\",\n        } : null,\n        metrics.finishSplitClass === \"mandatory\" ? {\n          severity: \"warning\",\n          title: \"Finish split\",\n          message: \"This case should stay visible as roughing plus a separate wall, floor or radius finish route.\",\n        } : null,\n        metrics.toolConceptFitClass === \"poor\" ? {\n          severity: \"warning\",\n          title: \"Concept conflict\",\n          message: \"The current tool concept is weaker than the pocket topology and finish target suggest.\",\n        } : null,\n      ].filter(Boolean).slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"opening\", label: \"Opening route\", result: metrics.openingStrategyScore >= 0.82 ? \"pass\" : metrics.openingStrategyScore >= 0.6 ? \"limited\" : \"fail\", note: \"Route: \" + (metrics.openingStrategyLabel || \"Review\") + \".\" },\n        { key: \"reach\", label: \"Reach reserve\", result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"pass\" : \"fail\", note: \"Margin: \" + (formatDisplayNumber(metrics.reachMarginMm, 2) || \"n/a\") + \" mm.\" },\n        { key: \"apmx\", label: \"APMX reserve\", result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"pass\" : \"fail\", note: \"Margin: \" + (formatDisplayNumber(metrics.apmxMarginMm, 2) || \"n/a\") + \" mm.\" },\n        { key: \"split\", label: \"Process split\", result: metrics.finishSplitClass === \"no\" ? \"pass\" : metrics.finishSplitClass === \"recommended\" ? \"limited\" : \"fail\", note: \"State: \" + (metrics.finishSplitLabel || \"Review\") + \".\" },\n      ];\n    }\n    \n    function buildFeatureItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"topology\", label: \"Pocket topology\", value: metrics.requestedTopologyLabel || \"Review\" },\n        { key: \"opening\", label: \"Minimum opening\", value: metrics.requestedMinOpeningMm != null ? formatDisplayNumber(metrics.requestedMinOpeningMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"depth\", label: \"Pocket depth\", value: metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"start\", label: \"Start condition\", value: metrics.requestedStartConditionLabel || \"Review\" },\n        { key: \"finish\", label: \"Process target\", value: metrics.requestedFinishStrategyLabel || \"Review\" },\n        { key: \"stability\", label: \"Stability\", value: metrics.requestedStabilityLabel || \"Review\" },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"diameter\", label: \"Tool diameter vs opening\", actual: metrics.candidateDiameterMm != null ? formatDisplayNumber(metrics.candidateDiameterMm, 2) + \" mm\" : null, target: metrics.requestedMinOpeningMm != null ? formatDisplayNumber(metrics.requestedMinOpeningMm, 2) + \" mm\" : null, result: metrics.toolWidthFitClass === \"strong\" || metrics.toolWidthFitClass === \"usable\" ? \"fit\" : metrics.toolWidthFitClass === \"tight\" || metrics.toolWidthFitClass === \"conditional\" ? \"near\" : \"mismatch\" },\n        { key: \"reach\", label: \"Usable length vs depth\", actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null, target: metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm\" : null, result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\" },\n        { key: \"apmx\", label: \"APMX vs depth\", actual: metrics.candidateApmxMm != null ? formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm\" : null, target: metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm\" : null, result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"fit\" : \"mismatch\" },\n        { key: \"corner\", label: \"Corner radius fit\", actual: metrics.candidateCornerRadiusMm != null ? formatDisplayNumber(metrics.candidateCornerRadiusMm, 2) + \" mm\" : null, target: metrics.requestedAllowedCornerRadiusMm != null ? \"<= \" + formatDisplayNumber(metrics.requestedAllowedCornerRadiusMm, 2) + \" mm\" : \"Open\", result: metrics.cornerRadiusFitClass === \"good\" || metrics.cornerRadiusFitClass === \"open\" ? \"fit\" : metrics.cornerRadiusFitClass === \"unknown\" ? \"near\" : \"mismatch\" },\n      ];\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"case\", label: \"Pocket case\", value: metrics.pocketSuitabilityLabel || \"Review\", status: metrics.pocketSuitabilityClass === \"strong_case\" ? \"good\" : metrics.pocketSuitabilityClass === \"valid_case\" ? \"ok\" : \"weak\" },\n        { key: \"concept\", label: \"Tool concept\", value: metrics.toolConceptDesiredLabel || \"Review\", status: metrics.toolConceptFitClass === \"strong\" ? \"good\" : metrics.toolConceptFitClass === \"usable\" ? \"ok\" : \"weak\" },\n        { key: \"chip\", label: \"Chip / chatter\", value: (metrics.chipEvacuationLabel || \"Review\") + \" / \" + (metrics.chatterRiskLabel || \"Review\"), status: metrics.chipEvacuationClass === \"low\" && metrics.chatterRiskClass === \"low\" ? \"good\" : metrics.chipEvacuationClass === \"critical\" || metrics.chatterRiskClass === \"high\" ? \"weak\" : \"ok\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatDisplayNumber(top.score.confidence, 2) || \"n/a\", status: top.score.confidence >= 0.82 ? \"good\" : top.score.confidence >= 0.65 ? \"ok\" : \"weak\" },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n      });\n      block.data.presentation = {\n        title: \"Start here\",\n        description: \"Pocket milling is rarely a one-tool one-pass story. Opening route, engagement style, depth reserve and the roughing-versus-finish split must stay visible next to vc and fz.\",\n        rowBackedValues: [\n          { label: \"Topology\", value: metrics.requestedTopologyLabel || \"Review\", tone: \"text\" },\n          { label: \"Opening\", value: metrics.openingStrategyLabel || \"Review\", tone: \"text\" },\n          { label: \"Concept\", value: metrics.toolConceptDesiredLabel || \"Review\", tone: \"text\" },\n          { label: \"Corner\", value: metrics.cornerRadiusFitLabel || \"Review\", tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"ap typ\", value: formatDisplayNumber(metrics.recipeApTyp, 2) || \"n/a\", unit: \"mm\" },\n          { label: \"ae typ\", value: formatDisplayNumber(metrics.estimatedAeMm, 2) || \"n/a\", unit: \"mm\" },\n        ],\n        machineValues: [\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n          { label: \"Dc/open\", value: formatDisplayNumber(metrics.toolWidthRatio, 2) || \"n/a\", tone: \"text\" },\n          { label: \"Depth/open\", value: formatDisplayNumber(metrics.pocketDepthRatio, 2) || \"n/a\", tone: \"text\" },\n        ],\n        trustCard: {\n          title: \"Pocket credibility\",\n          tone: metrics.pocketSuitabilityClass === \"strong_case\" ? \"good\" : metrics.pocketSuitabilityClass === \"valid_case\" ? \"default\" : \"watch\",\n          badge: metrics.pocketSuitabilityLabel || \"Review\",\n          value: \"Opening: \" + (metrics.openingStrategyLabel || \"Review\"),\n          note: \"The release values only stay credible if the pocket is treated as an access problem, not just as vc and fz. Deep, closed or finish-critical pockets usually need a visible strategy split.\",\n          items: dedupeTextItems([\n            metrics.finishSplitLabel ? \"Finish split: \" + metrics.finishSplitLabel + \".\" : null,\n            metrics.closedAngleCapabilityLabel && metrics.closedAngleCapabilityClass !== \"normal\" ? \"Closed angles: \" + metrics.closedAngleCapabilityLabel + \".\" : null,\n            metrics.recipeApFitClass ? \"Slice count estimate: \" + (formatDisplayNumber(metrics.estimatedSliceCount, 1) || \"n/a\") + \".\" : null,\n          ]),\n        },\n      };\n      return block;\n    }\n    \n    function buildSetupBlock(top, riskItems) {\n      var metrics = top.metrics || {};\n      var block = setupNotes([\n        { area: \"opening\", message: \"Opening route: \" + (metrics.openingStrategyLabel || \"Review\") },\n        { area: \"concept\", message: \"Preferred concept: \" + (metrics.toolConceptDesiredLabel || \"Review\") },\n        { area: \"split\", message: \"Process split: \" + (metrics.finishSplitLabel || \"Review\") },\n      ]);\n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Fit\",\n            highlight: \"This recommendation is driven mainly by pocket topology, minimum opening, depth reserve, corner-radius reach and whether the tool concept still matches the pocket's roughing-versus-finish logic.\",\n            items: dedupeTextItems([\n              metrics.toolWidthFitClass === \"strong\" || metrics.toolWidthFitClass === \"usable\" ? \"The tool diameter still fits the minimum pocket opening.\" : null,\n              metrics.cornerRadiusFitClass === \"good\" || metrics.cornerRadiusFitClass === \"open\" ? \"Corner-radius requirement stays believable.\" : null,\n              metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"Reach reserve still covers the pocket depth.\" : null,\n            ]).slice(0, 3),\n          },\n          how: {\n            title: \"How to start\",\n            tone: \"default\",\n            badge: metrics.openingStrategyLabel || \"Route\",\n            highlight: \"Treat this as a route definition: opening strategy first, then roughing engagement, then any separate wall, floor or corner cleanup needed for the final geometry.\",\n            items: dedupeTextItems([\n              \"Start with the selected opening route before forcing a full-pocket roughing pass.\",\n              metrics.finishSplitClass === \"mandatory\" || metrics.finishSplitClass === \"recommended\" ? \"Keep the finish split visible instead of promising a one-tool final pocket.\" : null,\n              metrics.chipEvacuationClass === \"high\" || metrics.chipEvacuationClass === \"critical\" ? \"Reduce engagement or split layers if chips start to pack in the pocket.\" : null,\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: \"Pocket milling becomes fragile when access, depth, chip evacuation, wall sensitivity and finish expectations all get tight at the same time.\",\n            items: dedupeTextItems(riskItems.map(function mapRisk(item) { return item.title + \": \" + item.message; })).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"Geometry and access\",\n            tone: metrics.toolWidthFitClass === \"strong\" || metrics.toolWidthFitClass === \"usable\" ? \"good\" : \"watch\",\n            badge: metrics.requestedTopologyLabel || \"Pocket\",\n            value: \"Pocket credibility depends first on the smallest free opening, not just on the nominal pocket size.\",\n            note: dedupeTextItems([\n              metrics.toolWidthRatio != null ? \"Tool / opening ratio \" + formatDisplayNumber(metrics.toolWidthRatio, 2) : null,\n              metrics.pocketDepthRatio != null ? \"Depth / opening ratio \" + formatDisplayNumber(metrics.pocketDepthRatio, 2) : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.requestedStartConditionLabel ? \"Start condition: \" + metrics.requestedStartConditionLabel + \".\" : null,\n              metrics.openingStrategyLabel ? \"Opening route: \" + metrics.openingStrategyLabel + \".\" : null,\n              metrics.closedAngleCapabilityClass !== \"normal\" && metrics.closedAngleCapabilityLabel ? \"Closed-angle route: \" + metrics.closedAngleCapabilityLabel + \".\" : null,\n            ]),\n          },\n          {\n            title: \"Depth, chip flow and finish split\",\n            tone: metrics.chipEvacuationClass === \"critical\" || metrics.chatterRiskClass === \"high\" ? \"watch\" : \"default\",\n            badge: metrics.finishSplitLabel || \"Review\",\n            value: \"Pocket depth drives both reach reserve and process calmness. Once the pocket is deep or closed, chip removal and finish strategy matter as much as raw speed data.\",\n            note: dedupeTextItems([\n              metrics.chipEvacuationLabel ? \"Chip evacuation: \" + metrics.chipEvacuationLabel : null,\n              metrics.chatterRiskLabel ? \"Chatter risk: \" + metrics.chatterRiskLabel : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.requestedFinishStrategyLabel ? \"Target: \" + metrics.requestedFinishStrategyLabel + \".\" : null,\n              metrics.finishSplitLabel ? \"Split: \" + metrics.finishSplitLabel + \".\" : null,\n              metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Deep pocket instability\",\n            tone: metrics.chatterRiskClass === \"high\" ? \"watch\" : \"default\",\n            category: \"Stability\",\n            cause: \"Pocket depth, reach and sidewall sensitivity can make a conventional heavy roughing path chatter long before the catalog limits are reached.\",\n            actions: dedupeTextItems([\n              \"Reduce radial engagement before you reduce speed if the route starts to vibrate.\",\n              \"Prefer a lighter, staged pocket route over a naive heavy full-volume pass.\",\n              \"Keep separate corner or wall cleanup visible if the final geometry matters.\",\n            ]),\n          },\n          {\n            title: \"Opening strategy drift\",\n            tone: metrics.openingStrategyScore < 0.7 ? \"watch\" : \"default\",\n            category: \"Entry\",\n            cause: \"From-solid pockets fail early when the real opening route drifts away from the geometry that was assumed during selection.\",\n            actions: dedupeTextItems([\n              \"Review drilling, circular ramping and plunge before defaulting to an aggressive direct route.\",\n              \"Do not treat a closed or angle-heavy pocket like a fully open roughing case.\",\n              \"If the start condition changes, re-check the recommendation rather than forcing the old entry logic.\",\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var riskItems;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"pocket_milling\",\n          outcome: \"no_match\",\n          summary: \"No credible pocket-milling result was found for the current geometry and strategy inputs.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current pocket-milling combination is not credible yet.\"),\n            noMatchGuidance({\n              message: \"Review the minimum opening, pocket depth, start condition, corner-radius limit and whether the pocket should really be roughing-only or an explicit rough-plus-finish route.\",\n              paragraphs: [\n                \"Closed or angle-heavy pockets should not be treated like open rough pockets.\",\n                \"From-solid pockets need a credible opening strategy before the roughing route makes sense.\",\n                \"Finish-critical pockets usually need a visible wall, floor or radius finish split.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust pocket-milling inputs\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      riskItems = buildRiskItems(top);\n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best pocket-milling fit for \" + (metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm depth\" : \"the stated depth\") + \" and \" + (metrics.requestedMinOpeningMm != null ? formatDisplayNumber(metrics.requestedMinOpeningMm, 2) + \" mm opening\" : \"the stated opening\") + \".\",\n        headerPills: [\n          { tone: metrics.pocketSuitabilityClass === \"strong_case\" ? \"good\" : metrics.pocketSuitabilityClass === \"valid_case\" ? \"default\" : \"watch\", text: \"Case: \" + (metrics.pocketSuitabilityLabel || \"Review\") },\n          { tone: metrics.toolConceptFitClass === \"strong\" ? \"good\" : metrics.toolConceptFitClass === \"usable\" ? \"default\" : \"watch\", text: \"Concept: \" + (metrics.toolConceptDesiredLabel || \"Review\") },\n          { tone: metrics.chatterRiskClass === \"low\" ? \"good\" : metrics.chatterRiskClass === \"medium\" ? \"default\" : \"watch\", text: \"Chatter: \" + (metrics.chatterRiskLabel || \"Review\") },\n          { tone: metrics.finishSplitClass === \"no\" ? \"good\" : metrics.finishSplitClass === \"recommended\" ? \"default\" : \"watch\", text: \"Split: \" + (metrics.finishSplitLabel || \"Review\") },\n        ],\n      };\n    \n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine and route fit\",\n          tone: metrics.chatterRiskClass === \"low\" ? \"good\" : \"default\",\n          badge: metrics.openingStrategyLabel || \"Review\",\n          value: \"Depth reserve: \" + (metrics.reachMarginMm != null ? formatDisplayNumber(metrics.reachMarginMm, 2) + \" mm\" : \"Review\"),\n          note: \"Pocket milling should be read as a route definition: opening, roughing and any separate finish work all have to stay believable together.\",\n          items: dedupeTextItems([\n            metrics.chipEvacuationLabel ? \"Chip evacuation: \" + metrics.chipEvacuationLabel + \".\" : null,\n            metrics.chatterRiskLabel ? \"Chatter risk: \" + metrics.chatterRiskLabel + \".\" : null,\n            metrics.closedAngleCapabilityClass !== \"normal\" && metrics.closedAngleCapabilityLabel ? \"Closed angles: \" + metrics.closedAngleCapabilityLabel + \".\" : null,\n          ]),\n        },\n      };\n    \n      return createResultViewModel({\n        processId: \"pocket_milling\",\n        outcome: top.score.total >= 8 ? \"match\" : \"limited_match\",\n        summary: \"Best pocket-milling result based on topology, opening access, depth reserve, corner-radius fit and the credibility of the roughing-versus-finish route.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          buildMillingBundleRecommendation(candidate),\n          featureSummary(buildFeatureItems(top)),\n          geometryFit(buildGeometryItems(top)),\n          fitKpis(buildFitItems(top)),\n          recipeBlock,\n          machineBlock,\n          buildSetupBlock(top, riskItems),\n          riskNotes(riskItems),\n          alternatives(buildAlternativeItems(scored)),\n          commerceCta(Object.assign({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }, buildMillingCompositeCommerceData(candidate) || {})),\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust pocket-milling inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/pocket-milling/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"pocket_milling\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/pocket-milling/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) { return Math.max(min, Math.min(max, value)); }\n    function avg(values) {\n      var filtered = (values || []).filter(function keep(value) { return value != null && Number.isFinite(value); });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) { return total + value; }, 0) / filtered.length;\n    }\n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) { return total + (Number(parts[key]) || 0); }, 0);\n    }\n    function scoreToken(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    function label(value, map, fallback) { return map[value] || fallback || \"Review\"; }\n    \n    var TOPOLOGY_LABELS = { open_pocket: \"Open pocket\", semi_closed_pocket: \"Semi-closed pocket\", closed_pocket: \"Closed pocket\", closed_angles: \"Closed angles / tight corners\" };\n    var START_LABELS = { from_solid: \"From solid\", existing_opening: \"Existing opening\", pre_machined: \"Pre-machined area\" };\n    var FINISH_LABELS = { roughing_only: \"Roughing only\", rough_plus_finish: \"Rough + finish\", final_geometry_critical: \"Final wall / floor critical\" };\n    var STABILITY_LABELS = { stable: \"Stable\", normal: \"Normal\", deep_cavity: \"Deep cavity\", thin_wall: \"Thin wall\", chatter_sensitive: \"Chatter-sensitive\" };\n    var OPENING_METHOD_LABELS = { any: \"Any\", drilling: \"Drilling\", linear_ramping: \"Linear ramping\", circular_ramping: \"Circular ramping\", plunge: \"Plunge\" };\n    var OPENING_STRATEGY_LABELS = { existing_opening: \"Existing opening\", drill_then_mill: \"Drill then mill\", linear_ramp: \"Linear ramp\", circular_ramp: \"Circular ramp\", plunge: \"Plunge\", unclear: \"Review\" };\n    var CONCEPT_LABELS = { solid_carbide: \"Solid carbide\", exchangeable_head: \"Exchangeable head\", solid_or_exchangeable: \"Solid / exchangeable\", indexable: \"Indexable\", either: \"Either\", uncertain: \"Review\" };\n    var FIT_LABELS = { strong: \"Strong\", good: \"Good\", usable: \"Usable\", conditional: \"Conditional\", tight: \"Tight\", poor: \"Poor\", unknown: \"Unknown\", open: \"Open\" };\n    var CHIP_LABELS = { low: \"Low\", medium: \"Medium\", high: \"High\", critical: \"Critical\" };\n    var SPLIT_LABELS = { no: \"No split required\", recommended: \"Rough + finish recommended\", mandatory: \"Rough + finish required\" };\n    var CLOSED_ANGLE_LABELS = { normal: \"Normal\", \"4axis_needed\": \"4-axis likely\", \"5axis_needed\": \"5-axis likely\", uncertain: \"Multi-axis review\" };\n    var SUITABILITY_LABELS = { strong_case: \"Strong case\", valid_case: \"Valid case\", weak_case: \"Weak case\", not_credible: \"Not credible\" };\n    \n    function normalizeConceptPreference(value) {\n      if (value === \"solid_carbide_only\") return \"solid_carbide\";\n      if (value === \"exchangeable_head_only\") return \"exchangeable_head\";\n      if (value === \"solid_or_exchangeable\") return \"solid_or_exchangeable\";\n      if (value === \"indexable_only\") return \"indexable\";\n      return \"either\";\n    }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var helix = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neck = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var text = [candidate.catalog && candidate.catalog.productTitle, candidate.catalog && candidate.catalog.variantTitle, candidate.ids && candidate.ids.sku].join(\" \").toLowerCase();\n      if (text.indexOf(\"head\") >= 0 || text.indexOf(\"multi-master\") >= 0 || text.indexOf(\"multimaster\") >= 0) return \"exchangeable_head\";\n      if (text.indexOf(\"solid\") >= 0 || text.indexOf(\"end mill\") >= 0 || text.indexOf(\"plura\") >= 0 || text.indexOf(\"chatterfree\") >= 0) return \"solid_carbide\";\n      if (text.indexOf(\"indexable\") >= 0 || text.indexOf(\"cutter\") >= 0 || text.indexOf(\"helido\") >= 0 || text.indexOf(\"coromill\") >= 0 || text.indexOf(\"body\") >= 0) return \"indexable\";\n      if (diameter != null && diameter >= 22 && (!neck || neck >= diameter * 0.85)) return \"indexable\";\n      if (diameter != null && diameter <= 16 && helix != null && helix >= 30) return \"solid_carbide\";\n      if (diameter != null && diameter <= 20) return \"solid_or_exchangeable\";\n      return \"uncertain\";\n    }\n    \n    function deriveDesiredConcept(inputs) {\n      if (inputs.explicitConcept !== \"either\") return inputs.explicitConcept;\n      if (inputs.finishStrategy === \"final_geometry_critical\") {\n        if ((inputs.minOpening != null && inputs.minOpening <= 12) || (inputs.allowedCornerRadius != null && inputs.allowedCornerRadius <= 0.6)) return \"solid_carbide\";\n        if (inputs.depth != null && inputs.depth >= 30) return \"exchangeable_head\";\n        return \"solid_or_exchangeable\";\n      }\n      if (inputs.topology === \"closed_angles\") return inputs.depth != null && inputs.depth >= 28 ? \"exchangeable_head\" : \"solid_carbide\";\n      if (inputs.topology === \"closed_pocket\" || inputs.topology === \"semi_closed_pocket\") {\n        if (inputs.depthRatio != null && inputs.depthRatio >= 1.7) return \"exchangeable_head\";\n        return inputs.minOpening != null && inputs.minOpening <= 14 ? \"solid_carbide\" : \"solid_or_exchangeable\";\n      }\n      if (inputs.stabilityClass === \"thin_wall\" || inputs.stabilityClass === \"chatter_sensitive\" || inputs.stabilityClass === \"deep_cavity\") {\n        return inputs.depth != null && inputs.depth >= 28 ? \"exchangeable_head\" : \"solid_or_exchangeable\";\n      }\n      if (inputs.topology === \"open_pocket\" && inputs.finishStrategy === \"roughing_only\" && inputs.priority === \"productivity\" && inputs.minOpening != null && inputs.minOpening >= 22) return \"indexable\";\n      if (inputs.topology === \"open_pocket\" && inputs.minOpening != null && inputs.minOpening >= 18) return \"indexable\";\n      return \"solid_or_exchangeable\";\n    }\n    \n    function conceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var target = explicitConcept !== \"either\" ? explicitConcept : desiredConcept;\n      var score = 0.3;\n      if (target === \"either\" || candidateConcept === \"uncertain\") score = 0.72;\n      else if (candidateConcept === target) score = 1;\n      else if (target === \"solid_or_exchangeable\" && (candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\")) score = 0.95;\n      else if ((target === \"solid_carbide\" && candidateConcept === \"exchangeable_head\") || (target === \"exchangeable_head\" && candidateConcept === \"solid_carbide\")) score = 0.82;\n      else if (target === \"indexable\" && candidateConcept === \"solid_or_exchangeable\") score = 0.56;\n      else if ((target === \"solid_carbide\" || target === \"exchangeable_head\" || target === \"solid_or_exchangeable\") && candidateConcept === \"indexable\") score = 0.34;\n      return { score: score, className: score >= 0.92 ? \"strong\" : score >= 0.72 ? \"usable\" : score >= 0.48 ? \"conditional\" : \"poor\" };\n    }\n    \n    function toolWidthFit(diameter, minOpening) {\n      var ratio;\n      var score;\n      var className;\n      if (diameter == null || minOpening == null || minOpening <= 0) return { ratio: null, score: 0.5, className: \"unknown\", hardFail: false };\n      ratio = diameter / minOpening;\n      if (ratio >= 1) return { ratio: ratio, score: 0, className: \"poor\", hardFail: true };\n      if (ratio >= 0.92) { score = 0.5; className = \"tight\"; }\n      else if (ratio >= 0.7) { score = 1; className = \"strong\"; }\n      else if (ratio >= 0.52) { score = 0.86; className = \"usable\"; }\n      else if (ratio >= 0.32) { score = 0.62; className = \"conditional\"; }\n      else { score = 0.28; className = \"poor\"; }\n      return { ratio: ratio, score: score, className: className, hardFail: false };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 8) return 1;\n      if (margin >= 4) return 0.88;\n      if (margin >= 1.5) return 0.74;\n      if (margin >= 0) return 0.58;\n      if (margin >= -1) return 0.18;\n      return 0;\n    }\n    \n    function maxDiameterFit(candidateDiameter, maxToolDiameter) {\n      var margin;\n      if (maxToolDiameter == null) return { score: 0.76, className: \"open\", hardFail: false, margin: null };\n      if (candidateDiameter == null) return { score: 0.52, className: \"unknown\", hardFail: false, margin: null };\n      margin = maxToolDiameter - candidateDiameter;\n      if (margin < 0) return { score: 0, className: \"poor\", hardFail: true, margin: margin };\n      return { score: marginScore(margin), className: margin >= 1 ? \"good\" : \"tight\", hardFail: false, margin: margin };\n    }\n    \n    function cornerRadiusFit(candidateCornerRadius, allowedCornerRadius) {\n      if (allowedCornerRadius == null) return { score: 0.78, className: \"open\", hardFail: false };\n      if (candidateCornerRadius == null) return { score: 0.48, className: \"unknown\", hardFail: false };\n      if (candidateCornerRadius <= allowedCornerRadius) return { score: 1, className: \"good\", hardFail: false };\n      return { score: 0, className: \"poor\", hardFail: true };\n    }\n    \n    function materialSeverity(ctx, materialCondition) {\n      var materialCode = String(ctx && ctx.materialCode || \"\").toUpperCase();\n      var base = scoreToken(materialCode.charAt(0), { P: 0.22, M: 0.54, K: 0.18, N: 0.22, S: 0.76, H: 0.62 }, 0.3);\n      var score = clamp(base + scoreToken(materialCondition, { standard: 0, tough_long_chipping: 0.1, sticky_bue: 0.08, work_hardening: 0.18, hard_abrasive: 0.16, unknown: 0.06 }, 0.06), 0, 1);\n      return { score: score, className: score >= 0.74 ? \"severe\" : score >= 0.52 ? \"difficult\" : score >= 0.3 ? \"normal\" : \"easy\" };\n    }\n    \n    function estimateAePct(recipe, desiredConcept, topology, stabilityClass) {\n      var aePct = toNullableNumber(recipe && recipe.aePct && recipe.aePct.typ);\n      if (aePct == null) return null;\n      if (desiredConcept === \"indexable\" && topology === \"open_pocket\") aePct *= 1.06;\n      if (desiredConcept === \"solid_carbide\" || desiredConcept === \"exchangeable_head\" || desiredConcept === \"solid_or_exchangeable\") aePct *= 0.88;\n      if (topology === \"closed_pocket\") aePct *= 0.84;\n      if (topology === \"closed_angles\") aePct *= 0.72;\n      if (stabilityClass === \"deep_cavity\" || stabilityClass === \"thin_wall\" || stabilityClass === \"chatter_sensitive\") aePct *= 0.78;\n      return clamp(aePct, 4, 85);\n    }\n    \n    function bandFit(requested, band, tolerance) {\n      var min = toNullableNumber(band && band.min);\n      var typ = toNullableNumber(band && band.typ);\n      var max = toNullableNumber(band && band.max);\n      var upper = max != null ? max : (typ != null ? typ : min);\n      var overflow;\n      var score;\n      if (requested == null) return { score: 0.5, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (upper == null) return { score: 0.58, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (requested > upper) {\n        overflow = upper > 0 ? (requested - upper) / upper : 1;\n        score = clamp(0.62 - overflow * 0.84, 0.12, 0.62);\n        return { score: score, className: overflow <= (tolerance == null ? 0.45 : tolerance) ? \"conditional\" : \"poor\", hardFail: overflow > (tolerance == null ? 0.45 : tolerance), min: min, typ: typ, max: max, upper: upper };\n      }\n      if (typ != null && requested > typ) {\n        score = clamp(1 - ((requested - typ) / Math.max((upper - typ) || typ || 1, 1)) * 0.28, 0.78, 1);\n        return { score: score, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      }\n      if (min != null && requested < min) return { score: 0.86, className: \"usable\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      return { score: 0.96, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n    }\n    \n    function stageFit(requestedStage, row) {\n      var rowStage = row && row.constraints ? row.constraints.conditionStage : null;\n      if (!requestedStage || !rowStage) return 0.76;\n      if (requestedStage === rowStage) return 1;\n      if ((requestedStage === \"roughing\" && rowStage === \"semi-finishing\") || (requestedStage === \"semi-finishing\" && rowStage === \"roughing\")) return 0.82;\n      if ((requestedStage === \"semi-finishing\" && rowStage === \"finishing\") || (requestedStage === \"finishing\" && rowStage === \"semi-finishing\")) return 0.78;\n      return 0.58;\n    }\n    \n    function deriveRequestedStage(finishStrategy) {\n      if (finishStrategy === \"roughing_only\") return \"roughing\";\n      if (finishStrategy === \"rough_plus_finish\") return \"semi-finishing\";\n      return \"finishing\";\n    }\n    \n    function deriveOpeningStrategy(startCondition, openingMethod, topology, stabilityClass) {\n      var strategy;\n      var score;\n      if (startCondition === \"existing_opening\" || startCondition === \"pre_machined\") return { className: \"existing_opening\", score: 1, label: label(\"existing_opening\", OPENING_STRATEGY_LABELS) };\n      if (openingMethod === \"drilling\") strategy = \"drill_then_mill\";\n      else if (openingMethod === \"linear_ramping\") strategy = \"linear_ramp\";\n      else if (openingMethod === \"circular_ramping\") strategy = \"circular_ramp\";\n      else if (openingMethod === \"plunge\") strategy = \"plunge\";\n      else if (topology === \"closed_angles\") strategy = \"drill_then_mill\";\n      else if (stabilityClass === \"deep_cavity\" || stabilityClass === \"chatter_sensitive\") strategy = \"plunge\";\n      else if (topology === \"open_pocket\") strategy = \"linear_ramp\";\n      else strategy = \"circular_ramp\";\n      score = scoreToken(strategy, { existing_opening: 1, drill_then_mill: topology === \"open_pocket\" ? 0.9 : 0.96, linear_ramp: topology === \"open_pocket\" ? 0.82 : 0.54, circular_ramp: topology === \"closed_angles\" ? 0.78 : 0.9, plunge: stabilityClass === \"deep_cavity\" || stabilityClass === \"chatter_sensitive\" ? 0.9 : 0.72, unclear: 0.42 }, 0.58);\n      return { className: strategy, score: score, label: label(strategy, OPENING_STRATEGY_LABELS) };\n    }\n    \n    function chipEvacuationSeverity(topology, depthRatio, materialSeverityClass) {\n      var score = scoreToken(topology, { open_pocket: 0.08, semi_closed_pocket: 0.16, closed_pocket: 0.26, closed_angles: 0.34 }, 0.18);\n      score += depthRatio == null ? 0.08 : depthRatio >= 2 ? 0.3 : depthRatio >= 1.4 ? 0.2 : depthRatio >= 0.8 ? 0.1 : 0.04;\n      score += scoreToken(materialSeverityClass, { easy: 0.04, normal: 0.1, difficult: 0.18, severe: 0.26 }, 0.1);\n      score = clamp(score, 0, 1);\n      return { score: score, className: score >= 0.74 ? \"critical\" : score >= 0.52 ? \"high\" : score >= 0.28 ? \"medium\" : \"low\" };\n    }\n    \n    function chatterRisk(stabilityClass, depthRatio, toolWidthRatio, materialSeverityClass) {\n      var score = scoreToken(stabilityClass, { stable: 0.08, normal: 0.22, deep_cavity: 0.42, thin_wall: 0.56, chatter_sensitive: 0.64 }, 0.24);\n      score += depthRatio == null ? 0.08 : depthRatio >= 2 ? 0.22 : depthRatio >= 1.4 ? 0.14 : depthRatio >= 1 ? 0.08 : 0.04;\n      score += toolWidthRatio != null && toolWidthRatio >= 0.9 ? 0.08 : toolWidthRatio != null && toolWidthRatio <= 0.38 ? 0.06 : 0;\n      score += scoreToken(materialSeverityClass, { easy: 0.02, normal: 0.06, difficult: 0.1, severe: 0.14 }, 0.06);\n      score = clamp(score, 0, 1);\n      return { score: score, className: score >= 0.68 ? \"high\" : score >= 0.36 ? \"medium\" : \"low\" };\n    }\n    \n    function finishSplit(finishStrategy, topology, allowedCornerRadius) {\n      if (finishStrategy === \"final_geometry_critical\") return { className: \"mandatory\", score: 0.34 };\n      if (finishStrategy === \"rough_plus_finish\") {\n        if (topology === \"closed_angles\" || (allowedCornerRadius != null && allowedCornerRadius <= 0.6)) return { className: \"mandatory\", score: 0.56 };\n        return { className: \"recommended\", score: 0.82 };\n      }\n      if (topology === \"closed_angles\") return { className: \"recommended\", score: 0.68 };\n      return { className: \"no\", score: 1 };\n    }\n    \n    function closedAngleCapability(topology, finishStrategy, depthRatio) {\n      if (topology !== \"closed_angles\") return { className: \"normal\", score: 1 };\n      if (finishStrategy === \"final_geometry_critical\" && depthRatio != null && depthRatio >= 1.2) return { className: \"5axis_needed\", score: 0.38 };\n      if (depthRatio != null && depthRatio >= 1.2) return { className: \"4axis_needed\", score: 0.52 };\n      return { className: \"uncertain\", score: 0.62 };\n    }\n    \n    function topologyFit(topology, candidateConcept, finishStrategy) {\n      var score = 0.72;\n      if (topology === \"open_pocket\") score = candidateConcept === \"indexable\" ? 1 : candidateConcept === \"solid_or_exchangeable\" ? 0.82 : 0.72;\n      else if (topology === \"semi_closed_pocket\") score = candidateConcept === \"indexable\" ? 0.58 : candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\" ? 0.92 : 0.62;\n      else if (topology === \"closed_pocket\") score = candidateConcept === \"indexable\" ? 0.38 : candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\" ? 0.96 : 0.6;\n      else if (topology === \"closed_angles\") score = candidateConcept === \"solid_carbide\" ? 1 : candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\" ? 0.88 : 0.26;\n      if (finishStrategy === \"final_geometry_critical\" && candidateConcept === \"indexable\") score = clamp(score - 0.18, 0, 1);\n      return { score: score, className: score >= 0.9 ? \"strong\" : score >= 0.72 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\" };\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"pocket_milling\", ctx, toolkits));\n      var minOpening = toNullableNumber(getAnswer(ctx, \"pocket_min_opening_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"pocket_d_mm\"));\n      var finishStrategy = getAnswer(ctx, \"pocket_finish_strategy\");\n      derived.condition_stage = deriveRequestedStage(finishStrategy);\n      derived.pocket_depth_ratio = depth != null && minOpening != null && minOpening > 0 ? depth / minOpening : null;\n      derived.finish_split_required = finishStrategy === \"rough_plus_finish\" || finishStrategy === \"final_geometry_critical\";\n      derived.pocket_topology_label = label(getAnswer(ctx, \"pocket_topology_class\"), TOPOLOGY_LABELS, \"Pocket\");\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"pocket_milling\", ctx);\n      var topology = getAnswer(ctx, \"pocket_topology_class\");\n      var startCondition = getAnswer(ctx, \"pocket_start_condition\");\n      var finishStrategy = getAnswer(ctx, \"pocket_finish_strategy\");\n      var openingMethod = getAnswer(ctx, \"pocket_opening_method\");\n      var stabilityClass = getAnswer(ctx, \"pocket_stability_class\");\n      if (topology === \"closed_angles\") issues.push({ field: \"pocket_topology_class\", message: \"Closed pocket angles can require 4-axis or 5-axis access, so keep the route reviewable.\", severity: \"warning\", code: \"pocket_closed_angles_review\" });\n      if (startCondition === \"from_solid\" && (!openingMethod || openingMethod === \"any\")) issues.push({ field: \"pocket_opening_method\", message: \"Opening from solid should still be reviewed explicitly between drilling, ramping or plunge-style entry.\", severity: \"warning\", code: \"pocket_opening_review\" });\n      if (finishStrategy === \"final_geometry_critical\") issues.push({ field: \"pocket_finish_strategy\", message: \"Finish-critical pockets should not be sold as a one-step roughing answer without a visible finish split.\", severity: \"warning\", code: \"pocket_finish_split\" });\n      if (stabilityClass === \"deep_cavity\" || stabilityClass === \"thin_wall\" || stabilityClass === \"chatter_sensitive\") issues.push({ field: \"pocket_stability_class\", message: \"Deep or vibration-sensitive pockets often need a lighter roughing route than a naive heavy pocketing pass.\", severity: \"warning\", code: \"pocket_stability_warning\" });\n      return issues;\n    }\n    \n    function prefilter(pool) { return prefilterByProcessSpec(\"pocket_milling\", pool); }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var topology = getAnswer(ctx, \"pocket_topology_class\");\n      var minOpening = toNullableNumber(getAnswer(ctx, \"pocket_min_opening_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"pocket_d_mm\"));\n      var startCondition = getAnswer(ctx, \"pocket_start_condition\");\n      var allowedCornerRadius = toNullableNumber(getAnswer(ctx, \"max_corner_radius_mm\"));\n      var finishStrategy = getAnswer(ctx, \"pocket_finish_strategy\");\n      var materialCondition = getAnswer(ctx, \"material_condition_class\");\n      var stabilityClass = getAnswer(ctx, \"pocket_stability_class\");\n      var priority = getAnswer(ctx, \"priority\") || \"balanced\";\n      var maxToolDiameter = toNullableNumber(getAnswer(ctx, \"max_tool_diameter_mm\"));\n      var explicitConcept = normalizeConceptPreference(getAnswer(ctx, \"pocket_tool_concept_preference\"));\n      var openingMethod = getAnswer(ctx, \"pocket_opening_method\") || \"any\";\n      var depthRatio = depth != null && minOpening != null && minOpening > 0 ? depth / minOpening : null;\n      var requestedStage = deriveRequestedStage(finishStrategy);\n      var materialSeverityValue = materialSeverity(ctx, materialCondition);\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var recipe = recipeResult.recipe || {};\n        var row = recipeResult.row || rows[0] || null;\n        var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var usableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var apmx = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var flutes = getCandidateFluteCount(candidate);\n        var helixAngle = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n        var neckDiameter = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n        var cornerRadius = toNullableNumber(candidate.milling && candidate.milling.cornerRadiusMm);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var widthFit = toolWidthFit(diameter, minOpening);\n        var reachMargin = usableLength != null && depth != null ? usableLength - depth : null;\n        var apmxMargin = apmx != null && depth != null ? apmx - depth : null;\n        var maxFit = maxDiameterFit(diameter, maxToolDiameter);\n        var cornerFit = cornerRadiusFit(cornerRadius, allowedCornerRadius);\n        var desiredConcept = deriveDesiredConcept({\n          explicitConcept: explicitConcept,\n          topology: topology,\n          minOpening: minOpening,\n          depth: depth,\n          depthRatio: depthRatio,\n          finishStrategy: finishStrategy,\n          stabilityClass: stabilityClass,\n          priority: priority,\n          allowedCornerRadius: allowedCornerRadius,\n        });\n        var concept = conceptFit(candidateConcept, desiredConcept, explicitConcept);\n        var topologySuitability = topologyFit(topology, candidateConcept, finishStrategy);\n        var opening = deriveOpeningStrategy(startCondition, openingMethod, topology, stabilityClass);\n        var estimatedAePctReq = estimateAePct(recipe, desiredConcept, topology, stabilityClass);\n        var estimatedAeMm = diameter != null && estimatedAePctReq != null ? (diameter * estimatedAePctReq) / 100 : null;\n        var recipeAeFit = bandFit(estimatedAePctReq, recipe.aePct, 0.55);\n        var recipeApTyp = toNullableNumber(recipe.ap && recipe.ap.typ);\n        var sliceCountEstimate = depth != null && recipeApTyp != null && recipeApTyp > 0 ? depth / recipeApTyp : null;\n        var recipeApFitClass = sliceCountEstimate == null ? \"unknown\" : sliceCountEstimate <= 6 ? \"good\" : sliceCountEstimate <= 12 ? \"usable\" : sliceCountEstimate <= 20 ? \"conditional\" : \"poor\";\n        var recipeApFitScore = sliceCountEstimate == null ? 0.5 : sliceCountEstimate <= 6 ? 1 : sliceCountEstimate <= 12 ? 0.82 : sliceCountEstimate <= 20 ? 0.58 : 0.28;\n        var chatter = chatterRisk(stabilityClass, depthRatio, widthFit.ratio, materialSeverityValue.className);\n        var chipSeverity = chipEvacuationSeverity(topology, depthRatio, materialSeverityValue.className);\n        var split = finishSplit(finishStrategy, topology, allowedCornerRadius);\n        var closedAngle = closedAngleCapability(topology, finishStrategy, depthRatio);\n        var stage = stageFit(requestedStage, row);\n        var suitabilityScore = clamp(\n          0.08 +\n          topologySuitability.score * 0.14 +\n          widthFit.score * 0.16 +\n          avg([marginScore(reachMargin), marginScore(apmxMargin)]) * 0.12 +\n          concept.score * 0.14 +\n          cornerFit.score * 0.1 +\n          opening.score * 0.1 +\n          recipeApFitScore * 0.05 +\n          recipeAeFit.score * 0.06 +\n          stage * 0.05 +\n          clamp(1 - chipSeverity.score, 0, 1) * 0.08 +\n          clamp(1 - chatter.score, 0, 1) * 0.1,\n          0,\n          1\n        );\n        var suitabilityClass;\n        var vcTyp = toNullableNumber(recipe.vc && recipe.vc.typ);\n        var fzTyp = toNullableNumber(recipe.fz && recipe.fz.typ);\n        var rpmTyp = diameter != null && diameter > 0 && vcTyp != null ? (1000 * vcTyp) / (Math.PI * diameter) : null;\n        var feedTyp = rpmTyp != null && fzTyp != null && flutes != null ? rpmTyp * fzTyp * flutes : null;\n        var mrrTyp = recipeApTyp != null && estimatedAeMm != null && feedTyp != null ? (recipeApTyp * estimatedAeMm * feedTyp) / 1000 : null;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (split.className === \"mandatory\" && finishStrategy === \"roughing_only\") suitabilityScore = clamp(suitabilityScore - 0.12, 0, 1);\n        if (closedAngle.className === \"5axis_needed\") suitabilityScore = clamp(suitabilityScore - 0.08, 0, 1);\n        suitabilityClass = suitabilityScore >= 0.82 ? \"strong_case\" : suitabilityScore >= 0.62 ? \"valid_case\" : suitabilityScore >= 0.42 ? \"weak_case\" : \"not_credible\";\n    \n        if (!rows.length) hardRejectReason = \"No valid pocket-milling row is available for this material and process context.\";\n        if (!hardRejectReason && widthFit.hardFail) hardRejectReason = \"Tool diameter is larger than the minimum free pocket opening.\";\n        if (!hardRejectReason && maxFit.hardFail) hardRejectReason = \"Tool diameter exceeds the stated maximum tool diameter.\";\n        if (!hardRejectReason && reachMargin != null && reachMargin < 0) hardRejectReason = \"Usable length does not cover the requested pocket depth.\";\n        if (!hardRejectReason && apmxMargin != null && apmxMargin < 0) hardRejectReason = \"APMX does not cover the requested pocket depth.\";\n        if (!hardRejectReason && cornerFit.hardFail) hardRejectReason = \"The candidate corner radius exceeds the allowed maximum pocket corner radius.\";\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.08,\n          process: kernel.processFit(candidate, ctx) * 1.1,\n          pocketSuitability: suitabilityScore * 1.4,\n          geometryAccess: widthFit.score * 1.2,\n          reach: avg([marginScore(reachMargin), marginScore(apmxMargin)]) * 1.2,\n          cornerRadius: cornerFit.score * 0.9,\n          toolConcept: concept.score * 1.08,\n          opening: opening.score * 0.88,\n          topology: topologySuitability.score * 0.86,\n          recipeAp: recipeApFitScore * 0.44,\n          recipeAe: recipeAeFit.score * 0.54,\n          machine: kernel.machineWindow(candidate, ctx) * 0.34,\n          riskPenalty: -(chipSeverity.score * 0.26 + chatter.score * 0.32 + (split.className === \"mandatory\" && finishStrategy === \"roughing_only\" ? 0.12 : 0) + (closedAngle.className === \"5axis_needed\" ? 0.12 : closedAngle.className === \"4axis_needed\" ? 0.08 : 0)),\n        };\n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.8 : recipeResult.source === \"estimated\" ? 0.66 : 0.48;\n        confidence -= chatter.className === \"high\" ? 0.08 : chatter.className === \"medium\" ? 0.03 : 0;\n        confidence -= chipSeverity.className === \"critical\" ? 0.08 : chipSeverity.className === \"high\" ? 0.03 : 0;\n        confidence -= split.className === \"mandatory\" && finishStrategy === \"roughing_only\" ? 0.1 : 0;\n        confidence = clamp(confidence, 0, 0.96);\n        if (hardRejectReason) confidence = 0;\n    \n        metrics = Object.assign({}, millingTools.getSharedMetrics(candidate, ctx), {\n          requestedTopology: topology,\n          requestedTopologyLabel: label(topology, TOPOLOGY_LABELS, \"Pocket\"),\n          requestedMinOpeningMm: minOpening,\n          requestedDepthMm: depth,\n          requestedStartCondition: startCondition,\n          requestedStartConditionLabel: label(startCondition, START_LABELS, \"Review\"),\n          requestedFinishStrategy: finishStrategy,\n          requestedFinishStrategyLabel: label(finishStrategy, FINISH_LABELS, \"Review\"),\n          requestedStabilityClass: stabilityClass,\n          requestedStabilityLabel: label(stabilityClass, STABILITY_LABELS, \"Review\"),\n          requestedAllowedCornerRadiusMm: allowedCornerRadius,\n          requestedOpeningMethod: openingMethod,\n          requestedOpeningMethodLabel: label(openingMethod, OPENING_METHOD_LABELS, \"Review\"),\n          requestedPriority: priority,\n          candidateConcept: candidateConcept,\n          candidateConceptLabel: label(candidateConcept, CONCEPT_LABELS, \"Review\"),\n          candidateDiameterMm: diameter,\n          candidateUsableLengthMm: usableLength,\n          candidateApmxMm: apmx,\n          candidateCornerRadiusMm: cornerRadius,\n          candidateFluteCount: flutes,\n          candidateHelixAngleDeg: helixAngle,\n          candidateNeckDiameterMm: neckDiameter,\n          toolWidthRatio: widthFit.ratio,\n          toolWidthFitClass: widthFit.className,\n          toolWidthFitLabel: label(widthFit.className, FIT_LABELS),\n          pocketDepthRatio: depthRatio,\n          reachMarginMm: reachMargin,\n          apmxMarginMm: apmxMargin,\n          maxToolDiameterMm: maxToolDiameter,\n          maxToolDiameterMarginMm: maxFit.margin,\n          cornerRadiusFitClass: cornerFit.className,\n          cornerRadiusFitLabel: label(cornerFit.className, FIT_LABELS),\n          openingStrategyClass: opening.className,\n          openingStrategyLabel: opening.label,\n          openingStrategyScore: opening.score,\n          toolConceptDesired: desiredConcept,\n          toolConceptDesiredLabel: label(desiredConcept, CONCEPT_LABELS, \"Review\"),\n          toolConceptFitClass: concept.className,\n          toolConceptFitScore: concept.score,\n          chipEvacuationClass: chipSeverity.className,\n          chipEvacuationLabel: label(chipSeverity.className, CHIP_LABELS),\n          chatterRiskClass: chatter.className,\n          chatterRiskLabel: label(chatter.className, CHIP_LABELS),\n          finishSplitClass: split.className,\n          finishSplitLabel: label(split.className, SPLIT_LABELS),\n          closedAngleCapabilityClass: closedAngle.className,\n          closedAngleCapabilityLabel: label(closedAngle.className, CLOSED_ANGLE_LABELS),\n          pocketSuitabilityClass: suitabilityClass,\n          pocketSuitabilityLabel: label(suitabilityClass, SUITABILITY_LABELS),\n          topologyFitClass: topologySuitability.className,\n          materialSeverityClass: materialSeverityValue.className,\n          recipeVcMin: toNullableNumber(recipe.vc && recipe.vc.min),\n          recipeVcTyp: vcTyp,\n          recipeVcMax: toNullableNumber(recipe.vc && recipe.vc.max),\n          recipeFzMin: toNullableNumber(recipe.fz && recipe.fz.min),\n          recipeFzTyp: fzTyp,\n          recipeFzMax: toNullableNumber(recipe.fz && recipe.fz.max),\n          recipeApMin: toNullableNumber(recipe.ap && recipe.ap.min),\n          recipeApTyp: recipeApTyp,\n          recipeApMax: toNullableNumber(recipe.ap && recipe.ap.max),\n          recipeApFitClass: recipeApFitClass,\n          recipeApFitScore: recipeApFitScore,\n          recipeAePctMin: toNullableNumber(recipe.aePct && recipe.aePct.min),\n          recipeAePctTyp: toNullableNumber(recipe.aePct && recipe.aePct.typ),\n          recipeAePctMax: toNullableNumber(recipe.aePct && recipe.aePct.max),\n          recipeAeFitClass: recipeAeFit.className,\n          recipeAeFitScore: recipeAeFit.score,\n          estimatedAePctReq: estimatedAePctReq,\n          estimatedAeMm: estimatedAeMm,\n          estimatedSliceCount: sliceCountEstimate,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          requestedStage: requestedStage,\n          rpmTyp: rpmTyp,\n          feedTypMmMin: feedTyp,\n          mrrTyp: mrrTyp,\n          selectedRecipeSource: recipeResult.source,\n          selectedRecipeRow: recipeResult.debug && recipeResult.debug.selectedRecipeRow,\n          selectedVcRow: recipeResult.debug && recipeResult.debug.selectedVcRow,\n          selectedFzRow: recipeResult.debug && recipeResult.debug.selectedFzRow,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            topologySuitability.score >= 0.88 ? \"The tool concept matches the pocket topology well.\" : \"The tool concept remains workable for this pocket topology, but it is not the only plausible route.\",\n            widthFit.score >= 0.86 ? \"Diameter still fits the pocket opening with believable corner access.\" : widthFit.className === \"tight\" ? \"Diameter is physically workable, but the pocket opening is getting tight.\" : \"Pocket opening leaves only a conditional geometry window.\",\n            opening.score >= 0.88 ? \"The opening route stays credible for the stated start condition.\" : \"Opening strategy still needs a conservative review before release.\",\n            split.className === \"mandatory\" ? \"This pocket should be treated as roughing plus a separate wall / floor / radius finish route.\" : \"The process can still be released without hiding the roughing-versus-finish split.\",\n            chatter.className === \"low\" ? \"Reach and pocket depth still keep vibration risk manageable.\" : \"Pocket depth and stability are a core watch-out for this recommendation.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) { return right.score.total - left.score.total; });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/profile-turning/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/profile-turning/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/profile-turning/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/profile-turning/presenter.js\");\n    exports.default = createStubProcessModule(\"profile_turning\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/profile-turning/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, recipeStartValues, riskNotes, setupNotes } = __bundle.require(\"core/result-blocks.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.checks)) return data.checks.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        return true;\n      });\n    }\n    \n    function titleCase(value) {\n      return String(value || \"\")\n        .split(/[_\\s-]+/)\n        .filter(Boolean)\n        .map(function mapPart(part) {\n          return part.charAt(0).toUpperCase() + part.slice(1);\n        })\n        .join(\" \");\n    }\n    \n    function formatNumber(value, digits) {\n      return value == null ? \"n/a\" : Number(value).toFixed(digits == null ? 2 : digits);\n    }\n    \n    function formatMm(value, digits) {\n      return value == null ? \"n/a\" : formatNumber(value, digits == null ? 2 : digits) + \" mm\";\n    }\n    \n    function formatUm(value, digits) {\n      return value == null ? \"n/a\" : formatNumber(value, digits == null ? 1 : digits) + \" um\";\n    }\n    \n    function statusFromRisk(riskClass) {\n      return riskClass === \"low\" ? \"good\" : riskClass === \"medium\" ? \"ok\" : \"weak\";\n    }\n    \n    function buildFeatureItems(metrics) {\n      return [\n        { key: \"mode\", label: \"Profile mode\", value: titleCase(metrics.requestedProfileMode) },\n        { key: \"phase\", label: \"Operation phase\", value: titleCase(metrics.requestedOperationPhase) },\n        { key: \"diameter\", label: \"Reference diameter\", value: formatMm(metrics.requestedWorkpieceDiameterMm) },\n        { key: \"ap\", label: \"Depth of cut ap\", value: formatMm(metrics.requestedApMm) },\n        { key: \"min_radius\", label: \"Minimum profile radius\", value: formatMm(metrics.requestedMinProfileRadiusMm) },\n        { key: \"steepness\", label: \"Profile steepness\", value: titleCase(metrics.requestedProfileSteepness) },\n        { key: \"tool_family\", label: \"Tool family\", value: titleCase(metrics.requestedToolFamilyPreference) },\n      ];\n    }\n    \n    function buildGeometryItems(metrics) {\n      var items = [\n        {\n          key: \"shape_need\",\n          label: \"Insert shape / accessibility\",\n          actual: metrics.candidateShapeCode ? String(metrics.candidateShapeCode) : \"n/a\",\n          target: titleCase(metrics.insertShapeNeed),\n          result: metrics.shapeFitScore >= 0.85 ? \"fit\" : metrics.shapeFitScore >= 0.6 ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"nose_radius\",\n          label: \"Nose radius\",\n          actual: formatMm(metrics.noseRadiusMm, 2),\n          target: metrics.requestedMinProfileRadiusMm != null ? \"<= \" + formatMm(metrics.requestedMinProfileRadiusMm, 2) : \"not specified\",\n          result: metrics.profileRadiusFitScore >= 0.85 ? \"fit\" : metrics.profileRadiusFitScore >= 0.6 ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"clearance\",\n          label: \"Free-cut angle risk\",\n          actual: titleCase(metrics.clearanceRiskClass),\n          target: metrics.requestedProfileAngleDeg != null ? \"Profile angle \" + formatNumber(metrics.requestedProfileAngleDeg, 1) + \" deg\" : titleCase(metrics.requestedProfileSteepness),\n          result: metrics.clearanceRiskClass === \"low\" ? \"fit\" : metrics.clearanceRiskClass === \"medium\" ? \"near\" : \"mismatch\",\n        },\n      ];\n    \n      if (metrics.theoreticalRoughnessUm != null || metrics.requestedTargetRoughnessUm != null) {\n        items.push({\n          key: \"roughness\",\n          label: \"Theoretical roughness\",\n          actual: formatUm(metrics.theoreticalRoughnessUm, 1),\n          target: metrics.requestedTargetRoughnessUm != null ? formatUm(metrics.requestedTargetRoughnessUm, 1) : \"not specified\",\n          result: metrics.requestedTargetRoughnessUm == null || metrics.theoreticalRoughnessUm <= metrics.requestedTargetRoughnessUm ? \"fit\" : \"near\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"score\", label: \"Fit score\", value: formatNumber(top.score.total, 2), status: top.score.total >= 6 ? \"good\" : \"ok\" },\n        { key: \"accessibility\", label: \"Accessibility / shape\", value: titleCase(metrics.insertShapeNeed), status: metrics.shapeFitScore >= 0.85 ? \"good\" : metrics.shapeFitScore >= 0.6 ? \"ok\" : \"weak\" },\n        { key: \"rigidity\", label: \"Rigidity risk\", value: titleCase(metrics.rigidityRiskClass), status: statusFromRisk(metrics.rigidityRiskClass) },\n        { key: \"finish\", label: \"Finish feasibility\", value: titleCase(metrics.finishFeasibility), status: metrics.finishFeasibility === \"strong\" ? \"good\" : metrics.finishFeasibility === \"conditional\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatNumber(top.score.confidence, 2), status: top.score.confidence >= 0.78 ? \"good\" : \"ok\" },\n      ];\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n        { key: \"f\", label: \"f\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n        { key: \"ap\", label: \"ap\", min: top.recipe && top.recipe.ap.min, typ: top.recipe && top.recipe.ap.typ, max: top.recipe && top.recipe.ap.max, unit: \"mm\" },\n        { key: \"n\", label: \"n\", min: null, typ: metrics.rpmTyp, max: null, unit: \"rpm\" },\n        { key: \"vf\", label: \"vf\", min: null, typ: metrics.feedSpeedMmMin, max: null, unit: \"mm/min\" },\n        { key: \"Q\", label: \"Q\", min: null, typ: metrics.mrrCm3Min, max: null, unit: \"cm3/min\" },\n        { key: \"Rth\", label: \"Rth\", min: null, typ: metrics.theoreticalRoughnessUm, max: null, unit: \"um\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildMachineChecks(candidate, metrics) {\n      var checks = [];\n    \n      if (metrics.requestedCoolantClass) {\n        checks.push({\n          key: \"coolant\",\n          label: \"Coolant support\",\n          result: metrics.coolingSupportClass === \"strong\" || metrics.coolingSupportClass === \"adequate\"\n            ? \"pass\"\n            : metrics.coolingSupportClass === \"limited\"\n              ? \"limited\"\n              : \"fail\",\n          note: metrics.requestedCoolantClass === \"internal\" || metrics.requestedCoolantClass === \"high_pressure\"\n            ? (candidate.common.coolantTsc ? \"Tool supports through-coolant delivery.\" : \"Machine asks for through coolant but the candidate does not expose it.\")\n            : null,\n        });\n      }\n    \n      if (metrics.requestedProfileMode === \"internal_profile\") {\n        checks.push({\n          key: \"internal_rigidity\",\n          label: \"Internal profiling rigidity\",\n          result: metrics.rigidityRiskClass === \"low\" || metrics.rigidityRiskClass === \"medium\" ? \"pass\" : \"limited\",\n          note: \"Overhang class \" + titleCase(metrics.requestedOverhangClass) + \" drives the current internal-profile deflection risk.\",\n        });\n      }\n    \n      checks.push({\n        key: \"tool_route\",\n        label: \"Tool family route\",\n        result: metrics.specialToolRoute === \"iso_default\" ? \"pass\" : \"limited\",\n        note: \"Current routing tendency: \" + titleCase(metrics.specialToolRoute) + \".\",\n      });\n    \n      return checks;\n    }\n    \n    function buildSetupItems(metrics) {\n      var items = [\n        { area: \"geometry\", message: \"Preferred insert shape need: \" + titleCase(metrics.insertShapeNeed) + \".\" },\n        { area: \"forces\", message: \"Preferred geometry bias: \" + titleCase(metrics.positiveNegativeBias) + \".\" },\n        { area: \"access\", message: \"Free-cut angle risk is \" + titleCase(metrics.clearanceRiskClass) + \" for the requested profile.\" },\n        { area: \"special\", message: \"Tool route: \" + titleCase(metrics.specialToolRoute) + \"; material route: \" + titleCase(metrics.specialMaterialRoute) + \".\" },\n      ];\n    \n      if (metrics.requestedProfileMode === \"internal_profile\") {\n        items.push({ area: \"rigidity\", message: \"Internal profiling is being evaluated with \" + titleCase(metrics.requestedOverhangClass) + \" overhang.\" });\n      }\n      if (metrics.requestedWiperAllowed && metrics.requestedWiperAllowed !== \"unknown\") {\n        items.push({ area: \"surface\", message: \"Wiper suitability: \" + titleCase(metrics.wiperSuitabilityClass) + \".\" });\n      }\n    \n      return items;\n    }\n    \n    function buildRiskItems(metrics) {\n      var items = [];\n    \n      if (metrics.clearanceRiskClass === \"high\" || metrics.clearanceRiskClass === \"critical\") {\n        items.push({\n          severity: metrics.clearanceRiskClass === \"critical\" ? \"critical\" : \"warning\",\n          title: \"Free-cut angle\",\n          message: \"Maintain enough free cutting angle to the workpiece profile; this contour is close to the accessibility limit.\",\n        });\n      }\n      if (metrics.requestedProfileMode === \"internal_profile\" && (metrics.rigidityRiskClass === \"high\" || metrics.rigidityRiskClass === \"critical\")) {\n        items.push({\n          severity: metrics.rigidityRiskClass === \"critical\" ? \"critical\" : \"warning\",\n          title: \"Internal deflection\",\n          message: \"Internal profiling is much more deflection-sensitive than standard external turning in this setup.\",\n        });\n      }\n      if (metrics.finishFeasibility === \"weak\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Finish conflict\",\n          message: \"The requested profile finish needs a smaller feed, a different nose radius, a more accessible insert or a stiffer setup.\",\n        });\n      }\n      if (metrics.requestedWiperAllowed === \"yes\" && (metrics.wiperSuitabilityClass === \"weak\" || metrics.wiperSuitabilityClass === \"avoid\")) {\n        items.push({\n          severity: \"warning\",\n          title: \"Wiper limitation\",\n          message: \"Wiper geometry is not a universal default for tight or steep form-turning contours.\",\n        });\n      }\n      if (metrics.requestedToolFamilyPreference === \"either\" && metrics.specialToolRoute !== \"iso_default\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Special tool route\",\n          message: \"This profile starts to drift toward a copy-turn or groove-turn style solution rather than a plain ISO-holder default.\",\n        });\n      }\n      if (metrics.specialMaterialRoute !== \"carbide_default\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Special material route\",\n          message: \"This material/application window may justify a non-standard cutting-material route.\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildResultView(scored) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var metrics = top.metrics || {};\n    \n      return createResultViewModel({\n        processId: \"profile_turning\",\n        outcome: top.score.total >= 6 ? \"match\" : \"limited_match\",\n        summary: \"Best profile turning result based on contour accessibility, insert-shape fit, rigidity and surface/process balance.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 4),\n          }),\n          featureSummary(buildFeatureItems(metrics)),\n          geometryFit(buildGeometryItems(metrics)),\n          fitKpis(buildFitItems(top)),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: buildRecipeValues(top),\n          }),\n          machineFeasibility(buildMachineChecks(candidate, metrics)),\n          riskNotes(buildRiskItems(metrics)),\n          setupNotes(buildSetupItems(metrics)),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative profile-turning option\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust profile inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/profile-turning/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"profile_turning\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/profile-turning/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function getOperationPhase(ctx) {\n      return toNullableString(getAnswer(ctx, \"operation_phase\") || getAnswer(ctx, \"goal_stage\")) || \"semi-finishing\";\n    }\n    \n    function getProfileMode(ctx) {\n      var direct = toNullableString(getAnswer(ctx, \"profile_mode\"));\n      var legacy = toNullableString(getAnswer(ctx, \"internal_external\"));\n      if (direct) return direct;\n      if (legacy === \"internal\") return \"internal_profile\";\n      if (legacy === \"external\") return \"external_profile\";\n      return \"external_profile\";\n    }\n    \n    function getMaterialRefinement(ctx) {\n      return toNullableString(getAnswer(ctx, \"material_refinement\") || getAnswer(ctx, \"material_condition_class\")) || \"standard\";\n    }\n    \n    function getProfileSteepness(ctx) {\n      return toNullableString(getAnswer(ctx, \"profile_steepness\")) || \"normal\";\n    }\n    \n    function getSlenderOrConfined(ctx) {\n      return toNullableString(getAnswer(ctx, \"slender_or_confined\")) || \"normal\";\n    }\n    \n    function getSurfacePriority(ctx) {\n      return toNullableString(getAnswer(ctx, \"surface_vs_productivity\")) || \"balanced\";\n    }\n    \n    function getCoolantClass(ctx) {\n      return toNullableString(getAnswer(ctx, \"coolant_class\")) || \"unknown\";\n    }\n    \n    function getToolFamilyPreference(ctx) {\n      return toNullableString(getAnswer(ctx, \"tool_family_preference\")) || \"either\";\n    }\n    \n    function getOverhangClass(ctx) {\n      return toNullableString(getAnswer(ctx, \"overhang_class\")) || \"short\";\n    }\n    \n    function getSpecialMaterialPreference(ctx) {\n      return toNullableString(getAnswer(ctx, \"special_material_route\")) || \"auto\";\n    }\n    \n    function getIsoGroup(ctx) {\n      return toNullableString(ctx && ctx.material && ctx.material.isoGroup) || null;\n    }\n    \n    function stageFitScore(requestedStage, row) {\n      var rowStage = row && row.constraints ? toNullableString(row.constraints.conditionStage) : null;\n      if (!rowStage || !requestedStage) return 0.75;\n      if (rowStage === requestedStage) return 1;\n      if ((rowStage === \"roughing\" && requestedStage === \"semi-finishing\") || (rowStage === \"semi-finishing\" && requestedStage === \"roughing\")) {\n        return 0.72;\n      }\n      if ((rowStage === \"finishing\" && requestedStage === \"semi-finishing\") || (rowStage === \"semi-finishing\" && requestedStage === \"finishing\")) {\n        return 0.82;\n      }\n      return 0.38;\n    }\n    \n    function selectBestRow(rows, requestedStage) {\n      var exact = (rows || []).find(function findExact(row) {\n        return row && row.constraints && row.constraints.conditionStage === requestedStage;\n      });\n      return exact || (rows || [])[0] || null;\n    }\n    \n    function getCandidatePolarity(candidate) {\n      var clearanceCode = toNullableString(candidate && candidate.turning && candidate.turning.turnClearanceCode);\n      if (!clearanceCode) return \"unknown\";\n      return clearanceCode.toUpperCase() === \"N\" ? \"negative\" : \"positive\";\n    }\n    \n    function classifyShapeNeed(profileSteepness, profileAngleDeg, profileMode, toolFamilyPreference) {\n      if (toolFamilyPreference === \"copy_turn_system\" || toolFamilyPreference === \"groove_turn_system\") return \"special_profile_tool\";\n      if (profileSteepness === \"undercut\") return \"special_profile_tool\";\n      if (profileAngleDeg != null && profileAngleDeg >= 50) return \"V35_required\";\n      if (profileSteepness === \"steep\") return \"V35_required\";\n      if (profileMode === \"internal_profile\" && profileSteepness === \"normal\") return \"D55_preferred\";\n      if (profileSteepness === \"shallow\") return \"C80_possible\";\n      return \"D55_preferred\";\n    }\n    \n    function shapeNeedScore(shapeCode, insertShapeNeed, profileMode) {\n      var code = String(shapeCode || \"\").toUpperCase();\n      var c80Map = { C: 1, W: 0.94, S: 0.9, T: 0.78, D: 0.7, V: 0.56, R: 0.24 };\n      var d55Map = { D: 1, V: 0.9, T: 0.8, C: 0.68, W: 0.62, S: 0.54, R: 0.2 };\n      var v35Map = { V: 1, D: 0.82, T: 0.68, C: 0.38, W: 0.32, S: 0.3, R: 0.14 };\n      var specialMap = { T: 0.68, D: 0.58, V: 0.55, C: 0.28, W: 0.25, S: 0.22, R: 0.12 };\n      var table = d55Map;\n      var score;\n    \n      if (insertShapeNeed === \"C80_possible\") table = c80Map;\n      if (insertShapeNeed === \"V35_required\") table = v35Map;\n      if (insertShapeNeed === \"special_profile_tool\") table = specialMap;\n    \n      score = Object.prototype.hasOwnProperty.call(table, code) ? table[code] : 0.5;\n      if (profileMode === \"internal_profile\" && (code === \"C\" || code === \"W\" || code === \"S\")) score -= 0.08;\n      return clamp(score, 0, 1);\n    }\n    \n    function profileRadiusFitScore(noseRadiusMm, minProfileRadiusMm) {\n      if (noseRadiusMm == null || minProfileRadiusMm == null || minProfileRadiusMm <= 0) return 0.55;\n      if (noseRadiusMm > minProfileRadiusMm) return 0;\n      if (noseRadiusMm >= minProfileRadiusMm * 0.7) return 1;\n      return clamp(0.68 + (noseRadiusMm / minProfileRadiusMm) * 0.32, 0.68, 0.98);\n    }\n    \n    function classifyClearanceRisk(profileSteepness, profileAngleDeg, profileMode, shapeCode) {\n      var code = String(shapeCode || \"\").toUpperCase();\n      var risk = 0;\n    \n      risk += { shallow: 0, normal: 0.45, steep: 1.15, undercut: 2.1 }[profileSteepness] || 0.6;\n      if (profileMode === \"internal_profile\") risk += 0.8;\n      if (profileAngleDeg != null) {\n        if (profileAngleDeg >= 70) risk += 1.2;\n        else if (profileAngleDeg >= 50) risk += 0.7;\n        else if (profileAngleDeg >= 35) risk += 0.3;\n      }\n    \n      if (code === \"V\") risk -= 1.1;\n      else if (code === \"D\") risk -= 0.8;\n      else if (code === \"T\") risk -= 0.55;\n      else if (code === \"C\") risk -= 0.15;\n      else if (code === \"W\" || code === \"S\") risk += 0.05;\n      else if (code === \"R\") risk += 0.3;\n    \n      if (profileSteepness === \"undercut\" && code !== \"V\" && code !== \"T\") risk += 0.7;\n      if (profileMode === \"internal_profile\" && (code === \"C\" || code === \"W\" || code === \"S\")) risk += 0.35;\n    \n      if (risk >= 2.9) return \"critical\";\n      if (risk >= 1.8) return \"high\";\n      if (risk >= 0.9) return \"medium\";\n      return \"low\";\n    }\n    \n    function clearanceScore(clearanceRiskClass) {\n      return { low: 1, medium: 0.72, high: 0.4, critical: 0.15 }[clearanceRiskClass] || 0.6;\n    }\n    \n    function inferPolarityBias(profileMode, slenderOrConfined, interruption, phase, surfacePriority, materialRefinement, isoGroup) {\n      var positiveNeed = 0;\n      var negativeNeed = 0;\n    \n      if (profileMode === \"internal_profile\") positiveNeed += 2;\n      positiveNeed += { normal: 0, thin_wall: 1.2, small_internal_space: 1.8, unstable: 2.1 }[slenderOrConfined] || 0;\n      if (surfacePriority === \"surface\") positiveNeed += 0.8;\n      if (materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") positiveNeed += 1;\n      if (isoGroup === \"N\") positiveNeed += 0.8;\n    \n      if (interruption === \"heavy\") negativeNeed += 2;\n      if (phase === \"roughing\") negativeNeed += 1;\n      if (surfacePriority === \"productivity\") negativeNeed += 1;\n      if (isoGroup === \"K\") negativeNeed += 0.8;\n    \n      if (positiveNeed >= negativeNeed + 1) return \"positive_preferred\";\n      if (negativeNeed >= positiveNeed + 1) return \"negative_preferred\";\n      return \"balanced\";\n    }\n    \n    function polarityFitScore(bias, candidatePolarity) {\n      if (bias === \"balanced\") return candidatePolarity === \"unknown\" ? 0.65 : 0.82;\n      if (candidatePolarity === \"unknown\") return 0.55;\n      if (bias === \"positive_preferred\") return candidatePolarity === \"positive\" ? 1 : 0.38;\n      return candidatePolarity === \"negative\" ? 1 : 0.38;\n    }\n    \n    function classifyRigidityRisk(profileMode, slenderOrConfined, overhangClass, profileSteepness, apMm, diameterMm) {\n      var risk = 0;\n    \n      if (profileMode === \"internal_profile\") risk += 1.3;\n      risk += { normal: 0, thin_wall: 1.1, small_internal_space: 1.5, unstable: 2.1 }[slenderOrConfined] || 0;\n      risk += { short: 0, medium: 0.7, long: 1.7, critical: 2.7 }[overhangClass] || 0;\n      risk += { shallow: 0, normal: 0.2, steep: 0.65, undercut: 1 }[profileSteepness] || 0.3;\n      if (diameterMm != null && apMm != null && diameterMm > 0 && apMm / diameterMm >= 0.08) risk += 0.35;\n    \n      if (risk >= 4.5) return \"critical\";\n      if (risk >= 3) return \"high\";\n      if (risk >= 1.4) return \"medium\";\n      return \"low\";\n    }\n    \n    function rigidityScore(rigidityRiskClass, candidatePolarity, shapeScore) {\n      var score = { low: 1, medium: 0.78, high: 0.48, critical: 0.16 }[rigidityRiskClass] || 0.55;\n      if (candidatePolarity === \"positive\" && (rigidityRiskClass === \"medium\" || rigidityRiskClass === \"high\")) score += 0.08;\n      if (shapeScore >= 0.85) score += 0.04;\n      return clamp(score, 0, 1);\n    }\n    \n    function classifySpecialToolRoute(toolFamilyPreference, profileSteepness, profileMode, slenderOrConfined, profileAngleDeg) {\n      if (toolFamilyPreference === \"copy_turn_system\") return \"copy_turn_system\";\n      if (toolFamilyPreference === \"groove_turn_system\") return \"groove_turn_profile_system\";\n      if (profileSteepness === \"undercut\") return \"copy_turn_system\";\n      if (profileMode === \"internal_profile\" && slenderOrConfined === \"small_internal_space\" && profileAngleDeg != null && profileAngleDeg >= 50) {\n        return \"groove_turn_profile_system\";\n      }\n      return \"iso_default\";\n    }\n    \n    function specialToolRouteScore(toolFamilyPreference, specialToolRoute, shapeCode) {\n      var code = String(shapeCode || \"\").toUpperCase();\n    \n      if (toolFamilyPreference === \"either\") {\n        return specialToolRoute === \"iso_default\" ? 0.9 : (code === \"D\" || code === \"V\" || code === \"T\" ? 0.76 : 0.58);\n      }\n      if (toolFamilyPreference === \"iso_holder\") {\n        return specialToolRoute === \"iso_default\" ? 1 : 0.48;\n      }\n      if (toolFamilyPreference === \"copy_turn_system\") {\n        return specialToolRoute === \"copy_turn_system\" && (code === \"D\" || code === \"V\" || code === \"T\") ? 0.9 : 0.42;\n      }\n      if (toolFamilyPreference === \"groove_turn_system\") {\n        return specialToolRoute === \"groove_turn_profile_system\" && (code === \"T\" || code === \"D\" || code === \"V\") ? 0.88 : 0.38;\n      }\n      return 0.65;\n    }\n    \n    function classifyChipControlRisk(materialRefinement, coolantClass, phase, interruption, apMm, fnTyp, profileSteepness) {\n      var ratio = apMm != null && fnTyp != null && fnTyp > 0 ? apMm / fnTyp : null;\n      var risk = 0;\n    \n      if (materialRefinement === \"tough_long_chipping\") risk += 1.2;\n      if (materialRefinement === \"sticky_bue\") risk += 1;\n      if (materialRefinement === \"work_hardening\") risk += 1.1;\n      if (phase === \"finishing\") risk += 0.3;\n      if (coolantClass === \"dry\" || coolantClass === \"unknown\") risk += 0.7;\n      if (profileSteepness === \"steep\") risk += 0.35;\n      if (profileSteepness === \"undercut\") risk += 0.6;\n      if (interruption === \"heavy\") risk -= 0.2;\n    \n      if (ratio != null) {\n        if (ratio < 4 || ratio > 18) risk += 1;\n        else if (ratio < 5 || ratio > 15) risk += 0.45;\n      }\n    \n      if (risk >= 2.7) return \"critical\";\n      if (risk >= 1.8) return \"high\";\n      if (risk >= 0.9) return \"medium\";\n      return \"low\";\n    }\n    \n    function chipRiskScore(chipControlRisk) {\n      return { low: 1, medium: 0.72, high: 0.42, critical: 0.15 }[chipControlRisk] || 0.6;\n    }\n    \n    function classifyCoolingSupport(materialRefinement, coolantClass, hasThroughCoolant, isoGroup, profileMode) {\n      var demand = 0;\n      var supply = 0;\n    \n      if (isoGroup === \"M\" || isoGroup === \"S\" || isoGroup === \"N\") demand += 1;\n      if (profileMode === \"internal_profile\") demand += 0.5;\n      if (materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") demand += 1;\n    \n      supply += { dry: 0, external: 0.8, internal: 1.2, high_pressure: 1.5, unknown: 0.4 }[coolantClass] || 0.4;\n      if ((coolantClass === \"internal\" || coolantClass === \"high_pressure\") && hasThroughCoolant) supply += 0.3;\n      if ((coolantClass === \"internal\" || coolantClass === \"high_pressure\") && !hasThroughCoolant) supply -= 0.3;\n    \n      if (supply >= demand + 0.7) return \"strong\";\n      if (supply >= demand) return \"adequate\";\n      if (supply >= demand - 0.6) return \"limited\";\n      return \"weak\";\n    }\n    \n    function coolingScore(coolingSupportClass) {\n      return { strong: 1, adequate: 0.82, limited: 0.55, weak: 0.22 }[coolingSupportClass] || 0.6;\n    }\n    \n    function classifyWiperSuitability(surfacePriority, phase, profileSteepness, profileMode, overhangClass, rigidityRiskClass, wiperAllowed, minProfileRadiusMm) {\n      if (wiperAllowed === \"no\") return \"avoid\";\n      if (profileSteepness === \"steep\" || profileSteepness === \"undercut\") return \"avoid\";\n      if (minProfileRadiusMm != null && minProfileRadiusMm <= 0.3) return \"avoid\";\n      if (profileMode === \"internal_profile\" && (overhangClass === \"long\" || overhangClass === \"critical\")) return \"avoid\";\n      if (rigidityRiskClass === \"high\" || rigidityRiskClass === \"critical\") return \"weak\";\n      if (surfacePriority === \"surface\" && phase === \"finishing\") return profileMode === \"external_profile\" ? \"usable\" : \"weak\";\n      return \"weak\";\n    }\n    \n    function computeTheoreticalRoughnessUm(fnTyp, noseRadiusMm) {\n      if (fnTyp == null || noseRadiusMm == null || noseRadiusMm <= 0) return null;\n      return fnTyp * fnTyp / (8 * noseRadiusMm) * 1000;\n    }\n    \n    function classifyFinishFeasibility(surfacePriority, phase, rigidityRiskClass, clearanceRiskClass, wiperSuitabilityClass, roughnessUm, targetRoughnessUm, radiusFitScoreValue) {\n      var roughnessFit = roughnessUm == null || targetRoughnessUm == null ? \"unknown\" : (roughnessUm <= targetRoughnessUm ? \"good\" : (roughnessUm <= targetRoughnessUm * 1.35 ? \"near\" : \"poor\"));\n    \n      if (surfacePriority === \"productivity\" && phase === \"roughing\") return \"weak\";\n      if (rigidityRiskClass === \"critical\") return \"weak\";\n      if (clearanceRiskClass === \"critical\") return \"weak\";\n      if (radiusFitScoreValue <= 0.25) return \"weak\";\n      if (wiperSuitabilityClass === \"avoid\" && targetRoughnessUm != null && targetRoughnessUm <= 3.2) return \"weak\";\n      if (roughnessFit === \"good\" && phase === \"finishing\" && (rigidityRiskClass === \"low\" || rigidityRiskClass === \"medium\") && (clearanceRiskClass === \"low\" || clearanceRiskClass === \"medium\")) {\n        return \"strong\";\n      }\n      if (roughnessFit === \"poor\") return \"weak\";\n      return \"conditional\";\n    }\n    \n    function finishScore(finishFeasibility, surfacePriority) {\n      var base = { strong: 1, conditional: 0.68, weak: 0.28 }[finishFeasibility] || 0.55;\n      if (surfacePriority === \"surface\") return base;\n      if (surfacePriority === \"balanced\") return clamp(base + 0.05, 0, 1);\n      return clamp(base + 0.12, 0, 1);\n    }\n    \n    function classifySpecialMaterialRoute(isoGroup, materialRefinement, phase, surfacePriority, preference) {\n      if (preference && preference !== \"auto\") return preference;\n      if (isoGroup === \"H\" || materialRefinement === \"hard\") return \"cbn_pcbn_route\";\n      if (isoGroup === \"N\" && (surfacePriority === \"surface\" || phase === \"finishing\")) return \"pcd_route\";\n      if (phase === \"finishing\" && surfacePriority === \"surface\" && (isoGroup === \"P\" || isoGroup === \"M\" || isoGroup === \"K\")) return \"cermet_possible\";\n      return \"carbide_default\";\n    }\n    \n    function buildReasonList(metrics) {\n      return [\n        metrics.stageFitScore >= 0.85 ? \"Stage and recipe window line up with the requested profiling phase.\" : \"The selected row is workable, but not ideal for the requested profiling phase.\",\n        metrics.shapeFitScore >= 0.85 ? \"Insert shape matches the required profile accessibility well.\" : \"Insert shape is usable, but profile accessibility is a compromise.\",\n        metrics.rigidityRiskClass === \"low\" || metrics.rigidityRiskClass === \"medium\"\n          ? \"Rigidity stays within a controlled profiling range.\"\n          : \"Deflection risk is the main constraint for this profiling setup.\",\n        metrics.clearanceRiskClass === \"low\" || metrics.clearanceRiskClass === \"medium\"\n          ? \"Free-cutting-angle risk remains manageable for the requested profile.\"\n          : \"Free-cutting-angle and accessibility need careful attention for this contour.\",\n        metrics.finishFeasibility === \"strong\"\n          ? \"Finish quality is credible with the current feed and profile-radius window.\"\n          : \"Finish quality depends strongly on radius, access and setup stability.\",\n      ].slice(0, 5);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"profile_turning\", ctx, toolkits));\n      var profileMode = getProfileMode(ctx);\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var profileSteepness = getProfileSteepness(ctx);\n      var slenderOrConfined = getSlenderOrConfined(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var surfacePriority = getSurfacePriority(ctx);\n      var profileAngleDeg = toNullableNumber(getAnswer(ctx, \"profile_angle_deg\"));\n    \n      derived.condition_stage = phase;\n      derived.profile_mode = profileMode;\n      derived.material_refinement = materialRefinement;\n      derived.insert_shape_need = classifyShapeNeed(profileSteepness, profileAngleDeg, profileMode, getToolFamilyPreference(ctx));\n      derived.positive_negative_bias = inferPolarityBias(profileMode, slenderOrConfined, interruption, phase, surfacePriority, materialRefinement, getIsoGroup(ctx));\n      derived.special_material_route = classifySpecialMaterialRoute(getIsoGroup(ctx), materialRefinement, phase, surfacePriority, getSpecialMaterialPreference(ctx));\n      derived.special_tool_route = classifySpecialToolRoute(getToolFamilyPreference(ctx), profileSteepness, profileMode, slenderOrConfined, profileAngleDeg);\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"profile_turning\", ctx);\n      var profileMode = getProfileMode(ctx);\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var coolantClass = getCoolantClass(ctx);\n      var profileSteepness = getProfileSteepness(ctx);\n      var toolFamilyPreference = getToolFamilyPreference(ctx);\n      var targetRoughnessUm = toNullableNumber(getAnswer(ctx, \"target_roughness\"));\n      var wiperAllowed = toNullableString(getAnswer(ctx, \"wiper_allowed\")) || \"unknown\";\n      var minProfileRadiusMm = toNullableNumber(getAnswer(ctx, \"min_profile_radius_mm\"));\n      var profileAngleDeg = toNullableNumber(getAnswer(ctx, \"profile_angle_deg\"));\n    \n      if ((materialRefinement === \"sticky_bue\" || materialRefinement === \"work_hardening\") && (coolantClass === \"dry\" || coolantClass === \"unknown\")) {\n        issues.push({\n          field: \"coolant_class\",\n          message: \"Difficult profiling cases benefit strongly from better coolant support.\",\n          severity: \"warning\",\n          code: \"profile_turning_coolant_support\",\n        });\n      }\n      if (phase === \"finishing\" && getAnswer(ctx, \"cut_interruption\") === \"heavy\") {\n        issues.push({\n          field: \"cut_interruption\",\n          message: \"Heavy interruption is a weak fit for finish-oriented profile turning.\",\n          severity: \"warning\",\n          code: \"profile_turning_finish_interruption\",\n        });\n      }\n      if (profileMode === \"internal_profile\" && (getAnswer(ctx, \"overhang_class\") === \"long\" || getAnswer(ctx, \"overhang_class\") === \"critical\")) {\n        issues.push({\n          field: \"overhang_class\",\n          message: \"Internal profiling with long overhang is strongly deflection-sensitive.\",\n          severity: \"warning\",\n          code: \"profile_turning_internal_overhang\",\n        });\n      }\n      if (wiperAllowed === \"yes\" && (profileSteepness === \"steep\" || profileSteepness === \"undercut\" || (minProfileRadiusMm != null && minProfileRadiusMm <= 0.3))) {\n        issues.push({\n          field: \"wiper_allowed\",\n          message: \"Wiper geometry is not a universal default for steep or tight profile turning.\",\n          severity: \"warning\",\n          code: \"profile_turning_wiper_conflict\",\n        });\n      }\n      if (profileAngleDeg != null && profileAngleDeg >= 50 && toolFamilyPreference === \"iso_holder\") {\n        issues.push({\n          field: \"tool_family_preference\",\n          message: \"Steeper profile angles can push this case beyond a simple ISO-holder default.\",\n          severity: \"warning\",\n          code: \"profile_turning_tool_family_angle\",\n        });\n      }\n      if (targetRoughnessUm != null && targetRoughnessUm < 1 && phase !== \"finishing\") {\n        issues.push({\n          field: \"target_roughness\",\n          message: \"Sub-micron roughness targets usually require a finishing-focused profile-turning strategy.\",\n          severity: \"warning\",\n          code: \"profile_turning_roughness_phase_conflict\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"profile_turning\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var turningTools = toolkits.turning;\n      var profileMode = getProfileMode(ctx);\n      var phase = getOperationPhase(ctx);\n      var materialRefinement = getMaterialRefinement(ctx);\n      var profileSteepness = getProfileSteepness(ctx);\n      var interruption = toNullableString(getAnswer(ctx, \"cut_interruption\")) || \"none\";\n      var diameterMm = toNullableNumber(getAnswer(ctx, \"workpiece_diameter_mm\"));\n      var apMm = toNullableNumber(getAnswer(ctx, \"ap_mm\"));\n      var minProfileRadiusMm = toNullableNumber(getAnswer(ctx, \"min_profile_radius_mm\"));\n      var slenderOrConfined = getSlenderOrConfined(ctx);\n      var surfacePriority = getSurfacePriority(ctx);\n      var coolantClass = getCoolantClass(ctx);\n      var toolFamilyPreference = getToolFamilyPreference(ctx);\n      var profileAngleDeg = toNullableNumber(getAnswer(ctx, \"profile_angle_deg\"));\n      var targetRoughnessUm = toNullableNumber(getAnswer(ctx, \"target_roughness\"));\n      var wiperAllowed = toNullableString(getAnswer(ctx, \"wiper_allowed\")) || \"unknown\";\n      var overhangClass = getOverhangClass(ctx);\n      var specialMaterialPreference = getSpecialMaterialPreference(ctx);\n      var isoGroup = getIsoGroup(ctx);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = turningTools.resolveRows(candidate, ctx);\n        var row = selectBestRow(rows, phase);\n        var recipeResult = turningTools.resolveRecipe(candidate, ctx);\n        var recipe = row && row.recipe ? row.recipe : recipeResult.recipe;\n        var recipeSource = recipeResult.source;\n        var insertIcMm = toNullableNumber(candidate.turning.turnSizeIcMm) || toNullableNumber(candidate.common.diameterMm);\n        var noseRadiusMm = toNullableNumber(candidate.turning.turnNoseRadiusMm);\n        var candidatePolarity = getCandidatePolarity(candidate);\n        var candidateShapeCode = toNullableString(candidate.turning.turnShapeCode) || \"?\";\n        var stageFit = stageFitScore(phase, row);\n        var shapeNeed = classifyShapeNeed(profileSteepness, profileAngleDeg, profileMode, toolFamilyPreference);\n        var shapeFit = shapeNeedScore(candidateShapeCode, shapeNeed, profileMode);\n        var radiusFit = profileRadiusFitScore(noseRadiusMm, minProfileRadiusMm);\n        var clearanceRiskClass = classifyClearanceRisk(profileSteepness, profileAngleDeg, profileMode, candidateShapeCode);\n        var clearanceFit = clearanceScore(clearanceRiskClass);\n        var polarityBias = inferPolarityBias(profileMode, slenderOrConfined, interruption, phase, surfacePriority, materialRefinement, isoGroup);\n        var polarityFit = polarityFitScore(polarityBias, candidatePolarity);\n        var rigidityRiskClass = classifyRigidityRisk(profileMode, slenderOrConfined, overhangClass, profileSteepness, apMm, diameterMm);\n        var rigidityFit = rigidityScore(rigidityRiskClass, candidatePolarity, shapeFit);\n        var specialToolRoute = classifySpecialToolRoute(toolFamilyPreference, profileSteepness, profileMode, slenderOrConfined, profileAngleDeg);\n        var specialToolFit = specialToolRouteScore(toolFamilyPreference, specialToolRoute, candidateShapeCode);\n        var recipeFnTyp = recipe && recipe.fn ? toNullableNumber(recipe.fn.typ) : null;\n        var recipeVcTyp = recipe && recipe.vc ? toNullableNumber(recipe.vc.typ) : null;\n        var chipControlRisk = classifyChipControlRisk(materialRefinement, coolantClass, phase, interruption, apMm, recipeFnTyp, profileSteepness);\n        var chipControlFit = chipRiskScore(chipControlRisk);\n        var coolingSupportClass = classifyCoolingSupport(materialRefinement, coolantClass, Boolean(candidate.common.coolantTsc), isoGroup, profileMode);\n        var coolingFit = coolingScore(coolingSupportClass);\n        var wiperSuitabilityClass = classifyWiperSuitability(surfacePriority, phase, profileSteepness, profileMode, overhangClass, rigidityRiskClass, wiperAllowed, minProfileRadiusMm);\n        var theoreticalRoughnessUm = computeTheoreticalRoughnessUm(recipeFnTyp, noseRadiusMm);\n        var finishFeasibility = classifyFinishFeasibility(surfacePriority, phase, rigidityRiskClass, clearanceRiskClass, wiperSuitabilityClass, theoreticalRoughnessUm, targetRoughnessUm, radiusFit);\n        var finishFit = finishScore(finishFeasibility, surfacePriority);\n        var specialMaterialRoute = classifySpecialMaterialRoute(isoGroup, materialRefinement, phase, surfacePriority, specialMaterialPreference);\n        var insertSizeFit = 0.72;\n        var rpmTyp = diameterMm != null && diameterMm > 0 && recipeVcTyp != null ? recipeVcTyp * 1000 / (Math.PI * diameterMm) : null;\n        var feedSpeedMmMin = recipeFnTyp != null && rpmTyp != null ? recipeFnTyp * rpmTyp : null;\n        var mrrCm3Min = apMm != null && recipeFnTyp != null && recipeVcTyp != null ? apMm * recipeFnTyp * recipeVcTyp : null;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidenceBase;\n        var confidence;\n        var metrics;\n    \n        if (rows.length === 0 && candidate.stage === \"detail\") {\n          hardRejectReason = \"No turning row is available for profile turning.\";\n        }\n        if (!hardRejectReason && minProfileRadiusMm != null && noseRadiusMm != null && noseRadiusMm > minProfileRadiusMm) {\n          hardRejectReason = \"Insert nose radius exceeds the smallest requested profile radius.\";\n        }\n        if (!hardRejectReason && profileMode === \"internal_profile\" && diameterMm != null && insertIcMm != null && insertIcMm >= diameterMm) {\n          hardRejectReason = \"Insert size exceeds the requested internal profile diameter window.\";\n        }\n    \n        if (apMm != null && insertIcMm != null && insertIcMm > 0) {\n          insertSizeFit = apMm <= insertIcMm * 0.45 ? 1 : apMm <= insertIcMm * 0.8 ? 0.74 : 0.45;\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          rowMatch: row ? 1 : 0,\n          stage: stageFit * 1.15,\n          insertSize: insertSizeFit,\n          shape: shapeFit * 1.35,\n          radiusFit: radiusFit * 1.1,\n          clearance: clearanceFit * 1.2,\n          polarity: polarityFit * 1.05,\n          rigidity: rigidityFit * 1.3,\n          specialTool: specialToolFit * 0.9,\n          chipControl: chipControlFit * 0.95,\n          cooling: coolingFit * 0.85,\n          finish: finishFit * (surfacePriority === \"surface\" ? 1.18 : 0.88),\n          riskPenalty: -(kernel.risk(candidate, ctx) || 0),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidenceBase = { exact: 0.92, near: 0.8, estimated: 0.66, none: 0.48 }[recipeSource] || 0.48;\n        confidence = confidenceBase;\n        if (rigidityRiskClass === \"high\") confidence -= 0.1;\n        if (rigidityRiskClass === \"critical\") confidence -= 0.2;\n        if (clearanceRiskClass === \"high\") confidence -= 0.1;\n        if (clearanceRiskClass === \"critical\") confidence -= 0.2;\n        if (chipControlRisk === \"high\") confidence -= 0.06;\n        if (chipControlRisk === \"critical\") confidence -= 0.12;\n        confidence = hardRejectReason ? 0 : clamp(confidence, 0.2, 0.98);\n    \n        metrics = Object.assign({}, turningTools.getSharedMetrics(candidate, ctx), {\n          requestedProfileMode: profileMode,\n          requestedOperationPhase: phase,\n          requestedMaterialRefinement: materialRefinement,\n          requestedWorkpieceDiameterMm: diameterMm,\n          requestedApMm: apMm,\n          requestedMinProfileRadiusMm: minProfileRadiusMm,\n          requestedProfileSteepness: profileSteepness,\n          requestedCutInterruption: interruption,\n          requestedSlenderOrConfined: slenderOrConfined,\n          requestedSurfacePriority: surfacePriority,\n          requestedCoolantClass: coolantClass,\n          requestedToolFamilyPreference: toolFamilyPreference,\n          requestedProfileAngleDeg: profileAngleDeg,\n          requestedTargetRoughnessUm: targetRoughnessUm,\n          requestedWiperAllowed: wiperAllowed,\n          requestedOverhangClass: overhangClass,\n          requestedSpecialMaterialPreference: specialMaterialPreference,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          insertIcMm: insertIcMm,\n          noseRadiusMm: noseRadiusMm,\n          candidatePolarity: candidatePolarity,\n          candidateShapeCode: candidateShapeCode,\n          insertShapeNeed: shapeNeed,\n          shapeFitScore: shapeFit,\n          profileRadiusFitScore: radiusFit,\n          clearanceRiskClass: clearanceRiskClass,\n          positiveNegativeBias: polarityBias,\n          rigidityRiskClass: rigidityRiskClass,\n          chipControlRisk: chipControlRisk,\n          coolingSupportClass: coolingSupportClass,\n          wiperSuitabilityClass: wiperSuitabilityClass,\n          finishFeasibility: finishFeasibility,\n          specialToolRoute: specialToolRoute,\n          specialMaterialRoute: specialMaterialRoute,\n          theoreticalRoughnessUm: theoreticalRoughnessUm,\n          stageFitScore: stageFit,\n          polarityFitScore: polarityFit,\n          insertSizeFitScore: insertSizeFit,\n          clearanceFitScore: clearanceFit,\n          specialToolFitScore: specialToolFit,\n          rpmTyp: rpmTyp,\n          feedSpeedMmMin: feedSpeedMmMin,\n          mrrCm3Min: mrrCm3Min,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeSource,\n          reasons: buildReasonList(metrics),\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/ramping-helical-interpolation/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/ramping-helical-interpolation/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/ramping-helical-interpolation/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/ramping-helical-interpolation/presenter.js\");\n    exports.default = createStubProcessModule(\"ramping_helical_interpolation\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/ramping-helical-interpolation/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(2);\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = String(item || \"\").replace(/\\s+/g, \" \").trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative helical option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        metrics.helicalCapabilityClass !== \"confirmed\" ? {\n          severity: \"warning\",\n          title: \"Control capability\",\n          message: \"Helical interpolation should not be overpromised unless the control and CAM can really run the circular XY path with axial Z feed.\",\n        } : null,\n        metrics.holeFeasibilityClass === \"poor\" ? {\n          severity: \"warning\",\n          title: \"Tight orbit clearance\",\n          message: \"The tool is already large relative to the hole. Chip evacuation and circular path stability become more sensitive now.\",\n        } : null,\n        metrics.openingFitClass === \"predrill_required\" || metrics.openingFitClass === \"predrill_recommended\" ? {\n          severity: \"warning\",\n          title: \"Opening strategy\",\n          message: \"A pre-opened feature makes this helical route more credible than forcing a questionable from-solid entry.\",\n        } : null,\n        metrics.finishSplitClass === \"mandatory\" ? {\n          severity: \"warning\",\n          title: \"Finish split\",\n          message: \"Use the helix to open or rough the hole, then hand final size or finish to a dedicated finishing route.\",\n        } : metrics.finishSplitClass === \"recommended\" ? {\n          severity: \"warning\",\n          title: \"Quality route\",\n          message: \"A separate finishing pass is still the safer route if the wall or hole quality matters.\",\n        } : null,\n        metrics.drillAlternativeClass === \"strong\" ? {\n          severity: \"warning\",\n          title: \"Drill alternative\",\n          message: \"For this rather standard axial hole-making task, drilling may still be the more direct first choice.\",\n        } : null,\n      ].filter(Boolean).slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"capability\",\n          label: \"Helical capability\",\n          result: metrics.helicalCapabilityClass === \"confirmed\" ? \"pass\" : metrics.helicalCapabilityClass === \"likely\" || metrics.helicalCapabilityClass === \"unknown\" ? \"limited\" : \"fail\",\n          note: metrics.helicalCapabilityLabel || \"Review\",\n        },\n        {\n          key: \"opening\",\n          label: \"Opening route\",\n          result: metrics.openingFitClass === \"from_solid_ok\" ? \"pass\" : metrics.openingFitClass === \"predrill_recommended\" ? \"limited\" : \"fail\",\n          note: metrics.openingFitLabel || \"Review\",\n        },\n        {\n          key: \"chip\",\n          label: \"Chip evacuation\",\n          result: metrics.chipEvacuationSeverityClass === \"low\" ? \"pass\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"limited\" : \"fail\",\n          note: \"Severity: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") + \".\",\n        },\n        {\n          key: \"reach\",\n          label: \"Reach reserve\",\n          result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 && metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"pass\" : \"fail\",\n          note: \"Usable length and APMX must both clear the requested interpolation depth.\",\n        },\n      ];\n    }\n    \n    function buildFeatureItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"diameter\", label: \"Target hole diameter\", value: metrics.requestedHoleDiameterMm != null ? formatDisplayNumber(metrics.requestedHoleDiameterMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"depth\", label: \"Interpolation depth\", value: metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"start\", label: \"Start condition\", value: metrics.requestedStartConditionLabel || \"Review\" },\n        { key: \"finish\", label: \"Process target\", value: metrics.requestedFinishStrategyLabel || \"Review\" },\n        { key: \"coolant\", label: \"Coolant support\", value: metrics.requestedCoolantSupportLabel || \"Review\" },\n        { key: \"machine\", label: \"Machine class\", value: metrics.requestedMachineLimitLabel || \"Review\" },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"ratio\",\n          label: \"Tool-to-hole ratio\",\n          actual: metrics.toolToHoleRatio != null ? formatDisplayNumber(metrics.toolToHoleRatio, 3) : null,\n          target: \"< 1.00\",\n          result: metrics.holeFeasibilityClass === \"good\" ? \"fit\" : metrics.holeFeasibilityClass === \"conditional\" ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"orbit\",\n          label: \"Orbit diameter\",\n          actual: metrics.orbitDiameterMm != null ? formatDisplayNumber(metrics.orbitDiameterMm, 2) + \" mm\" : null,\n          target: \"positive clearance\",\n          result: metrics.orbitDiameterMm != null && metrics.orbitDiameterMm > 0 ? \"fit\" : \"mismatch\",\n        },\n        {\n          key: \"ramp\",\n          label: \"Ramp angle window\",\n          actual: metrics.requestedRampAngleDeg != null ? formatDisplayNumber(metrics.requestedRampAngleDeg, 2) + \" deg\" : null,\n          target: metrics.rampAngleMaxDeg != null ? \"<= \" + formatDisplayNumber(metrics.rampAngleMaxDeg, 2) + \" deg\" : null,\n          result: metrics.rampAngleFitClass === \"good\" ? \"fit\" : metrics.rampAngleFitClass === \"high\" ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"reach\",\n          label: \"Usable length vs depth\",\n          actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null,\n          target: metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm\" : null,\n          result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n      ];\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"helical\", label: \"Helical case\", value: metrics.helicalSuitabilityLabel || \"Review\", status: metrics.helicalSuitabilityClass === \"strong_case\" ? \"good\" : metrics.helicalSuitabilityClass === \"valid_case\" ? \"ok\" : \"weak\" },\n        { key: \"opening\", label: \"Opening fit\", value: metrics.openingFitLabel || \"Review\", status: metrics.openingFitClass === \"from_solid_ok\" ? \"good\" : metrics.openingFitClass === \"predrill_recommended\" ? \"ok\" : \"weak\" },\n        { key: \"ramp\", label: \"Ramp fit\", value: metrics.rampAngleFitLabel || \"Review\", status: metrics.rampAngleFitClass === \"good\" ? \"good\" : metrics.rampAngleFitClass === \"high\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatDisplayNumber(top.score.confidence, 2) || \"n/a\", status: top.score.confidence >= 0.82 ? \"good\" : top.score.confidence >= 0.65 ? \"ok\" : \"weak\" },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n      });\n    \n      block.data.presentation = {\n        title: \"Start here\",\n        description: \"These start values are only credible when the orbit clearance, chip evacuation and real helical path capability all stay aligned with the intended opening route.\",\n        rowBackedValues: [\n          { label: \"Start\", value: metrics.requestedStartConditionLabel || \"Review\", tone: \"text\" },\n          { label: \"Ratio\", value: metrics.toolToHoleRatio != null ? formatDisplayNumber(metrics.toolToHoleRatio, 3) : \"n/a\", tone: \"text\" },\n          { label: \"Orbit\", value: metrics.orbitDiameterMm != null ? formatDisplayNumber(metrics.orbitDiameterMm, 2) : \"n/a\", unit: \"mm\" },\n          { label: \"Ramp\", value: metrics.rampAngleFitLabel || \"Review\", tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"Pitch\", value: formatDisplayNumber(metrics.pitchPerRevMm, 2) || \"n/a\", unit: \"mm/rev\" },\n        ],\n        machineValues: [\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf lin\", value: formatDisplayNumber(metrics.feedLinearMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"vf helix\", value: formatDisplayNumber(metrics.feedHelicalMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n        ],\n        trustCard: {\n          title: \"Process credibility\",\n          tone: metrics.helicalSuitabilityClass === \"strong_case\" ? \"good\" : metrics.helicalSuitabilityClass === \"valid_case\" ? \"default\" : \"watch\",\n          badge: metrics.helicalSuitabilityLabel || \"Review\",\n          value: \"Opening route: \" + (metrics.openingFitLabel || \"Review\"),\n          note: \"Helical feed is shown with the internal circular-path correction already applied. Treat it as a safer release value, not as a blind linear feed copy.\",\n          items: dedupeTextItems([\n            metrics.helicalCapabilityLabel ? \"Capability: \" + metrics.helicalCapabilityLabel + \".\" : null,\n            metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            metrics.chipEvacuationSeverityLabel ? \"Chip severity: \" + metrics.chipEvacuationSeverityLabel + \".\" : null,\n          ]),\n        },\n      };\n      return block;\n    }\n    \n    function buildSetupBlock(top, riskItems) {\n      var metrics = top.metrics || {};\n      var block = setupNotes([\n        { area: \"opening\", message: \"Start condition: \" + (metrics.requestedStartConditionLabel || \"Review\") },\n        { area: \"coolant\", message: \"Coolant support: \" + (metrics.requestedCoolantSupportLabel || \"Review\") },\n        { area: \"concept\", message: \"Preferred concept: \" + (metrics.toolConceptDesiredLabel || \"Review\") },\n      ]);\n    \n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Fit\",\n            highlight: \"This recommendation is driven mainly by believable orbital clearance, a credible opening route and whether the control can really run the helix the way the recipe expects.\",\n            items: dedupeTextItems([\n              metrics.holeFeasibilityClass === \"good\" || metrics.holeFeasibilityClass === \"conditional\" ? \"The cutter-to-hole ratio still leaves a workable orbit.\" : null,\n              metrics.openingFitClass === \"from_solid_ok\" ? \"The current start condition still supports helical entry from solid.\" : null,\n              metrics.helicalCapabilityClass === \"confirmed\" || metrics.helicalCapabilityClass === \"likely\" ? \"The machine side still supports a believable helical path.\" : null,\n            ]).slice(0, 3),\n          },\n          how: {\n            title: \"How to start\",\n            tone: \"default\",\n            badge: metrics.rampAngleFitLabel || \"Release\",\n            highlight: \"Keep the helix shallow, release feed with the internal circular-path correction, and do not let chip evacuation collapse as the orbit gets tighter.\",\n            items: dedupeTextItems([\n              metrics.requestedRampAngleDeg != null ? \"Start around \" + formatDisplayNumber(metrics.requestedRampAngleDeg, 2) + \" deg helix angle.\" : null,\n              metrics.pitchPerRevMm != null ? \"Pitch per revolution is about \" + formatDisplayNumber(metrics.pitchPerRevMm, 2) + \" mm.\" : null,\n              metrics.feedCorrectionFactor != null ? \"Helical feed already includes an internal path factor of \" + formatDisplayNumber(metrics.feedCorrectionFactor, 3) + \".\" : null,\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: \"Helical interpolation is strong when it opens or enlarges holes cleanly, but it becomes fragile quickly when the tool is too large, the chips cannot clear or the final quality expectation is too optimistic.\",\n            items: dedupeTextItems(riskItems.map(function mapRisk(item) {\n              return item.title + \": \" + item.message;\n            })).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"Orbit basis\",\n            tone: metrics.holeFeasibilityClass === \"good\" ? \"good\" : \"default\",\n            badge: metrics.holeFeasibilityLabel || \"Review\",\n            value: \"Target hole \" + (metrics.requestedHoleDiameterMm != null ? formatDisplayNumber(metrics.requestedHoleDiameterMm, 2) + \" mm\" : \"n/a\") + \" with tool \" + (metrics.candidateDiameterMm != null ? formatDisplayNumber(metrics.candidateDiameterMm, 2) + \" mm\" : \"n/a\") + \".\",\n            note: metrics.orbitRadiusMm != null ? \"Orbit radius \" + formatDisplayNumber(metrics.orbitRadiusMm, 2) + \" mm.\" : null,\n            items: dedupeTextItems([\n              metrics.orbitDiameterMm != null ? \"Orbit diameter: \" + formatDisplayNumber(metrics.orbitDiameterMm, 2) + \" mm.\" : null,\n              metrics.toolToHoleRatio != null ? \"Tool-to-hole ratio: \" + formatDisplayNumber(metrics.toolToHoleRatio, 3) + \".\" : null,\n              metrics.rampAngleFitLabel ? \"Ramp fit: \" + metrics.rampAngleFitLabel + \".\" : null,\n            ]),\n          },\n          {\n            title: \"Chip and quality control\",\n            tone: metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\" ? \"watch\" : \"default\",\n            badge: metrics.chipEvacuationSeverityLabel || \"Review\",\n            value: \"Chip evacuation and final hole quality decide whether the helix stays a clean opening route or turns into a risky workaround.\",\n            note: metrics.finishSplitLabel ? \"Finish route: \" + metrics.finishSplitLabel + \".\" : null,\n            items: dedupeTextItems([\n              metrics.requestedCoolantSupportLabel ? \"Coolant support: \" + metrics.requestedCoolantSupportLabel + \".\" : null,\n              metrics.requestedToleranceLabel ? \"Hole quality target: \" + metrics.requestedToleranceLabel + \".\" : null,\n              metrics.drillAlternativeLabel ? \"Drill alternative: \" + metrics.drillAlternativeLabel + \".\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Orbit too tight\",\n            tone: metrics.holeFeasibilityClass === \"poor\" ? \"high\" : \"default\",\n            category: \"Geometry\",\n            cause: \"When the tool gets too large relative to the hole, the orbit shrinks, the feed correction gets harsher and chip evacuation becomes the first thing to break.\",\n            actions: dedupeTextItems([\n              \"Reduce tool diameter or switch to a smaller helical concept before pushing feed.\",\n              \"Do not ignore chip packing just because the nominal helix angle still fits.\",\n              \"Prefer a pre-opened hole or another strategy if the clearance keeps collapsing.\",\n            ]),\n          },\n          {\n            title: \"Quality split\",\n            tone: metrics.finishSplitClass === \"mandatory\" ? \"watch\" : \"default\",\n            category: \"Quality\",\n            cause: \"Opening or enlarging the hole with a helix is not automatically the same thing as delivering final size, finish and tolerance in one step.\",\n            actions: dedupeTextItems([\n              \"Keep final size or finish as a separate step when the hole quality target is tight.\",\n              \"Use the helix for opening or roughing first, then finish with a cleaner route.\",\n              \"Do not sell a rough opening helix as a guaranteed final-hole solution.\",\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var riskItems;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"ramping_helical_interpolation\",\n          outcome: \"no_match\",\n          summary: \"No credible helical interpolation recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current helical interpolation inputs do not support a credible recommendation.\"),\n            noMatchGuidance({\n              message: \"Check hole diameter versus tool diameter, interpolation depth, start condition, helix angle, chip evacuation and whether the final hole quality should stay separate from the opening helix.\",\n              steps: [\n                \"Confirm that the tool stays clearly below the requested hole diameter.\",\n                \"Review whether a pre-opened hole is the more credible start condition.\",\n                \"Keep the helix shallow enough for the row-backed ramp-angle limit.\",\n                \"Treat chip evacuation as a core constraint, especially in tight holes and tougher materials.\",\n                \"Split rough opening and final hole quality if the tolerance or finish target is demanding.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust helical inputs\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      riskItems = buildRiskItems(top);\n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best helical-interpolation fit for \" + (metrics.requestedHoleDiameterMm != null ? formatDisplayNumber(metrics.requestedHoleDiameterMm, 2) + \" mm hole\" : \"the stated hole\") + \" and \" + (metrics.requestedDepthMm != null ? formatDisplayNumber(metrics.requestedDepthMm, 2) + \" mm depth\" : \"the stated depth\") + \".\",\n        headerPills: [\n          { tone: metrics.helicalSuitabilityClass === \"strong_case\" ? \"good\" : metrics.helicalSuitabilityClass === \"valid_case\" ? \"default\" : \"watch\", text: metrics.helicalSuitabilityLabel || \"Best fit\" },\n          { tone: metrics.openingFitClass === \"from_solid_ok\" ? \"good\" : metrics.openingFitClass === \"predrill_recommended\" ? \"default\" : \"watch\", text: \"Start: \" + (metrics.openingFitLabel || \"Review\") },\n          { tone: metrics.rampAngleFitClass === \"good\" ? \"good\" : metrics.rampAngleFitClass === \"high\" ? \"default\" : \"watch\", text: \"Ramp: \" + (metrics.rampAngleFitLabel || \"Review\") },\n          { tone: metrics.chipEvacuationSeverityClass === \"low\" ? \"good\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"default\" : \"watch\", text: \"Chips: \" + (metrics.chipEvacuationSeverityLabel || \"Review\") },\n        ],\n      };\n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine fit\",\n          tone: metrics.helicalCapabilityClass === \"confirmed\" ? \"good\" : \"default\",\n          badge: titleCase(metrics.helicalCapabilityClass || \"review\"),\n          value: \"Control: \" + (metrics.helicalCapabilityLabel || \"Review\"),\n          note: \"Helical interpolation only stays believable if the machine can truly run the orbital path and the opening route still matches the chosen tool concept.\",\n          items: dedupeTextItems([\n            metrics.requestedMachineLimitLabel ? \"Machine class: \" + metrics.requestedMachineLimitLabel + \".\" : null,\n            metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            metrics.drillAlternativeLabel ? \"Drill alternative: \" + metrics.drillAlternativeLabel + \".\" : null,\n          ]),\n        },\n      };\n    \n      return createResultViewModel({\n        processId: \"ramping_helical_interpolation\",\n        outcome: top.score.total >= 8 ? \"match\" : \"limited_match\",\n        summary: \"Best helical-interpolation result based on tool-to-hole ratio, start condition, ramp realism and chip evacuation.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          buildMillingBundleRecommendation(candidate),\n          featureSummary(buildFeatureItems(top)),\n          geometryFit(buildGeometryItems(top)),\n          fitKpis(buildFitItems(top)),\n          recipeBlock,\n          machineBlock,\n          buildSetupBlock(top, riskItems),\n          riskNotes(riskItems),\n          alternatives(buildAlternativeItems(scored)),\n          commerceCta(Object.assign({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }, buildMillingCompositeCommerceData(candidate) || {})),\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust helical inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/ramping-helical-interpolation/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"ramping_helical_interpolation\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/ramping-helical-interpolation/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function average(values) {\n      var filtered = (values || []).filter(function keep(value) {\n        return value != null && Number.isFinite(value);\n      });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) {\n        return total + value;\n      }, 0) / filtered.length;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function scoreToken(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function formatLabel(value, map, fallback) {\n      return map[value] || fallback || \"Review\";\n    }\n    \n    function normalizeConceptPreference(value) {\n      if (value === \"solid_carbide_only\") return \"solid_carbide\";\n      if (value === \"exchangeable_head_only\") return \"exchangeable_head\";\n      if (value === \"solid_or_exchangeable\") return \"solid_or_exchangeable\";\n      if (value === \"indexable_only\") return \"indexable\";\n      return \"either\";\n    }\n    \n    function getStartConditionLabel(value) {\n      return formatLabel(value, {\n        from_solid: \"From solid\",\n        existing_hole: \"Existing hole\",\n        existing_opening: \"Existing opening\",\n      }, \"Start review\");\n    }\n    \n    function getFinishStrategyLabel(value) {\n      return formatLabel(value, {\n        opening_only: \"Opening / roughing only\",\n        rough_plus_finish: \"Rough + finish\",\n        final_geometry: \"Final size / quality\",\n      }, \"Process target\");\n    }\n    \n    function getCapabilityLabel(value) {\n      return formatLabel(value, {\n        confirmed: \"Confirmed\",\n        likely: \"Likely\",\n        absent: \"Absent\",\n        unknown: \"Unknown\",\n      }, \"Capability review\");\n    }\n    \n    function getCoolantLabel(value) {\n      return formatLabel(value, {\n        air: \"Air blast\",\n        external: \"External coolant\",\n        internal: \"Internal coolant\",\n        unknown: \"Unknown\",\n      }, \"Coolant review\");\n    }\n    \n    function getToleranceLabel(value) {\n      return formatLabel(value, {\n        opening_only: \"Opening only\",\n        general: \"General quality\",\n        tight: \"Tight size / finish\",\n      }, \"Quality review\");\n    }\n    \n    function getMachineLabel(value) {\n      return formatLabel(value, {\n        high_power: \"High power / rigid\",\n        normal: \"Normal\",\n        low_power: \"Low power\",\n        low_rigidity: \"Low rigidity\",\n        unknown: \"Unknown\",\n      }, \"Machine review\");\n    }\n    \n    function getConceptLabel(value) {\n      return formatLabel(value, {\n        solid_carbide: \"Solid carbide\",\n        exchangeable_head: \"Exchangeable head\",\n        solid_or_exchangeable: \"Solid / exchangeable\",\n        indexable: \"Indexable\",\n        either: \"Either\",\n      }, \"Concept review\");\n    }\n    \n    function getHoleFeasibilityLabel(value) {\n      return formatLabel(value, {\n        good: \"Good\",\n        conditional: \"Conditional\",\n        poor: \"Poor\",\n        not_credible: \"Not credible\",\n      }, \"Review\");\n    }\n    \n    function getOpeningLabel(value) {\n      return formatLabel(value, {\n        from_solid_ok: \"From solid OK\",\n        predrill_recommended: \"Predrill recommended\",\n        predrill_required: \"Predrill required\",\n        not_credible: \"Not credible\",\n      }, \"Review\");\n    }\n    \n    function getRampLabel(value) {\n      return formatLabel(value, {\n        good: \"Good\",\n        high: \"High but usable\",\n        too_steep: \"Too steep\",\n      }, \"Review\");\n    }\n    \n    function getChipLabel(value) {\n      return formatLabel(value, {\n        low: \"Low\",\n        medium: \"Medium\",\n        high: \"High\",\n        critical: \"Critical\",\n      }, \"Review\");\n    }\n    \n    function getFinishLabel(value) {\n      return formatLabel(value, {\n        no: \"No finish split needed\",\n        recommended: \"Finish split recommended\",\n        mandatory: \"Finish split mandatory\",\n      }, \"Review\");\n    }\n    \n    function getSuitabilityLabel(value) {\n      return formatLabel(value, {\n        strong_case: \"Strong case\",\n        valid_case: \"Valid case\",\n        weak_case: \"Weak case\",\n        not_credible: \"Not credible\",\n      }, \"Review\");\n    }\n    \n    function getDrillAlternativeLabel(value) {\n      return formatLabel(value, {\n        no: \"No drill bias\",\n        possible: \"Drill also plausible\",\n        strong: \"Drill strongly plausible\",\n      }, \"Review\");\n    }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var helix = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neck = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var text = [\n        candidate.catalog && candidate.catalog.productTitle,\n        candidate.catalog && candidate.catalog.variantTitle,\n        candidate.ids && candidate.ids.sku,\n      ].join(\" \").toLowerCase();\n    \n      if (text.indexOf(\"head\") >= 0 || text.indexOf(\"316\") >= 0 || text.indexOf(\"multi-master\") >= 0 || text.indexOf(\"multimaster\") >= 0) return \"exchangeable_head\";\n      if (text.indexOf(\"index\") >= 0 || text.indexOf(\"body\") >= 0 || text.indexOf(\"cutter\") >= 0 || text.indexOf(\"390\") >= 0) return \"indexable\";\n      if (text.indexOf(\"solid\") >= 0 || text.indexOf(\"plura\") >= 0 || text.indexOf(\"dura\") >= 0 || text.indexOf(\"end mill\") >= 0) return \"solid_carbide\";\n      if (diameter != null && diameter >= 25) return \"indexable\";\n      if (diameter != null && diameter <= 16 && helix != null && helix >= 30) return \"solid_carbide\";\n      if (neck != null && diameter != null && neck < diameter) return \"solid_carbide\";\n      if (diameter != null && diameter <= 20) return \"solid_or_exchangeable\";\n      return \"either\";\n    }\n    \n    function materialSeverity(ctx, materialCondition) {\n      var materialCode = String(ctx && ctx.materialCode || \"\").toUpperCase();\n      var base = scoreToken(materialCode.charAt(0), {\n        P: 0.22,\n        M: 0.52,\n        K: 0.18,\n        N: 0.28,\n        S: 0.72,\n        H: 0.56,\n      }, 0.3);\n      var score = clamp(base + scoreToken(materialCondition, {\n        standard: 0,\n        tough_long_chipping: 0.1,\n        sticky_bue: 0.12,\n        work_hardening: 0.18,\n        hard_abrasive: 0.16,\n        unknown: 0.06,\n      }, 0.06), 0, 1);\n      return {\n        score: score,\n        className: score >= 0.72 ? \"severe\" : score >= 0.5 ? \"difficult\" : score >= 0.28 ? \"normal\" : \"easy\",\n      };\n    }\n    \n    function deriveSuggestedConcept(inputs) {\n      var solid = 0;\n      var exchangeable = 0;\n      var indexable = 0;\n    \n      if (inputs.holeDiameterMm != null && inputs.holeDiameterMm <= 20) {\n        solid += 2;\n        exchangeable += 1;\n      }\n      if (inputs.holeDiameterMm != null && inputs.holeDiameterMm > 20 && inputs.holeDiameterMm < 35) {\n        solid += 1;\n        exchangeable += 1;\n      }\n      if (inputs.holeDiameterMm != null && inputs.holeDiameterMm >= 35) {\n        indexable += 2;\n        exchangeable += 1;\n      }\n      if (inputs.startCondition === \"from_solid\") {\n        solid += 2;\n        exchangeable += 1;\n        indexable -= 1;\n      }\n      if (inputs.finishStrategy === \"final_geometry\" || inputs.toleranceTarget === \"tight\") {\n        solid += 2;\n        exchangeable += 1;\n        indexable -= 1;\n      }\n      if (inputs.finishStrategy === \"opening_only\" && inputs.priority === \"productivity\" && inputs.holeDiameterMm != null && inputs.holeDiameterMm >= 30) {\n        indexable += 2;\n      }\n      if (inputs.depthRatio != null && inputs.depthRatio >= 1.2) {\n        solid += 1;\n        exchangeable += 1;\n      }\n      if (inputs.machineLimitClass === \"low_power\" || inputs.machineLimitClass === \"low_rigidity\") {\n        if (inputs.holeDiameterMm != null && inputs.holeDiameterMm >= 24) indexable += 1;\n        solid += 1;\n      }\n      if (inputs.materialSeverityScore >= 0.55) {\n        solid += 1;\n        exchangeable += 1;\n      }\n    \n      if (solid >= indexable + 2 && solid >= exchangeable + 2) return \"solid_carbide\";\n      if (exchangeable >= solid + 1 && exchangeable >= indexable + 1) return \"exchangeable_head\";\n      if (indexable >= solid + 1 && indexable >= exchangeable + 1) return \"indexable\";\n      if (solid >= exchangeable && solid >= indexable) return \"solid_or_exchangeable\";\n      return \"either\";\n    }\n    \n    function conceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var explicitDesired = explicitConcept !== \"either\" ? explicitConcept : desiredConcept;\n      var score = 0.76;\n    \n      if (explicitDesired === \"either\" || candidateConcept === \"either\") score = 0.82;\n      else if (explicitDesired === \"solid_or_exchangeable\" && (candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\")) score = 0.96;\n      else if (candidateConcept === explicitDesired) score = explicitConcept === \"either\" ? 0.92 : 1;\n      else if ((candidateConcept === \"solid_or_exchangeable\" && (explicitDesired === \"solid_carbide\" || explicitDesired === \"exchangeable_head\"))\n        || (explicitDesired === \"solid_or_exchangeable\" && candidateConcept === \"either\")) {\n        score = explicitConcept === \"either\" ? 0.8 : 0.7;\n      } else if (explicitDesired === \"exchangeable_head\" && candidateConcept === \"solid_carbide\") {\n        score = 0.66;\n      } else if (explicitDesired === \"indexable\" && candidateConcept === \"exchangeable_head\") {\n        score = 0.62;\n      } else {\n        score = explicitConcept === \"either\" ? 0.5 : 0.24;\n      }\n    \n      return {\n        score: score,\n        className: score >= 0.9 ? \"strong\" : score >= 0.7 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\",\n      };\n    }\n    \n    function holeRatioFit(toolToHoleRatio, candidateConcept, holeDiameterMm) {\n      var score;\n    \n      if (toolToHoleRatio == null) return { score: 0.5, className: \"conditional\", hardFail: false };\n      if (toolToHoleRatio >= 1) return { score: 0, className: \"not_credible\", hardFail: true };\n    \n      if (toolToHoleRatio <= 0.45) score = 1;\n      else if (toolToHoleRatio <= 0.65) score = 0.94;\n      else if (toolToHoleRatio <= 0.8) score = 0.82;\n      else if (toolToHoleRatio <= 0.92) score = 0.56;\n      else score = 0.22;\n    \n      if (candidateConcept === \"indexable\" && holeDiameterMm != null && holeDiameterMm < 30) score = clamp(score - 0.18, 0, 1);\n      if ((candidateConcept === \"solid_carbide\" || candidateConcept === \"solid_or_exchangeable\") && holeDiameterMm != null && holeDiameterMm <= 20 && toolToHoleRatio <= 0.78) {\n        score = clamp(score + 0.04, 0, 1);\n      }\n    \n      return {\n        score: score,\n        className: score >= 0.88 ? \"good\" : score >= 0.65 ? \"conditional\" : score > 0 ? \"poor\" : \"not_credible\",\n        hardFail: false,\n      };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 5) return 1;\n      if (margin >= 2) return 0.88;\n      if (margin >= 0.5) return 0.74;\n      if (margin >= 0) return 0.58;\n      if (margin >= -1) return 0.18;\n      return 0;\n    }\n    \n    function maxDiameterFit(candidateDiameter, maxToolDiameter) {\n      var margin;\n      if (maxToolDiameter == null) return { score: 0.76, className: \"open\", hardFail: false, margin: null };\n      if (candidateDiameter == null) return { score: 0.52, className: \"unknown\", hardFail: false, margin: null };\n      margin = maxToolDiameter - candidateDiameter;\n      if (margin < 0) return { score: 0, className: \"over\", hardFail: true, margin: margin };\n      return {\n        score: marginScore(margin),\n        className: margin >= 1 ? \"good\" : \"tight\",\n        hardFail: false,\n        margin: margin,\n      };\n    }\n    \n    function capabilityFit(value) {\n      var score = scoreToken(value, {\n        confirmed: 1,\n        likely: 0.82,\n        absent: 0,\n        unknown: 0.58,\n      }, 0.58);\n      return {\n        score: score,\n        className: value || \"unknown\",\n        label: getCapabilityLabel(value),\n      };\n    }\n    \n    function openingFeasibility(startCondition, candidateConcept, capabilityClass, holeFitClass) {\n      if (capabilityClass === \"absent\") {\n        return { score: 0, className: \"not_credible\", label: getOpeningLabel(\"not_credible\") };\n      }\n      if (startCondition === \"existing_hole\" || startCondition === \"existing_opening\") {\n        return { score: 1, className: \"from_solid_ok\", label: \"Existing opening ready\" };\n      }\n      if (candidateConcept === \"indexable\") {\n        return { score: 0.28, className: \"predrill_required\", label: getOpeningLabel(\"predrill_required\") };\n      }\n      if (holeFitClass === \"poor\") {\n        return { score: 0.58, className: \"predrill_recommended\", label: getOpeningLabel(\"predrill_recommended\") };\n      }\n      return { score: 0.96, className: \"from_solid_ok\", label: getOpeningLabel(\"from_solid_ok\") };\n    }\n    \n    function rampAngleFit(requestedAngle, allowedAngle) {\n      var target = requestedAngle != null ? requestedAngle : 0.8;\n      var limit = allowedAngle != null ? allowedAngle : 1.2;\n      var score;\n    \n      if (target > limit) {\n        return {\n          score: 0,\n          className: \"too_steep\",\n          hardFail: true,\n          requestedAngle: target,\n          allowedAngle: limit,\n          label: getRampLabel(\"too_steep\"),\n        };\n      }\n    \n      score = target <= 1 ? 1 : 0.82;\n      return {\n        score: score,\n        className: target <= 1 ? \"good\" : \"high\",\n        hardFail: false,\n        requestedAngle: target,\n        allowedAngle: limit,\n        label: getRampLabel(target <= 1 ? \"good\" : \"high\"),\n      };\n    }\n    \n    function chipEvacuationSeverity(materialSeverityResult, coolantSupport, depthRatio, toolToHoleRatio) {\n      var coolantPenalty = scoreToken(coolantSupport, {\n        internal: 0.08,\n        external: 0.18,\n        air: 0.16,\n        unknown: 0.24,\n      }, 0.24);\n      var depthPenalty = clamp((depthRatio == null ? 0.6 : depthRatio) / 3, 0, 1);\n      var ratioPenalty = toolToHoleRatio == null ? 0.4 : toolToHoleRatio <= 0.65 ? 0.18 : toolToHoleRatio <= 0.8 ? 0.44 : toolToHoleRatio <= 0.92 ? 0.72 : 0.94;\n      var severity = clamp(materialSeverityResult.score * 0.42 + coolantPenalty * 0.26 + depthPenalty * 0.16 + ratioPenalty * 0.24, 0, 1);\n      var className = severity >= 0.8 ? \"critical\" : severity >= 0.6 ? \"high\" : severity >= 0.38 ? \"medium\" : \"low\";\n    \n      return {\n        severity: severity,\n        className: className,\n        label: getChipLabel(className),\n        score: scoreToken(className, { low: 1, medium: 0.84, high: 0.52, critical: 0.18 }, 0.52),\n      };\n    }\n    \n    function finishRequirement(finishStrategy, toleranceTarget) {\n      var className;\n      var score;\n      if (finishStrategy === \"opening_only\" && toleranceTarget !== \"tight\") {\n        className = \"no\";\n        score = 1;\n      } else if (finishStrategy === \"rough_plus_finish\" || toleranceTarget === \"general\") {\n        className = \"recommended\";\n        score = 0.76;\n      } else {\n        className = \"mandatory\";\n        score = 0.34;\n      }\n      return {\n        className: className,\n        label: getFinishLabel(className),\n        score: score,\n      };\n    }\n    \n    function machineFit(machineLimitClass, capabilityClass) {\n      var score = scoreToken(machineLimitClass, {\n        high_power: 0.82,\n        normal: 0.9,\n        low_power: 0.94,\n        low_rigidity: 0.9,\n        unknown: 0.72,\n      }, 0.72);\n      if (capabilityClass === \"absent\") score = clamp(score - 0.4, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.88 ? \"strong\" : score >= 0.7 ? \"usable\" : \"limited\",\n      };\n    }\n    \n    function drillAlternative(holeDiameterMm, depthRatio, finishStrategy, startCondition) {\n      if (holeDiameterMm == null || holeDiameterMm > 35) {\n        return { className: \"no\", label: getDrillAlternativeLabel(\"no\"), penalty: 0 };\n      }\n      if ((depthRatio != null && depthRatio >= 1.8) || (finishStrategy === \"opening_only\" && startCondition === \"from_solid\" && holeDiameterMm <= 25)) {\n        return { className: \"strong\", label: getDrillAlternativeLabel(\"strong\"), penalty: 0.26 };\n      }\n      if (depthRatio != null && depthRatio >= 1.1) {\n        return { className: \"possible\", label: getDrillAlternativeLabel(\"possible\"), penalty: 0.12 };\n      }\n      return { className: \"no\", label: getDrillAlternativeLabel(\"no\"), penalty: 0 };\n    }\n    \n    function helicalSuitability(inputs) {\n      var score = 0.14;\n      score += inputs.holeFitScore * 0.24;\n      score += inputs.openingFitScore * 0.16;\n      score += inputs.rampFitScore * 0.14;\n      score += inputs.capabilityScore * 0.14;\n      score += inputs.reachScore * 0.12;\n      score += inputs.chipControlScore * 0.1;\n      score += inputs.conceptScore * 0.06;\n      score += inputs.finishScore * 0.04;\n      score += inputs.machineScore * 0.04;\n      score += inputs.materialSeverityScore * 0.04;\n      score -= inputs.drillPenalty;\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.8 ? \"strong_case\" : score >= 0.6 ? \"valid_case\" : score >= 0.4 ? \"weak_case\" : \"not_credible\",\n        label: getSuitabilityLabel(score >= 0.8 ? \"strong_case\" : score >= 0.6 ? \"valid_case\" : score >= 0.4 ? \"weak_case\" : \"not_credible\"),\n      };\n    }\n    \n    function rpm(vc, diameter) {\n      return vc == null || diameter == null || diameter <= 0 ? null : (1000 * vc) / Math.PI / diameter;\n    }\n    \n    function feed(fz, spindleSpeed, z) {\n      return fz == null || spindleSpeed == null || z == null || z <= 0 ? null : fz * spindleSpeed * z;\n    }\n    \n    function mrr(ap, ae, vf) {\n      return ap == null || ae == null || vf == null ? null : (ap * ae * vf) / 1000;\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"ramping_helical_interpolation\", ctx, toolkits));\n      var startCondition = getAnswer(ctx, \"helical_start_condition\");\n      var finishStrategy = getAnswer(ctx, \"helical_finish_strategy\");\n      var rampAngle = toNullableNumber(getAnswer(ctx, \"helical_ramp_angle_deg\"));\n    \n      derived.condition_stage = \"roughing\";\n      derived.helical_start_condition_label = getStartConditionLabel(startCondition);\n      derived.helical_finish_strategy_label = getFinishStrategyLabel(finishStrategy);\n      derived.helical_capability_label = getCapabilityLabel(getAnswer(ctx, \"helical_capability_class\"));\n      derived.helical_coolant_support_label = getCoolantLabel(getAnswer(ctx, \"helical_coolant_support\"));\n      derived.helical_tolerance_target_label = getToleranceLabel(getAnswer(ctx, \"helical_tolerance_target\"));\n      derived.helical_machine_limit_label = getMachineLabel(getAnswer(ctx, \"helical_machine_limit_class\"));\n      derived.finish_split_required = finishStrategy === \"rough_plus_finish\" || finishStrategy === \"final_geometry\";\n      derived.helical_ramp_angle_deg = rampAngle == null ? 0.8 : rampAngle;\n      derived.entry_mode = startCondition === \"existing_hole\" || startCondition === \"existing_opening\" ? \"pre_opened\" : \"from_solid\";\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"ramping_helical_interpolation\", ctx);\n      var startCondition = getAnswer(ctx, \"helical_start_condition\");\n      var capabilityClass = getAnswer(ctx, \"helical_capability_class\");\n      var finishStrategy = getAnswer(ctx, \"helical_finish_strategy\");\n      var toleranceTarget = getAnswer(ctx, \"helical_tolerance_target\");\n    \n      if (capabilityClass === \"absent\") {\n        issues.push({\n          field: \"helical_capability_class\",\n          message: \"True helical interpolation needs a control and CAM path that can run the circular XY path with axial Z feed.\",\n          severity: \"warning\",\n          code: \"helical_capability_absent\",\n        });\n      }\n      if (startCondition === \"from_solid\" && getAnswer(ctx, \"helical_tool_concept_preference\") === \"indexable_only\") {\n        issues.push({\n          field: \"helical_tool_concept_preference\",\n          message: \"Indexable-only helical interpolation from solid usually needs a pre-opened feature or a more explicit ramp-down-capable tool route.\",\n          severity: \"warning\",\n          code: \"indexable_from_solid_warning\",\n        });\n      }\n      if (finishStrategy === \"final_geometry\" || toleranceTarget === \"tight\") {\n        issues.push({\n          field: \"helical_finish_strategy\",\n          message: \"Helical interpolation often opens or roughs the hole first. Treat final size and finish as a separate credibility check.\",\n          severity: \"warning\",\n          code: \"helical_finish_split_warning\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"ramping_helical_interpolation\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var holeDiameterMm = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var depthMm = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var startCondition = getAnswer(ctx, \"helical_start_condition\");\n      var finishStrategy = getAnswer(ctx, \"helical_finish_strategy\");\n      var capabilityClass = getAnswer(ctx, \"helical_capability_class\");\n      var materialCondition = getAnswer(ctx, \"material_condition_class\");\n      var coolantSupport = getAnswer(ctx, \"helical_coolant_support\");\n      var priority = getAnswer(ctx, \"priority\");\n      var explicitConcept = normalizeConceptPreference(getAnswer(ctx, \"helical_tool_concept_preference\"));\n      var requestedRampAngle = toNullableNumber(getAnswer(ctx, \"helical_ramp_angle_deg\"));\n      var maxToolDiameterMm = toNullableNumber(getAnswer(ctx, \"max_tool_diameter_mm\"));\n      var toleranceTarget = getAnswer(ctx, \"helical_tolerance_target\");\n      var machineLimitClass = getAnswer(ctx, \"helical_machine_limit_class\") || \"normal\";\n      var materialSeverityResult = materialSeverity(ctx, materialCondition);\n      var capabilityResult = capabilityFit(capabilityClass);\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var row = recipeResult.row || rows[0] || null;\n        var recipe = recipeResult.recipe || {};\n        var candidateDiameterMm = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var candidateUsableLengthMm = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var candidateApmxMm = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var candidateFluteCount = getCandidateFluteCount(candidate);\n        var allowedRampAngle = toNullableNumber(row && row.familyData && row.familyData.rampAngleMaxDeg);\n        var toolToHoleRatio = holeDiameterMm != null && candidateDiameterMm != null && holeDiameterMm > 0 ? candidateDiameterMm / holeDiameterMm : null;\n        var orbitDiameterMm = holeDiameterMm != null && candidateDiameterMm != null ? holeDiameterMm - candidateDiameterMm : null;\n        var orbitRadiusMm = orbitDiameterMm != null ? orbitDiameterMm / 2 : null;\n        var depthRatio = holeDiameterMm != null && holeDiameterMm > 0 && depthMm != null ? depthMm / holeDiameterMm : null;\n        var reachMarginMm = candidateUsableLengthMm != null && depthMm != null ? candidateUsableLengthMm - depthMm : null;\n        var apmxMarginMm = candidateApmxMm != null && depthMm != null ? candidateApmxMm - depthMm : null;\n        var maxDiameterResult = maxDiameterFit(candidateDiameterMm, maxToolDiameterMm);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var desiredConcept = deriveSuggestedConcept({\n          holeDiameterMm: holeDiameterMm,\n          startCondition: startCondition,\n          finishStrategy: finishStrategy,\n          toleranceTarget: toleranceTarget,\n          priority: priority,\n          depthRatio: depthRatio,\n          machineLimitClass: machineLimitClass,\n          materialSeverityScore: materialSeverityResult.score,\n        });\n        var conceptResult = conceptFit(candidateConcept, desiredConcept, explicitConcept);\n        var holeFit = holeRatioFit(toolToHoleRatio, candidateConcept, holeDiameterMm);\n        var openingFit = openingFeasibility(startCondition, candidateConcept, capabilityResult.className, holeFit.className);\n        var rampFit = rampAngleFit(requestedRampAngle, allowedRampAngle);\n        var chipSeverity = chipEvacuationSeverity(materialSeverityResult, coolantSupport, depthRatio, toolToHoleRatio);\n        var finishRequirementResult = finishRequirement(finishStrategy, toleranceTarget);\n        var machineResult = machineFit(machineLimitClass, capabilityResult.className);\n        var drillAlternativeResult = drillAlternative(holeDiameterMm, depthRatio, finishStrategy, startCondition);\n        var reachScore = average([marginScore(reachMarginMm), marginScore(apmxMarginMm), maxDiameterResult.score]);\n        var helicalResult = helicalSuitability({\n          holeFitScore: holeFit.score,\n          openingFitScore: openingFit.score,\n          rampFitScore: rampFit.score,\n          capabilityScore: capabilityResult.score,\n          reachScore: reachScore,\n          chipControlScore: chipSeverity.score,\n          conceptScore: conceptResult.score,\n          finishScore: finishRequirementResult.score,\n          machineScore: machineResult.score,\n          materialSeverityScore: materialSeverityResult.score,\n          drillPenalty: drillAlternativeResult.penalty,\n        });\n        var recipeVcTyp = toNullableNumber(recipe && recipe.vc && recipe.vc.typ);\n        var recipeVcMin = toNullableNumber(recipe && recipe.vc && recipe.vc.min);\n        var recipeVcMax = toNullableNumber(recipe && recipe.vc && recipe.vc.max);\n        var recipeFzTyp = toNullableNumber(recipe && recipe.fz && recipe.fz.typ);\n        var recipeFzMin = toNullableNumber(recipe && recipe.fz && recipe.fz.min);\n        var recipeFzMax = toNullableNumber(recipe && recipe.fz && recipe.fz.max);\n        var recipeApTyp = toNullableNumber(recipe && recipe.ap && recipe.ap.typ);\n        var recipeApMin = toNullableNumber(recipe && recipe.ap && recipe.ap.min);\n        var recipeApMax = toNullableNumber(recipe && recipe.ap && recipe.ap.max);\n        var recipeAePctTyp = toNullableNumber(recipe && recipe.aePct && recipe.aePct.typ);\n        var recipeAePctMin = toNullableNumber(recipe && recipe.aePct && recipe.aePct.min);\n        var recipeAePctMax = toNullableNumber(recipe && recipe.aePct && recipe.aePct.max);\n        var feedCorrectionFactor = holeDiameterMm != null && holeDiameterMm > 0 && orbitDiameterMm != null ? clamp(orbitDiameterMm / holeDiameterMm, 0, 1) : null;\n        var pitchPerRevMm = rampFit.requestedAngle != null && orbitDiameterMm != null && orbitDiameterMm > 0 ? Math.PI * orbitDiameterMm * Math.tan((rampFit.requestedAngle * Math.PI) / 180) : null;\n        var rpmTyp = rpm(recipeVcTyp, candidateDiameterMm);\n        var feedLinearMmMin = feed(recipeFzTyp, rpmTyp, candidateFluteCount);\n        var feedHelicalMmMin = feedLinearMmMin != null && feedCorrectionFactor != null ? feedLinearMmMin * feedCorrectionFactor : null;\n        var estimatedAeMm = candidateDiameterMm != null && recipeAePctTyp != null ? candidateDiameterMm * recipeAePctTyp / 100 : null;\n        var mrrTyp = mrr(depthMm, estimatedAeMm, feedHelicalMmMin);\n        var parts;\n        var hardRejectReason = null;\n        var total;\n        var confidenceBase;\n        var confidence;\n        var reasons = [];\n        var metrics;\n    \n        if (rows.length === 0) {\n          hardRejectReason = \"No milling row is available for helical interpolation.\";\n        }\n        if (!hardRejectReason && capabilityClass === \"absent\") {\n          hardRejectReason = \"True helical interpolation is not available on the current control or CAM setup.\";\n        }\n        if (!hardRejectReason && holeFit.hardFail) {\n          hardRejectReason = \"Tool diameter must stay below the target hole diameter for helical interpolation.\";\n        }\n        if (!hardRejectReason && maxDiameterResult.hardFail) {\n          hardRejectReason = \"Candidate diameter exceeds the stated maximum tool diameter.\";\n        }\n        if (!hardRejectReason && reachMarginMm != null && reachMarginMm < 0) {\n          hardRejectReason = \"Usable length is insufficient for the requested helical depth.\";\n        }\n        if (!hardRejectReason && apmxMarginMm != null && apmxMarginMm < 0) {\n          hardRejectReason = \"APMX is insufficient for the requested helical depth.\";\n        }\n        if (!hardRejectReason && rampFit.hardFail) {\n          hardRejectReason = \"Requested ramp angle exceeds the supported range for the available milling row.\";\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.1,\n          process: kernel.processFit(candidate, ctx) * 1.1,\n          holeRatio: holeFit.score * 1.8,\n          opening: openingFit.score * 1.35,\n          rampAngle: rampFit.score * 1.25,\n          reach: reachScore * 1.45,\n          toolConcept: conceptResult.score * 1.15,\n          chipControl: chipSeverity.score * 1.05,\n          capability: capabilityResult.score * 1.2,\n          finish: finishRequirementResult.score * 0.82,\n          machine: machineResult.score * 0.58,\n          priorityBias: scoreToken(priority, { safety: 0.22, balanced: 0.3, productivity: 0.34 }, 0.3),\n          riskPenalty: -(drillAlternativeResult.penalty + scoreToken(chipSeverity.className, { low: 0, medium: 0.03, high: 0.09, critical: 0.16 }, 0.06)),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidenceBase = recipeResult.source === \"exact\" ? 0.95 : recipeResult.source === \"near\" ? 0.82 : recipeResult.source === \"estimated\" ? 0.68 : 0.45;\n        confidence = hardRejectReason ? 0 : clamp(confidenceBase * capabilityResult.score * (finishRequirementResult.className === \"mandatory\" ? 0.84 : finishRequirementResult.className === \"recommended\" ? 0.92 : 1), 0.2, 0.97);\n    \n        if (holeFit.className === \"good\") reasons.push(\"The cutter-to-hole ratio leaves a believable orbital clearance for chip flow.\");\n        else if (holeFit.className === \"conditional\") reasons.push(\"The cutter still fits the target hole, but the orbital clearance is getting tight.\");\n        if (openingFit.className === \"from_solid_ok\") reasons.push(\"The current start condition still supports a credible helical entry from solid.\");\n        else if (openingFit.className === \"predrill_recommended\" || openingFit.className === \"predrill_required\") reasons.push(\"A pre-opened feature would make the helical route more credible.\");\n        if (rampFit.className === \"good\") reasons.push(\"The requested helix angle stays inside a conservative and row-backed range.\");\n        else if (rampFit.className === \"high\") reasons.push(\"The helix angle is still supported, but it is already above the gentlest good-practice zone.\");\n        if (chipSeverity.className === \"low\" || chipSeverity.className === \"medium\") reasons.push(\"Chip evacuation remains manageable for the current hole size, depth and coolant support.\");\n        else reasons.push(\"Chip evacuation is one of the main watch-outs for this hole-to-tool pairing.\");\n        if (conceptResult.className === \"strong\" || conceptResult.className === \"usable\") reasons.push(\"The tool concept lines up with the likely hole size and entry strategy.\");\n        if (drillAlternativeResult.className === \"strong\") reasons.push(\"A standard drilling route may still be the more direct option for this mainly axial hole-making task.\");\n        if (finishRequirementResult.className === \"mandatory\") reasons.push(\"The requested final hole quality should stay split from the opening helix.\");\n        reasons = reasons.slice(0, 5);\n    \n        metrics = Object.assign({}, millingTools.getSharedMetrics(candidate, ctx), {\n          requestedHoleDiameterMm: holeDiameterMm,\n          requestedDepthMm: depthMm,\n          requestedStartCondition: startCondition,\n          requestedStartConditionLabel: getStartConditionLabel(startCondition),\n          requestedFinishStrategy: finishStrategy,\n          requestedFinishStrategyLabel: getFinishStrategyLabel(finishStrategy),\n          requestedCapabilityClass: capabilityClass,\n          requestedCapabilityLabel: capabilityResult.label,\n          requestedCoolantSupport: coolantSupport,\n          requestedCoolantSupportLabel: getCoolantLabel(coolantSupport),\n          requestedToleranceTarget: toleranceTarget,\n          requestedToleranceLabel: getToleranceLabel(toleranceTarget),\n          requestedMachineLimitClass: machineLimitClass,\n          requestedMachineLimitLabel: getMachineLabel(machineLimitClass),\n          requestedPriority: priority,\n          requestedRampAngleDeg: rampFit.requestedAngle,\n          rampAngleMaxDeg: rampFit.allowedAngle,\n          rampAngleFitClass: rampFit.className,\n          rampAngleFitLabel: rampFit.label,\n          candidateDiameterMm: candidateDiameterMm,\n          candidateUsableLengthMm: candidateUsableLengthMm,\n          candidateApmxMm: candidateApmxMm,\n          candidateFluteCount: candidateFluteCount,\n          candidateConcept: candidateConcept,\n          candidateConceptLabel: getConceptLabel(candidateConcept),\n          toolToHoleRatio: toolToHoleRatio,\n          orbitDiameterMm: orbitDiameterMm,\n          orbitRadiusMm: orbitRadiusMm,\n          pitchPerRevMm: pitchPerRevMm,\n          feedCorrectionFactor: feedCorrectionFactor,\n          depthRatio: depthRatio,\n          holeFeasibilityClass: holeFit.className,\n          holeFeasibilityLabel: getHoleFeasibilityLabel(holeFit.className),\n          openingFitClass: openingFit.className,\n          openingFitLabel: openingFit.label,\n          reachMarginMm: reachMarginMm,\n          apmxMarginMm: apmxMarginMm,\n          maxToolDiameterMm: maxToolDiameterMm,\n          maxToolDiameterMarginMm: maxDiameterResult.margin,\n          toolConceptDesired: desiredConcept,\n          toolConceptDesiredLabel: getConceptLabel(desiredConcept),\n          toolConceptFitClass: conceptResult.className,\n          helicalCapabilityClass: capabilityResult.className,\n          helicalCapabilityLabel: capabilityResult.label,\n          chipEvacuationSeverityClass: chipSeverity.className,\n          chipEvacuationSeverityLabel: chipSeverity.label,\n          finishSplitClass: finishRequirementResult.className,\n          finishSplitLabel: finishRequirementResult.label,\n          drillAlternativeClass: drillAlternativeResult.className,\n          drillAlternativeLabel: drillAlternativeResult.label,\n          helicalSuitabilityClass: helicalResult.className,\n          helicalSuitabilityLabel: helicalResult.label,\n          machineWindowClass: machineResult.className,\n          recipeVcMin: recipeVcMin,\n          recipeVcTyp: recipeVcTyp,\n          recipeVcMax: recipeVcMax,\n          recipeFzMin: recipeFzMin,\n          recipeFzTyp: recipeFzTyp,\n          recipeFzMax: recipeFzMax,\n          recipeApMin: recipeApMin,\n          recipeApTyp: recipeApTyp,\n          recipeApMax: recipeApMax,\n          recipeAePctMin: recipeAePctMin,\n          recipeAePctTyp: recipeAePctTyp,\n          recipeAePctMax: recipeAePctMax,\n          rpmTyp: rpmTyp,\n          feedLinearMmMin: feedLinearMmMin,\n          feedHelicalMmMin: feedHelicalMmMin,\n          estimatedAeMm: estimatedAeMm,\n          mrrTyp: mrrTyp,\n        });\n        Object.assign(metrics, recipeResult.debug || {});\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total >= 4.8 && helicalResult.className !== \"not_credible\",\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: reasons,\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/reaming/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/reaming/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/reaming/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/reaming/presenter.js\");\n    exports.default = createStubProcessModule(\"reaming\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/reaming/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, heroRecommendation, holeSummary, recipeStartValues, riskNotes, toleranceNotes } = __bundle.require(\"core/result-blocks.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function compactBlocks(blocks) {\n      return blocks.filter(function keep(block) {\n        var data = block && block.data || {};\n        if (Array.isArray(data.items)) return data.items.length > 0;\n        if (Array.isArray(data.notes)) return data.notes.length > 0;\n        if (Array.isArray(data.values)) return data.values.length > 0;\n        return true;\n      });\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var riskItems = [];\n    \n      if (String(getAnswer(ctx, \"pre_hole_status\") || \"\") !== \"to_size\") {\n        riskItems.push({ severity: \"warning\", title: \"Pre-hole quality\", message: \"Reaming quality depends strongly on pre-hole quality and allowance control.\" });\n      }\n      if (String(getAnswer(ctx, \"blind_through\") || \"\") === \"blind\") {\n        riskItems.push({ severity: \"warning\", title: \"Blind reaming\", message: \"Blind reaming needs careful chip evacuation and bottom control.\" });\n      }\n    \n      return createResultViewModel({\n        processId: \"reaming\",\n        outcome: top.score.total >= 4 ? \"match\" : \"limited_match\",\n        summary: \"Best reaming match based on allowance, tolerance target and pre-hole quality.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: compactBlocks([\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 3),\n          }),\n          holeSummary({\n            diameterMm: getAnswer(ctx, \"feature_diameter_mm\"),\n            depthMm: getAnswer(ctx, \"feature_depth_mm\"),\n            depthRatio: null,\n            entryCondition: null,\n            exitCondition: null,\n            blindThrough: getAnswer(ctx, \"blind_through\"),\n          }),\n          fitKpis([\n            { key: \"allowance\", label: \"Allowance fit\", value: (top.score.parts.allowance || 0).toFixed(2), status: (top.score.parts.allowance || 0) >= 1.2 ? \"good\" : \"ok\" },\n            { key: \"tolerance\", label: \"Tolerance fit\", value: (top.score.parts.tolerance || 0).toFixed(2), status: (top.score.parts.tolerance || 0) >= 0.75 ? \"good\" : \"ok\" },\n            { key: \"finish\", label: \"Finish confidence\", value: (top.score.parts.finish || 0).toFixed(2), status: (top.score.parts.finish || 0) >= 0.75 ? \"good\" : \"weak\" },\n            { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.75 ? \"good\" : \"ok\" },\n          ]),\n          toleranceNotes([\n            \"Tolerance target: \" + String(getAnswer(ctx, \"hole_tolerance\") || \"not specified\"),\n            \"Pre-hole status: \" + String(getAnswer(ctx, \"pre_hole_status\") || \"not specified\"),\n          ]),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: [\n              { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n              { key: \"fn\", label: \"fn\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n            ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n          }),\n          riskNotes(riskItems),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative reaming option\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ]),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust reaming data\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/reaming/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"reaming\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/reaming/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function tokenScore(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function getAllowanceWindow(targetDiameter) {\n      if (targetDiameter == null) return null;\n      if (targetDiameter <= 6) return { min: 0.08, max: 0.2 };\n      if (targetDiameter <= 12) return { min: 0.1, max: 0.25 };\n      return { min: 0.12, max: 0.3 };\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"reaming\", ctx, toolkits));\n      var targetDiameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var preHoleDiameter = toNullableNumber(getAnswer(ctx, \"pre_hole_diameter\"));\n      var blindThrough = getAnswer(ctx, \"blind_through\");\n      var allowance = targetDiameter != null && preHoleDiameter != null ? targetDiameter - preHoleDiameter : null;\n    \n      derived.allowance_window = allowance;\n      derived.reaming_mode = blindThrough === \"blind\" ? \"blind_reaming\" : \"through_reaming\";\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"reaming\", ctx);\n      var targetDiameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var preHoleDiameter = toNullableNumber(getAnswer(ctx, \"pre_hole_diameter\"));\n      var allowanceWindow = targetDiameter != null ? getAllowanceWindow(targetDiameter) : null;\n      var allowance = targetDiameter != null && preHoleDiameter != null ? targetDiameter - preHoleDiameter : null;\n    \n      if (allowance != null && allowance <= 0) {\n        issues.push({\n          field: \"pre_hole_diameter\",\n          message: \"Pre-hole diameter must stay below the target reaming diameter.\",\n          severity: \"error\",\n          code: \"reaming_allowance_negative\",\n        });\n      }\n      if (allowance != null && allowanceWindow && (allowance < allowanceWindow.min || allowance > allowanceWindow.max)) {\n        issues.push({\n          field: \"pre_hole_diameter\",\n          message: \"Allowance sits outside the preferred reaming window for the requested diameter.\",\n          severity: \"warning\",\n          code: \"reaming_allowance_window\",\n        });\n      }\n    \n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"reaming\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var drillingTools = toolkits.drilling;\n      var targetDiameter = toNullableNumber(getAnswer(ctx, \"feature_diameter_mm\"));\n      var preHoleDiameter = toNullableNumber(getAnswer(ctx, \"pre_hole_diameter\"));\n      var holeTolerance = getAnswer(ctx, \"hole_tolerance\");\n      var preHoleStatus = getAnswer(ctx, \"pre_hole_status\");\n      var blindThrough = getAnswer(ctx, \"blind_through\");\n      var allowanceWindow = targetDiameter != null ? getAllowanceWindow(targetDiameter) : null;\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = drillingTools.resolveRows(candidate, ctx);\n        var recipeResult = drillingTools.resolveRecipe(candidate, ctx);\n        var diameterFit = targetDiameter != null ? kernel.diameterFit(candidate, targetDiameter) : 0;\n        var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n        var reachScore = depth != null ? kernel.reachFit(candidate, depth) : 0.8;\n        var allowance = targetDiameter != null && preHoleDiameter != null ? targetDiameter - preHoleDiameter : null;\n        var allowanceFit = allowance != null && allowanceWindow\n          ? (allowance >= allowanceWindow.min && allowance <= allowanceWindow.max\n            ? 1\n            : allowance > 0\n              ? Math.max(0.2, 1 - Math.abs(allowance - ((allowanceWindow.min + allowanceWindow.max) / 2)) / allowanceWindow.max)\n              : 0)\n          : 0.4;\n        var toleranceFit = tokenScore(holeTolerance, { tight: 1, medium: 0.75, general: 0.55 }, 0.55);\n        var finishConfidence = tokenScore(preHoleStatus, { to_size: 1, semi: 0.75, rough: 0.35, unknown: 0.45 }, 0.45);\n        var coolantScore = candidate.common.coolantTsc ? 0.8 : 0.45;\n        var setupScore = blindThrough === \"through\" ? 0.8 : 0.65;\n        var hardRejectReason = null;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (rows.length === 0) {\n          hardRejectReason = \"No drilling row is available for reaming.\";\n        }\n        if (!hardRejectReason && targetDiameter != null && diameterFit < 0.75) {\n          hardRejectReason = \"Candidate diameter does not match the requested reaming size closely enough.\";\n        }\n        if (!hardRejectReason && (preHoleStatus === \"rough\" || preHoleStatus === \"unknown\")) {\n          hardRejectReason = \"Pre-hole quality is not sufficient for a stable reaming recommendation.\";\n        }\n        if (!hardRejectReason && (allowance == null || allowance <= 0 || (allowanceWindow && (allowance < allowanceWindow.min || allowance > allowanceWindow.max)))) {\n          hardRejectReason = \"Pre-hole allowance is outside the supported reaming window.\";\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          tolerance: toleranceFit,\n          allowance: allowanceFit * 1.5,\n          finish: finishConfidence,\n          coolant: coolantScore,\n          setup: setupScore,\n          rowMatch: rows.length > 0 ? 1 : 0,\n          riskPenalty: -kernel.risk(candidate, ctx),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.93 : recipeResult.source === \"near\" ? 0.8 : 0.55;\n        if (hardRejectReason) confidence = 0;\n    \n        metrics = Object.assign({}, drillingTools.getSharedMetrics(candidate, ctx), {\n          allowance: allowance,\n          allowanceWindow: allowanceWindow,\n          holeTolerance: holeTolerance,\n          preHoleStatus: preHoleStatus,\n          reamingMode: ctx.derived && ctx.derived.reaming_mode,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            allowanceFit >= 0.8 ? \"Pre-hole allowance fits a stable reaming window.\" : \"Allowance is workable but narrow for reaming.\",\n            toleranceFit >= 0.8 ? \"The candidate supports the requested tolerance target.\" : \"Tolerance target is feasible with tighter process control.\",\n            finishConfidence >= 0.75 ? \"Pre-hole quality supports finish-oriented reaming.\" : \"Pre-hole quality is the main limit for reaming confidence.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/shoulder-milling/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/shoulder-milling/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/shoulder-milling/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/shoulder-milling/presenter.js\");\n    exports.default = createStubProcessModule(\"shoulder_milling\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/shoulder-milling/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(0);\n    }\n    \n    function cleanText(value) {\n      return String(value || \"\").replace(/\\s+/g, \" \").trim();\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = cleanText(item);\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative shoulder-milling option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      var items = [];\n    \n      if (metrics.slottingDriftFlag) {\n        items.push({\n          severity: \"warning\",\n          title: \"Process boundary\",\n          message: \"The requested engagement is drifting toward slotting rather than a clean open shoulder. Review whether this should stay in shoulder_milling.\",\n        });\n      }\n      if (metrics.true90ConfidenceClass === \"uncertain\") {\n        items.push({\n          severity: \"warning\",\n          title: \"True 90 confidence\",\n          message: \"The current cutter geometry does not cleanly prove a finish-critical true 90 degree shoulder under these conditions.\",\n        });\n      }\n      if (metrics.chatterRiskClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Stability\",\n          message: \"Thin-wall, reach or interruption risk pushes chatter high. Release the shoulder with reduced engagement and the shortest setup possible.\",\n        });\n      }\n      if (metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Machine load\",\n          message: \"The combined ap, ae and material severity push machine load high for a shoulder cut. Keep the first release conservative.\",\n        });\n      }\n      if (metrics.coolantSupportClass === \"limited\" || metrics.coolantSupportClass === \"unknown\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Coolant support\",\n          message: \"Coolant or lubrication support is not the main filter, but it still narrows surface and stability confidence in this shoulder case.\",\n        });\n      }\n      if (metrics.cutInterruption === \"heavy\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Interrupted skin\",\n          message: \"Heavy interruption or scale raises edge-chipping risk and argues for a calmer shoulder strategy.\",\n        });\n      }\n    \n      return items.slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"load\",\n          label: \"Machine load\",\n          result: metrics.machineLoadSeverityClass === \"light\" || metrics.machineLoadSeverityClass === \"normal\" ? \"pass\" : metrics.machineLoadSeverityClass === \"high\" ? \"limited\" : \"fail\",\n          note: \"Load class: \" + titleCase(metrics.machineLoadSeverityClass || \"review\") + \".\",\n        },\n        {\n          key: \"coolant\",\n          label: \"Coolant route\",\n          result: metrics.coolantSupportClass === \"strong\" || metrics.coolantSupportClass === \"acceptable\" ? \"pass\" : metrics.coolantSupportClass === \"limited\" ? \"limited\" : \"unknown\",\n          note: \"Support class: \" + titleCase(metrics.coolantSupportClass || \"unknown\") + \".\",\n        },\n        {\n          key: \"stability\",\n          label: \"Stability\",\n          result: metrics.chatterRiskClass === \"low\" ? \"pass\" : metrics.chatterRiskClass === \"medium\" ? \"limited\" : \"fail\",\n          note: \"Chatter risk: \" + titleCase(metrics.chatterRiskClass || \"review\") + \".\",\n        },\n      ];\n    }\n    \n    function buildFeatureItems(ctx, top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"ap\", label: \"Shoulder height ap\", value: metrics.requestedShoulderHeightMm != null ? formatDisplayNumber(metrics.requestedShoulderHeightMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"ae\", label: \"Shoulder width ae\", value: metrics.requestedShoulderWidthMm != null ? formatDisplayNumber(metrics.requestedShoulderWidthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"access\", label: \"Access\", value: titleCase(metrics.requestedAccessLabel || getAnswer(ctx, \"shoulder_access\") || \"review\") },\n        { key: \"true90\", label: \"Shoulder fidelity\", value: metrics.requestedShoulder90Label || \"Review\" },\n        { key: \"corner\", label: \"Corner requirement\", value: metrics.cornerRequirementLabel || \"Review\" },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      var items = [\n        {\n          key: \"engagement\",\n          label: \"Requested ae %\",\n          actual: metrics.requestedAePct != null ? formatDisplayNumber(metrics.requestedAePct, 1) + \" %\" : null,\n          target: metrics.recipeAePctMax != null ? \"<= \" + formatDisplayNumber(metrics.recipeAePctMax, 1) + \" %\" : null,\n          result: metrics.recipeAeFitClass === \"good\" || metrics.recipeAeFitClass === \"light\" ? \"fit\" : metrics.recipeAeFitClass === \"conditional\" ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"reach\",\n          label: \"Usable length vs ap\",\n          actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null,\n          target: metrics.requestedShoulderHeightMm != null ? formatDisplayNumber(metrics.requestedShoulderHeightMm, 2) + \" mm\" : null,\n          result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n        {\n          key: \"apmx\",\n          label: \"APMX vs ap\",\n          actual: metrics.candidateApmxMm != null ? formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm\" : null,\n          target: metrics.requestedShoulderHeightMm != null ? formatDisplayNumber(metrics.requestedShoulderHeightMm, 2) + \" mm\" : null,\n          result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n        {\n          key: \"corner_radius\",\n          label: \"Corner radius\",\n          actual: metrics.candidateCornerRadiusMm != null ? formatDisplayNumber(metrics.candidateCornerRadiusMm, 2) + \" mm\" : null,\n          target: metrics.allowedCornerRadiusMm != null ? \"<= \" + formatDisplayNumber(metrics.allowedCornerRadiusMm, 2) + \" mm\" : metrics.cornerRequirementLabel || null,\n          result: metrics.cornerRadiusFit ? \"fit\" : \"mismatch\",\n        },\n      ];\n    \n      if (metrics.maxToolDiameterMm != null) {\n        items.unshift({\n          key: \"clearance\",\n          label: \"Clearance diameter\",\n          actual: metrics.candidateDiameterMm != null ? formatDisplayNumber(metrics.candidateDiameterMm, 2) + \" mm\" : null,\n          target: \"<= \" + formatDisplayNumber(metrics.maxToolDiameterMm, 2) + \" mm\",\n          result: metrics.candidateDiameterMm != null && metrics.candidateDiameterMm <= metrics.maxToolDiameterMm ? \"fit\" : \"mismatch\",\n        });\n      } else {\n        items.unshift({\n          key: \"tool_diameter\",\n          label: \"Selected tool diameter\",\n          actual: metrics.candidateDiameterMm != null ? formatDisplayNumber(metrics.candidateDiameterMm, 2) + \" mm\" : null,\n          target: null,\n          result: \"fit\",\n        });\n      }\n    \n      return items;\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"engagement_fit\",\n          label: \"Engagement fit\",\n          value: formatDisplayNumber((metrics.recipeApFitScore + metrics.recipeAeFitScore) / 2, 2) || \"n/a\",\n          status: metrics.recipeApFitClass === \"good\" && metrics.recipeAeFitClass === \"good\" ? \"good\" : \"ok\",\n        },\n        {\n          key: \"reach\",\n          label: \"Reach reserve\",\n          value: formatDisplayNumber(metrics.reachReserveScore, 2) || \"n/a\",\n          status: metrics.reachReserveScore >= 0.8 ? \"good\" : metrics.reachReserveScore >= 0.6 ? \"ok\" : \"weak\",\n        },\n        {\n          key: \"true90\",\n          label: \"True 90 confidence\",\n          value: titleCase(metrics.true90ConfidenceClass || \"review\"),\n          status: metrics.true90ConfidenceClass === \"high\" ? \"good\" : metrics.true90ConfidenceClass === \"medium\" ? \"ok\" : \"weak\",\n        },\n        {\n          key: \"stability\",\n          label: \"Chatter risk\",\n          value: titleCase(metrics.chatterRiskClass || \"review\"),\n          status: metrics.chatterRiskClass === \"low\" ? \"good\" : metrics.chatterRiskClass === \"medium\" ? \"ok\" : \"weak\",\n        },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) {\n          return item.min != null || item.typ != null || item.max != null;\n        }),\n      });\n    \n      block.data.presentation = {\n        kicker: \"Start values\",\n        rowBackedValues: [\n          { label: \"Row stage\", value: titleCase(metrics.rowConditionStage || \"review\"), tone: \"text\" },\n          { label: \"Recipe ap fit\", value: titleCase(metrics.recipeApFitClass || \"review\"), tone: \"text\" },\n          { label: \"Recipe ae fit\", value: titleCase(metrics.recipeAeFitClass || \"review\"), tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"ap typ\", value: formatDisplayNumber(metrics.recipeApTyp, 2) || \"n/a\", unit: \"mm\" },\n          { label: \"ae typ\", value: formatDisplayNumber(metrics.recipeAePctTyp, 1) || \"n/a\", unit: \"%\" },\n        ],\n        machineValues: [\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n        ],\n      };\n    \n      return block;\n    }\n    \n    function buildSetupBlock(ctx, top, riskItems) {\n      var metrics = top.metrics || {};\n      var notes = [\n        { area: \"access\", message: \"Access class: \" + titleCase(metrics.requestedAccessLabel || getAnswer(ctx, \"shoulder_access\") || \"review\") },\n        { area: \"stability\", message: \"Setup stability: \" + titleCase(getAnswer(ctx, \"setup_stability\") || \"review\") },\n        { area: \"geometry\", message: \"Tool concept bias: \" + titleCase(metrics.toolConceptDesired || \"either\") + \" / candidate reads as \" + titleCase(metrics.toolConceptGuess || \"either\") },\n      ];\n    \n      if (metrics.maxToolDiameterMm != null) {\n        notes.push({ area: \"access\", message: \"Max cutter diameter input: \" + formatDisplayNumber(metrics.maxToolDiameterMm, 2) + \" mm\" });\n      }\n      if (metrics.reachRequirementMm != null && metrics.reachRequirementMm !== metrics.requestedShoulderHeightMm) {\n        notes.push({ area: \"reach\", message: \"Explicit reach requirement: \" + formatDisplayNumber(metrics.reachRequirementMm, 2) + \" mm\" });\n      }\n    \n      var block = setupNotes(notes);\n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Engagement\",\n            highlight: \"The recommendation is driven mainly by ap/ae recipe fit, corner-radius credibility, access and reach reserve rather than by generic milling defaults.\",\n            items: dedupeTextItems([\n              metrics.recipeApFitClass === \"good\" ? \"Requested shoulder height stays inside the row-based ap window.\" : null,\n              metrics.recipeAeFitClass === \"good\" ? \"Requested radial engagement stays inside the row-based ae window.\" : null,\n              metrics.cornerRadiusFit ? \"Corner radius stays inside the allowed shoulder-root limit.\" : null,\n              metrics.accessFitClass === \"good\" ? \"Access still supports a stable shoulder pass.\" : null,\n            ]).slice(0, 3),\n          },\n          how: {\n            title: \"How to start\",\n            tone: \"default\",\n            badge: \"First release\",\n            highlight: \"Release the shoulder from the row-backed vc and fz band, then qualify wall fidelity and chatter before opening productivity.\",\n            items: dedupeTextItems([\n              metrics.recipeVcTyp != null ? \"Start near vc typ \" + formatDisplayNumber(metrics.recipeVcTyp, 0) + \" m/min.\" : null,\n              metrics.recipeFzTyp != null ? \"Use fz typ \" + formatDisplayNumber(metrics.recipeFzTyp, 3) + \" mm/tooth as the first feed basis.\" : null,\n              metrics.chatterRiskClass !== \"low\" ? \"Keep overhang short and reduce engagement before pushing output.\" : null,\n              metrics.true90ConfidenceClass !== \"high\" ? \"Inspect the first shoulder wall before treating true 90 degree fidelity as released.\" : null,\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: metrics.slottingDriftFlag\n              ? \"This engagement is close to slotting behavior.\"\n              : \"The main risks are shoulder fidelity, chatter and machine load under real engagement.\",\n            items: dedupeTextItems([\n              metrics.slottingDriftFlag ? \"The cut is drifting toward slotting.\" : null,\n              metrics.true90ConfidenceClass === \"uncertain\" ? \"True 90 degree fidelity is not cleanly proven.\" : null,\n              metrics.machineLoadSeverityClass === \"high\" || metrics.machineLoadSeverityClass === \"critical\" ? \"Machine load is the release limiter.\" : null,\n              metrics.cutInterruption === \"heavy\" ? \"Interrupted skin raises chipping risk.\" : null,\n            ]).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"Shoulder fidelity\",\n            tone: metrics.true90ConfidenceClass === \"high\" ? \"good\" : metrics.true90ConfidenceClass === \"medium\" ? \"default\" : \"watch\",\n            badge: metrics.requestedShoulder90Label || \"Review\",\n            value: metrics.true90ConfidenceClass === \"high\"\n              ? \"The current cutter geometry looks credible for the requested shoulder fidelity.\"\n              : metrics.true90ConfidenceClass === \"medium\"\n                ? \"The cutter can likely support the shoulder, but wall fidelity should be qualified on the first part.\"\n                : \"The shoulder asks for a more exact 90 degree capability than the current data can confidently prove.\",\n            note: metrics.cornerRequirementLabel || null,\n            items: dedupeTextItems([\n              metrics.candidateCornerRadiusMm != null ? \"Candidate corner radius: \" + formatDisplayNumber(metrics.candidateCornerRadiusMm, 2) + \" mm.\" : null,\n              metrics.allowedCornerRadiusMm != null ? \"Allowed radius: \" + formatDisplayNumber(metrics.allowedCornerRadiusMm, 2) + \" mm.\" : null,\n              metrics.toolConceptDesired ? \"Preferred concept: \" + titleCase(metrics.toolConceptDesired) + \".\" : null,\n            ]),\n          },\n          {\n            title: \"Reach & accessibility\",\n            tone: metrics.accessFitClass === \"good\" ? \"good\" : metrics.accessFitClass === \"conditional\" ? \"default\" : \"watch\",\n            badge: titleCase(metrics.accessFitClass || \"review\"),\n            value: metrics.accessFitClass === \"good\"\n              ? \"Diameter, reach and neck geometry still look workable for the stated shoulder access.\"\n              : metrics.accessFitClass === \"conditional\"\n                ? \"The shoulder is still accessible, but the release window is narrower than an open shoulder case.\"\n                : \"Access is a major constraint and needs a smaller or more reach-friendly shoulder route.\",\n            note: dedupeTextItems([\n              metrics.reachMarginMm != null ? \"Usable-length margin \" + formatDisplayNumber(metrics.reachMarginMm, 2) + \" mm\" : null,\n              metrics.apmxMarginMm != null ? \"APMX margin \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm\" : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.maxToolDiameterMm != null ? \"Clearance limit: \" + formatDisplayNumber(metrics.maxToolDiameterMm, 2) + \" mm.\" : null,\n              metrics.candidateNeckDiameterMm != null ? \"Neck diameter: \" + formatDisplayNumber(metrics.candidateNeckDiameterMm, 2) + \" mm.\" : null,\n              metrics.reachRequirementMm != null ? \"Reach requirement: \" + formatDisplayNumber(metrics.reachRequirementMm, 2) + \" mm.\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Chatter control\",\n            tone: metrics.chatterRiskClass === \"high\" ? \"high\" : metrics.chatterRiskClass === \"medium\" ? \"watch\" : \"default\",\n            actions: dedupeTextItems([\n              \"Keep the shortest possible gauge length.\",\n              \"Reduce ae or split the shoulder into calmer passes if the wall starts to sing.\",\n              \"Improve holder and clamping rigidity before chasing vc.\",\n            ]),\n          },\n          {\n            title: \"Boundary review\",\n            tone: metrics.slottingDriftFlag || metrics.true90ConfidenceClass === \"uncertain\" ? \"watch\" : \"default\",\n            actions: dedupeTextItems([\n              metrics.slottingDriftFlag ? \"Review whether the cut should move to slotting logic.\" : \"Keep the cut inside a real shoulder engagement window.\",\n              metrics.true90ConfidenceClass === \"uncertain\" ? \"Qualify wall fidelity on the first part before releasing true 90 degree claims.\" : \"Use the first shoulder wall as a reference check.\",\n              metrics.cutInterruption === \"heavy\" ? \"Treat the first interrupted passes as an edge-chipping check.\" : null,\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var riskItems;\n      var alternativeItems;\n      var heroBlock;\n      var featureBlock;\n      var geometryBlock;\n      var fitBlock;\n      var recipeBlock;\n      var machineBlock;\n      var setupBlock;\n      var riskBlock;\n      var alternativesBlock;\n      var bundleBlock;\n      var commerceBlock;\n      var metrics;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"shoulder_milling\",\n          outcome: \"no_match\",\n          summary: \"No credible shoulder-milling recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current shoulder-milling inputs do not support a credible recommendation.\"),\n            noMatchGuidance({\n              message: \"Check shoulder height ap, shoulder width ae, access limits, allowed corner radius and whether the cut is still a real shoulder case instead of drifting toward slotting or a split roughing/finishing route.\",\n              steps: [\n                \"Confirm the real shoulder height ap and radial engagement ae per pass.\",\n                \"Clarify whether the shoulder needs a true 90 degree finished wall or only a roughing shoulder.\",\n                \"Check the allowed corner radius at the shoulder root.\",\n                \"Add a clearance limit or reach value when access is wall-near or cavity-critical.\",\n                \"Move to slotting or a split roughing-plus-finish route when the engagement no longer behaves like a clean shoulder pass.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust shoulder setup\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      bundleBlock = buildMillingBundleRecommendation(candidate);\n      riskItems = buildRiskItems(top);\n      alternativeItems = buildAlternativeItems(scored);\n    \n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best shoulder-milling fit for \" + (metrics.requestedShoulderHeightMm != null ? formatDisplayNumber(metrics.requestedShoulderHeightMm, 2) + \" mm ap\" : \"the requested shoulder\") + \" and \" + (metrics.requestedShoulderWidthMm != null ? formatDisplayNumber(metrics.requestedShoulderWidthMm, 2) + \" mm ae\" : \"the stated ae\") + \".\",\n        headerPills: [\n          { tone: \"good\", text: \"Best fit\" },\n          { tone: metrics.true90ConfidenceClass === \"high\" ? \"good\" : metrics.true90ConfidenceClass === \"medium\" ? \"default\" : \"watch\", text: \"True 90: \" + titleCase(metrics.true90ConfidenceClass || \"review\") },\n          { tone: metrics.chatterRiskClass === \"low\" ? \"good\" : metrics.chatterRiskClass === \"medium\" ? \"default\" : \"watch\", text: \"Chatter: \" + titleCase(metrics.chatterRiskClass || \"review\") },\n          { tone: metrics.slottingDriftFlag ? \"watch\" : \"default\", text: metrics.slottingDriftFlag ? \"Boundary: Slotting drift\" : \"Boundary: Shoulder stays clean\" },\n        ],\n      };\n    \n      featureBlock = featureSummary(buildFeatureItems(ctx, top));\n      geometryBlock = geometryFit(buildGeometryItems(top));\n      fitBlock = fitKpis(buildFitItems(top));\n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      setupBlock = buildSetupBlock(ctx, top, riskItems);\n      riskBlock = riskNotes(riskItems);\n      alternativesBlock = alternatives(alternativeItems);\n      commerceBlock = commerceCta(Object.assign({\n        productUrl: candidate.catalog.url,\n        available: candidate.commerce.available,\n        priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n        ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n      }, buildMillingCompositeCommerceData(candidate) || {}));\n    \n      return createResultViewModel({\n        processId: \"shoulder_milling\",\n        outcome: top.score.total >= 8.4 ? \"match\" : \"limited_match\",\n        summary: \"Best shoulder-milling result based on engagement fit, corner-radius fidelity, access and stability.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          bundleBlock,\n          featureBlock,\n          geometryBlock,\n          fitBlock,\n          recipeBlock,\n          machineBlock,\n          setupBlock,\n          riskBlock,\n          alternativesBlock,\n          commerceBlock,\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust shoulder inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/shoulder-milling/questions.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { getQuestionDefinition } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function cloneQuestion(questionId, overrides) {\n      return createQuestionDef(Object.assign({}, getQuestionDefinition(questionId), overrides || {}));\n    }\n    \n    function getQuestions() {\n      return [\n        cloneQuestion(\"wall_height_mm\", {\n          label: \"How high is the shoulder in axial depth (ap)?\",\n          helpText: \"Why it matters: shoulder height is the main axial load input and drives reach margin, APMX fit and how stable the shoulder pass will stay.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"feature_width_mm\", {\n          label: \"How wide is the shoulder engagement in radial width (ae)?\",\n          helpText: \"Why it matters: shoulder milling lives on ae together with ap. The requested ae becomes an ae percent request against every cutter diameter and row recipe.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"shoulder_access\", {\n          label: \"How open or constrained is the shoulder area?\",\n          helpText: \"Why it matters: accessibility decides whether we can stay with a broad productive shoulder cutter or need a narrower, more reach-friendly and wall-safe solution.\",\n          type: \"chips\",\n          options: [\n            { value: \"open\", label: \"Open shoulder\" },\n            { value: \"semi_open\", label: \"Semi-open\" },\n            { value: \"wall_fixture_near\", label: \"Near wall / fixture\" },\n            { value: \"deep_reach\", label: \"Deep / reach-critical\" },\n            { value: \"slot_like\", label: \"Almost slot-like\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"shoulder_90_required\", {\n          label: \"What 90 degree fidelity does the shoulder really need?\",\n          helpText: \"Why it matters: a finish-critical true 90 degree shoulder is a different recommendation problem than a roughing pass where close-to-90 is acceptable.\",\n          type: \"chips\",\n          options: [\n            { value: \"true_90_finish_critical\", label: \"True 90 finish-critical\" },\n            { value: \"close_to_90_ok\", label: \"Close-to-90 roughing is okay\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"corner_radius_need\", {\n          label: \"What inside corner radius is acceptable at the shoulder root?\",\n          helpText: \"Why it matters: the shoulder-root radius is one of the cleanest technical fit checks because it maps directly against the cutter corner radius.\",\n          type: \"chips\",\n          options: [\n            { value: \"sharp\", label: \"Sharp / as small as possible\" },\n            { value: \"max_radius_defined\", label: \"Defined max radius\" },\n            { value: \"not_critical\", label: \"Not critical\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"max_corner_radius_mm\", {\n          label: \"What is the maximum allowed shoulder-root radius?\",\n          helpText: \"Why it matters: this becomes a direct cutter-corner fit check when the shoulder cannot tolerate a larger root radius.\",\n          visibleWhen: function visibleWhen(ctx) {\n            return !!(ctx && ctx.answers && ctx.answers.corner_radius_need === \"max_radius_defined\");\n          },\n          hiddenValuePolicy: \"clear\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"material_condition_class\", {\n          label: \"How does the selected material behave in this shoulder cut?\",\n          helpText: \"Why it matters: shoulder milling reacts strongly to long chips, built-up edge, work-hardening and abrasive wear, even inside the same ISO subgroup.\",\n          options: [\n            { value: \"standard\", label: \"Standard\" },\n            { value: \"tough_long_chipping\", label: \"Tough / long-chipping\" },\n            { value: \"sticky_bue\", label: \"Sticky / built-up edge\" },\n            { value: \"work_hardening\", label: \"Work-hardening\" },\n            { value: \"hard_abrasive\", label: \"Hard / abrasive\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"setup_stability\", {\n          label: \"How stable is the shoulder setup?\",\n          helpText: \"Why it matters: thin walls, long overhangs and low stiffness push chatter risk much faster in shoulder milling than in a calm open face cut.\",\n          type: \"chips\",\n          options: [\n            { value: \"stable\", label: \"Stable\" },\n            { value: \"normal\", label: \"Normal\" },\n            { value: \"thin_wall\", label: \"Thin wall / chatter-sensitive\" },\n            { value: \"long_overhang_sensitive\", label: \"Long overhang / low stiffness\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"priority\", {\n          label: \"What matters most in this shoulder operation?\",\n          helpText: \"Why it matters: the ranking can lean toward precision, process security or productivity once the basic geometry and recipe fit are valid.\",\n          required: false,\n          type: \"chips\",\n          options: [\n            { value: \"precision\", label: \"Precision / finish\" },\n            { value: \"balanced\", label: \"Balanced\" },\n            { value: \"safety\", label: \"Process security\" },\n            { value: \"productivity\", label: \"Productivity\" },\n          ],\n        }),\n        cloneQuestion(\"condition_stage\", {\n          label: \"Is this shoulder pass mainly roughing, semi-finishing or finishing?\",\n          helpText: \"Why it matters: shoulder strategy changes noticeably depending on whether the same tool must finish the wall or only rough the shoulder out.\",\n          type: \"chips\",\n          options: [\n            { value: \"roughing\", label: \"Roughing\" },\n            { value: \"semi-finishing\", label: \"Semi-finishing\" },\n            { value: \"finishing\", label: \"Finishing\" },\n          ],\n        }),\n        cloneQuestion(\"max_tool_diameter_mm\", {\n          label: \"If clearance is tight, what is the largest cutter diameter that still fits?\",\n          helpText: \"Why it matters: a numeric max diameter makes access and wall-clearance checks much more credible than a generic access label alone.\",\n          group: \"advanced\",\n          expertOnly: true,\n          required: false,\n        }),\n        cloneQuestion(\"shoulder_reach_mm\", {\n          label: \"If reach is critical, what is the real reach requirement?\",\n          helpText: \"Why it matters: a numeric reach target sharpens usable-length and neck-clearance checks when the shoulder sits deeper in a cavity.\",\n          group: \"advanced\",\n          expertOnly: true,\n          required: false,\n        }),\n        cloneQuestion(\"tool_concept_preference\", {\n          label: \"Is the tool concept fixed?\",\n          helpText: \"Why it matters: some shoulder cases must stay on a solid end mill or an indexable cutter even though the current kernel cannot hard-code that distinction from catalog data alone.\",\n          group: \"advanced\",\n          expertOnly: true,\n          required: false,\n          type: \"chips\",\n          options: [\n            { value: \"either\", label: \"Either\" },\n            { value: \"solid_carbide_only\", label: \"Solid carbide only\" },\n            { value: \"indexable_only\", label: \"Indexable only\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"coolant_capability\", {\n          label: \"What coolant or lubrication support is actually available?\",\n          helpText: \"Why it matters: coolant is not the primary shoulder-milling filter, but it still influences finish, BUE and stability in M, N and difficult shoulder cases.\",\n          group: \"machine\",\n          expertOnly: true,\n          required: false,\n          type: \"chips\",\n          options: [\n            { value: \"through\", label: \"Through coolant\" },\n            { value: \"external\", label: \"External coolant\" },\n            { value: \"mql\", label: \"MQL / mist\" },\n            { value: \"dry\", label: \"Dry\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"machine_torque_capability\", {\n          label: \"Is spindle power or torque a limit here?\",\n          helpText: \"Why it matters: broader shoulder engagement and larger cutters can become machine-load limited before the recipe band becomes comfortably productive.\",\n          group: \"machine\",\n          expertOnly: true,\n          required: false,\n          options: [\n            { value: \"high\", label: \"No real limit\" },\n            { value: \"medium\", label: \"Some limit\" },\n            { value: \"low\", label: \"Clearly limited\" },\n          ],\n        }),\n        cloneQuestion(\"cut_interruption\", {\n          label: \"Is the shoulder cut smooth or interrupted by skin, scale or interruptions?\",\n          helpText: \"Why it matters: interrupted skin and crust raise chipping risk and often demand a calmer shoulder strategy than a clean open cut.\",\n          group: \"safety\",\n          expertOnly: true,\n          required: false,\n          type: \"chips\",\n          options: [\n            { value: \"none\", label: \"Clean cut\" },\n            { value: \"light\", label: \"Light interruption\" },\n            { value: \"heavy\", label: \"Heavy interruption / skin\" },\n          ],\n        }),\n      ];\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/shoulder-milling/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function average(values) {\n      var filtered = (values || []).filter(function keep(value) {\n        return value != null && Number.isFinite(value);\n      });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) {\n        return total + value;\n      }, 0) / filtered.length;\n    }\n    \n    function scoreToken(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function getAllowedCornerRadius(ctx) {\n      var need = getAnswer(ctx, \"corner_radius_need\");\n      var explicitRadius = toNullableNumber(getAnswer(ctx, \"max_corner_radius_mm\"));\n    \n      if (need === \"max_radius_defined\" && explicitRadius != null) return explicitRadius;\n      if (need === \"sharp\") return 0.1;\n      return null;\n    }\n    \n    function getCornerRequirementLabel(ctx, allowedRadius) {\n      var need = getAnswer(ctx, \"corner_radius_need\");\n      if (need === \"sharp\") return \"Sharp / as small as possible\";\n      if (need === \"max_radius_defined\" && allowedRadius != null) return \"Max corner radius \" + allowedRadius + \" mm\";\n      return \"Corner radius not critical\";\n    }\n    \n    function normalizeExplicitConcept(value) {\n      if (value === \"solid_carbide_only\") return \"solid_carbide\";\n      if (value === \"indexable_only\") return \"indexable\";\n      return \"either\";\n    }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var fluteCount = getCandidateFluteCount(candidate);\n      var helixAngle = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neckDiameter = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var productText = [candidate.catalog && candidate.catalog.productTitle, candidate.catalog && candidate.catalog.variantTitle].join(\" \").toLowerCase();\n      var solidSignals = 0;\n      var indexableSignals = 0;\n    \n      if (diameter != null && diameter <= 16) solidSignals += 2;\n      if (diameter != null && diameter >= 25) indexableSignals += 2;\n      if (fluteCount != null && fluteCount >= 4) solidSignals += 1;\n      if (helixAngle != null && helixAngle >= 30) solidSignals += 1;\n      if (neckDiameter != null && diameter != null && neckDiameter < diameter) solidSignals += 1;\n      if (productText.indexOf(\"end mill\") >= 0 || productText.indexOf(\"solid\") >= 0 || productText.indexOf(\"plura\") >= 0) solidSignals += 1;\n      if (productText.indexOf(\"body\") >= 0 || productText.indexOf(\"index\") >= 0 || productText.indexOf(\"cutter\") >= 0 || productText.indexOf(\"490\") >= 0) indexableSignals += 1;\n    \n      if (solidSignals >= indexableSignals + 2) return \"solid_carbide\";\n      if (indexableSignals >= solidSignals + 2) return \"indexable\";\n      return \"either\";\n    }\n    \n    function deriveSuggestedConcept(inputs) {\n      var solidBias = 0;\n      var indexableBias = 0;\n    \n      if (inputs.shoulder90 === \"true_90_finish_critical\") solidBias += 2;\n      if (inputs.allowedCornerRadius != null && inputs.allowedCornerRadius <= 0.15) solidBias += 2;\n      if (inputs.priority === \"precision\") solidBias += 2;\n      if (inputs.conditionStage === \"finishing\") solidBias += 1;\n      if (inputs.access === \"wall_fixture_near\" || inputs.access === \"deep_reach\") solidBias += 2;\n      if (inputs.stability === \"thin_wall\" || inputs.stability === \"long_overhang_sensitive\") solidBias += 1;\n    \n      if (inputs.priority === \"productivity\") indexableBias += 2;\n      if (inputs.conditionStage === \"roughing\") indexableBias += 1;\n      if (inputs.shoulder90 === \"close_to_90_ok\") indexableBias += 1;\n      if (inputs.access === \"open\") indexableBias += 1;\n      if (inputs.aePctReq != null && inputs.aePctReq >= 55) indexableBias += 2;\n      if (inputs.shoulderWidth != null && inputs.shoulderWidth >= 12) indexableBias += 1;\n    \n      if (solidBias >= indexableBias + 2) return \"solid_carbide\";\n      if (indexableBias >= solidBias + 2) return \"indexable\";\n      return \"either\";\n    }\n    \n    function evaluateConceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var score = 0.78;\n    \n      if (desiredConcept === \"either\" || candidateConcept === \"either\") score = 0.82;\n      else if (candidateConcept === desiredConcept) score = explicitConcept === \"either\" ? 0.9 : 1;\n      else score = explicitConcept === \"either\" ? 0.62 : 0.35;\n    \n      return {\n        score: score,\n        className: score >= 0.9 ? \"strong\" : score >= 0.7 ? \"usable\" : \"conditional\",\n      };\n    }\n    \n    function evaluateRecipeFit(requestedValue, band) {\n      var min = toNullableNumber(band && band.min);\n      var typ = toNullableNumber(band && band.typ);\n      var max = toNullableNumber(band && band.max);\n      var upper = max != null ? max : (typ != null ? typ : min);\n      var lower = min != null ? min : 0;\n      var overflowRatio;\n      var score;\n    \n      if (requestedValue == null) {\n        return { score: 0.5, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max };\n      }\n      if (upper == null) {\n        return { score: 0.58, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max };\n      }\n      if (requestedValue > upper) {\n        overflowRatio = upper > 0 ? (requestedValue - upper) / upper : 1;\n        score = clamp(0.55 - overflowRatio * 1.5, 0, 0.55);\n        return {\n          score: score,\n          className: overflowRatio <= 0.15 ? \"conditional\" : \"over\",\n          hardFail: overflowRatio > 0.15,\n          min: min,\n          typ: typ,\n          max: max,\n        };\n      }\n      if (typ != null && requestedValue > typ) {\n        score = clamp(1 - ((requestedValue - typ) / Math.max((upper - typ) || typ || 1, 1)) * 0.25, 0.78, 1);\n        return { score: score, className: \"good\", hardFail: false, min: min, typ: typ, max: max };\n      }\n      if (requestedValue >= lower) {\n        return { score: 0.94, className: \"good\", hardFail: false, min: min, typ: typ, max: max };\n      }\n      return { score: 0.84, className: \"light\", hardFail: false, min: min, typ: typ, max: max };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 4) return 1;\n      if (margin >= 2) return 0.88;\n      if (margin >= 0.5) return 0.74;\n      if (margin >= 0) return 0.58;\n      if (margin >= -1) return 0.18;\n      return 0;\n    }\n    \n    function evaluateCornerRadius(candidateCornerRadius, allowedCornerRadius) {\n      if (allowedCornerRadius == null) {\n        return { score: 0.86, fits: true, hardFail: false };\n      }\n      if (candidateCornerRadius == null) {\n        return { score: 0.2, fits: false, hardFail: true };\n      }\n      if (candidateCornerRadius <= allowedCornerRadius) {\n        return { score: 1, fits: true, hardFail: false };\n      }\n      return { score: 0, fits: false, hardFail: true };\n    }\n    \n    function evaluateAccess(inputs, candidate) {\n      var candidateDiameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var usableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n      var neckDiameter = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var score = scoreToken(inputs.access, {\n        open: 1,\n        semi_open: 0.84,\n        wall_fixture_near: 0.63,\n        deep_reach: 0.52,\n        slot_like: 0.34,\n      }, 0.6);\n    \n      if (inputs.maxToolDiameter != null && candidateDiameter != null && candidateDiameter > inputs.maxToolDiameter) {\n        return { score: 0, className: \"poor\" };\n      }\n      if (inputs.reachRequirement != null && usableLength != null && usableLength < inputs.reachRequirement) {\n        score -= 0.18;\n      }\n      if ((inputs.access === \"wall_fixture_near\" || inputs.access === \"deep_reach\") && neckDiameter != null && candidateDiameter != null) {\n        score += neckDiameter < candidateDiameter ? 0.12 : -0.08;\n      }\n      if (inputs.access === \"slot_like\" && inputs.aePctReq != null && inputs.aePctReq >= 80) {\n        score -= 0.15;\n      }\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.78 ? \"good\" : score >= 0.5 ? \"conditional\" : \"poor\",\n      };\n    }\n    \n    function evaluateTrue90(inputs, candidateCornerRadius, conceptGuess) {\n      var score = 0.78;\n    \n      if (inputs.shoulder90 !== \"true_90_finish_critical\") {\n        return { score: 1, className: \"high\" };\n      }\n    \n      score = 0.54;\n      if (candidateCornerRadius != null && candidateCornerRadius <= 0.1) score += 0.22;\n      else if (candidateCornerRadius != null && candidateCornerRadius <= 0.2) score += 0.12;\n      else score -= 0.18;\n      if (conceptGuess === \"solid_carbide\") score += 0.16;\n      if (inputs.conditionStage === \"finishing\") score += 0.05;\n      if (inputs.priority === \"precision\") score += 0.05;\n      score = clamp(score, 0, 1);\n    \n      return {\n        score: score,\n        className: score >= 0.85 ? \"high\" : score >= 0.65 ? \"medium\" : \"uncertain\",\n      };\n    }\n    \n    function classifyChatterRisk(inputs) {\n      var score = 0;\n    \n      score += scoreToken(inputs.stability, {\n        stable: 0,\n        normal: 0.18,\n        thin_wall: 0.48,\n        long_overhang_sensitive: 0.58,\n      }, 0.2);\n      score += scoreToken(inputs.access, {\n        open: 0,\n        semi_open: 0.06,\n        wall_fixture_near: 0.12,\n        deep_reach: 0.2,\n        slot_like: 0.18,\n      }, 0.08);\n      score += scoreToken(inputs.materialCondition, {\n        standard: 0,\n        tough_long_chipping: 0.08,\n        sticky_bue: 0.1,\n        work_hardening: 0.16,\n        hard_abrasive: 0.18,\n        unknown: 0.08,\n      }, 0.08);\n      score += scoreToken(inputs.cutInterruption, {\n        none: 0,\n        light: 0.06,\n        heavy: 0.14,\n      }, 0.04);\n    \n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.58 ? \"high\" : score >= 0.28 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyMachineLoad(inputs) {\n      var score = 0;\n    \n      score += clamp((inputs.apRatio || 0) / 1.2, 0, 1) * 0.35;\n      score += clamp((inputs.aePctReq || 0) / 100, 0, 1) * 0.35;\n      score += scoreToken(inputs.materialCondition, {\n        standard: 0.05,\n        tough_long_chipping: 0.1,\n        sticky_bue: 0.1,\n        work_hardening: 0.14,\n        hard_abrasive: 0.18,\n        unknown: 0.08,\n      }, 0.08);\n      score += scoreToken(inputs.machineTorque, {\n        high: 0,\n        medium: 0.08,\n        low: 0.18,\n      }, 0.04);\n      score += scoreToken(inputs.cutInterruption, {\n        none: 0,\n        light: 0.04,\n        heavy: 0.1,\n      }, 0.03);\n    \n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.68 ? \"critical\" : score >= 0.48 ? \"high\" : score >= 0.24 ? \"normal\" : \"light\",\n      };\n    }\n    \n    function classifyCoolantSupport(inputs, candidate) {\n      var candidateHasTsc = candidate.common && candidate.common.coolantTsc === true;\n      var answer = inputs.coolantCapability;\n    \n      if (!answer || answer === \"unknown\") return { score: 0.58, className: \"unknown\" };\n      if (answer === \"through\") return { score: candidateHasTsc ? 1 : 0.45, className: candidateHasTsc ? \"strong\" : \"conditional\" };\n      if (answer === \"external\") {\n        if (inputs.materialCondition === \"sticky_bue\" || inputs.materialCondition === \"work_hardening\" || inputs.conditionStage === \"finishing\") {\n          return { score: 0.62, className: \"acceptable\" };\n        }\n        return { score: 0.74, className: \"acceptable\" };\n      }\n      if (answer === \"mql\") return { score: 0.6, className: \"limited\" };\n      if (answer === \"dry\") return { score: inputs.materialCondition === \"standard\" ? 0.58 : 0.42, className: \"limited\" };\n      return { score: 0.58, className: \"unknown\" };\n    }\n    \n    function scoreStageFit(requestedStage, row) {\n      var rowStage = row && row.constraints ? row.constraints.conditionStage : null;\n      if (!requestedStage || !rowStage) return 0.76;\n      if (requestedStage === rowStage) return 1;\n      if (rowStage === \"semi-finishing\") return 0.84;\n      return 0.62;\n    }\n    \n    function getPriorityBias(priority, metrics) {\n      if (priority === \"precision\") {\n        return average([metrics.cornerRadiusFitScore, metrics.true90Score, metrics.accessFitScore]) * 0.45;\n      }\n      if (priority === \"safety\") {\n        return average([metrics.reachReserveScore, 1 - metrics.chatterRiskScore, 1 - metrics.machineLoadScore]) * 0.45;\n      }\n      if (priority === \"productivity\") {\n        return average([metrics.engagementFitScore, metrics.toolConceptScore, metrics.coolantSupportScore]) * 0.45;\n      }\n      return 0.32;\n    }\n    \n    function computeRpm(vcTyp, diameter) {\n      if (vcTyp == null || diameter == null || diameter <= 0) return null;\n      return (1000 * vcTyp) / (Math.PI * diameter);\n    }\n    \n    function computeFeed(fzTyp, rpm, fluteCount) {\n      if (fzTyp == null || rpm == null || fluteCount == null || fluteCount <= 0) return null;\n      return fzTyp * rpm * fluteCount;\n    }\n    \n    function computeMrr(ap, ae, feed) {\n      if (ap == null || ae == null || feed == null) return null;\n      return (ap * ae * feed) / 1000;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"shoulder_milling\", ctx, toolkits));\n      var shoulderHeight = toNullableNumber(getAnswer(ctx, \"wall_height_mm\"));\n      var shoulderWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var allowedCornerRadius = getAllowedCornerRadius(ctx);\n    \n      derived.requested_shoulder_height_mm = shoulderHeight;\n      derived.requested_shoulder_width_mm = shoulderWidth;\n      derived.allowed_corner_radius_mm = allowedCornerRadius;\n      derived.corner_radius_requirement_label = getCornerRequirementLabel(ctx, allowedCornerRadius);\n      derived.shoulder_aspect_ratio = shoulderHeight != null && shoulderWidth != null && shoulderWidth > 0 ? shoulderHeight / shoulderWidth : null;\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"shoulder_milling\", ctx);\n      var shoulderHeight = toNullableNumber(getAnswer(ctx, \"wall_height_mm\"));\n      var shoulderWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var shoulderAspectRatio = shoulderHeight != null && shoulderWidth != null && shoulderWidth > 0 ? shoulderHeight / shoulderWidth : null;\n    \n      if (shoulderAspectRatio != null && shoulderAspectRatio > 4) {\n        issues.push({\n          field: \"wall_height_mm\",\n          message: \"Very tall, narrow shoulders push reach and chatter risk high. Treat this as a reach-sensitive shoulder case.\",\n          severity: \"warning\",\n          code: \"shoulder_aspect_ratio_high\",\n        });\n      }\n      if (getAnswer(ctx, \"shoulder_access\") === \"slot_like\") {\n        issues.push({\n          field: \"shoulder_access\",\n          message: \"This shoulder is drifting toward a slotting-style engagement and should be reviewed as a process-boundary case.\",\n          severity: \"warning\",\n          code: \"slotting_drift\",\n        });\n      }\n      if (getAnswer(ctx, \"shoulder_90_required\") === \"true_90_finish_critical\" && getAnswer(ctx, \"condition_stage\") === \"roughing\") {\n        issues.push({\n          field: \"condition_stage\",\n          message: \"A finish-critical true 90 degree shoulder usually needs more than a pure roughing mindset.\",\n          severity: \"warning\",\n          code: \"true90_roughing_bias\",\n        });\n      }\n      if ((getAnswer(ctx, \"setup_stability\") === \"thin_wall\" || getAnswer(ctx, \"setup_stability\") === \"long_overhang_sensitive\") && getAnswer(ctx, \"priority\") === \"productivity\") {\n        issues.push({\n          field: \"priority\",\n          message: \"High-productivity shoulder milling conflicts with the stated thin-wall or low-stiffness setup risk.\",\n          severity: \"warning\",\n          code: \"stability_productivity_conflict\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"shoulder_milling\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var shoulderHeight = toNullableNumber(getAnswer(ctx, \"wall_height_mm\"));\n      var shoulderWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var allowedCornerRadius = getAllowedCornerRadius(ctx);\n      var access = getAnswer(ctx, \"shoulder_access\");\n      var shoulder90 = getAnswer(ctx, \"shoulder_90_required\");\n      var materialCondition = getAnswer(ctx, \"material_condition_class\");\n      var stability = getAnswer(ctx, \"setup_stability\");\n      var priority = getAnswer(ctx, \"priority\") || \"balanced\";\n      var conditionStage = getAnswer(ctx, \"condition_stage\");\n      var maxToolDiameter = toNullableNumber(getAnswer(ctx, \"max_tool_diameter_mm\"));\n      var reachRequirement = toNullableNumber(getAnswer(ctx, \"shoulder_reach_mm\")) || shoulderHeight;\n      var explicitConcept = normalizeExplicitConcept(getAnswer(ctx, \"tool_concept_preference\"));\n      var coolantCapability = getAnswer(ctx, \"coolant_capability\");\n      var machineTorque = getAnswer(ctx, \"machine_torque_capability\");\n      var cutInterruption = getAnswer(ctx, \"cut_interruption\");\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var row = recipeResult.row || rows[0] || null;\n        var recipe = recipeResult.recipe || {};\n        var candidateDiameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var candidateUsableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var candidateApmx = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var candidateCornerRadius = toNullableNumber(candidate.milling && candidate.milling.cornerRadiusMm);\n        var candidateFluteCount = getCandidateFluteCount(candidate);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var aePctReq = shoulderWidth != null && candidateDiameter != null && candidateDiameter > 0 ? (shoulderWidth / candidateDiameter) * 100 : null;\n        var apRatio = shoulderHeight != null && candidateDiameter != null && candidateDiameter > 0 ? shoulderHeight / candidateDiameter : null;\n        var recipeApFit = evaluateRecipeFit(shoulderHeight, recipe.ap);\n        var recipeAeFit = evaluateRecipeFit(aePctReq, recipe.aePct);\n        var reachMargin = candidateUsableLength != null && shoulderHeight != null ? candidateUsableLength - shoulderHeight : null;\n        var apmxMargin = candidateApmx != null && shoulderHeight != null ? candidateApmx - shoulderHeight : null;\n        var cornerRadiusFit = evaluateCornerRadius(candidateCornerRadius, allowedCornerRadius);\n        var suggestedConcept = explicitConcept === \"either\"\n          ? deriveSuggestedConcept({\n              shoulder90: shoulder90,\n              allowedCornerRadius: allowedCornerRadius,\n              priority: priority,\n              conditionStage: conditionStage,\n              access: access,\n              stability: stability,\n              aePctReq: aePctReq,\n              shoulderWidth: shoulderWidth,\n            })\n          : explicitConcept;\n        var conceptFit = evaluateConceptFit(candidateConcept, suggestedConcept, explicitConcept);\n        var accessFit = evaluateAccess({\n          access: access,\n          maxToolDiameter: maxToolDiameter,\n          reachRequirement: reachRequirement,\n          aePctReq: aePctReq,\n        }, candidate);\n        var true90Fit = evaluateTrue90({\n          shoulder90: shoulder90,\n          conditionStage: conditionStage,\n          priority: priority,\n        }, candidateCornerRadius, candidateConcept);\n        var chatterRisk = classifyChatterRisk({\n          stability: stability,\n          access: access,\n          materialCondition: materialCondition,\n          cutInterruption: cutInterruption,\n        });\n        var machineLoad = classifyMachineLoad({\n          apRatio: apRatio,\n          aePctReq: aePctReq,\n          materialCondition: materialCondition,\n          machineTorque: machineTorque,\n          cutInterruption: cutInterruption,\n        });\n        var coolantSupport = classifyCoolantSupport({\n          coolantCapability: coolantCapability,\n          materialCondition: materialCondition,\n          conditionStage: conditionStage,\n        }, candidate);\n        var reachReserveScore = average([marginScore(reachMargin), marginScore(apmxMargin)]);\n        var stageFitScore = scoreStageFit(conditionStage, row);\n        var slottingDrift = access === \"slot_like\" || (aePctReq != null && aePctReq >= 80) || (access !== \"open\" && aePctReq != null && aePctReq >= 70);\n        var hardRejectReason = null;\n        var metrics;\n        var parts;\n        var total;\n        var confidence;\n        var rpmTyp = computeRpm(toNullableNumber(recipe.vc && recipe.vc.typ), candidateDiameter);\n        var feedTyp = computeFeed(toNullableNumber(recipe.fz && recipe.fz.typ), rpmTyp, candidateFluteCount);\n        var mrrTyp = computeMrr(shoulderHeight, shoulderWidth, feedTyp);\n        var priorityBias;\n        var riskPenalty;\n    \n        if (!rows.length) {\n          hardRejectReason = \"No valid shoulder-milling row is available for this material and process context.\";\n        }\n        if (!hardRejectReason && recipeApFit.hardFail) {\n          hardRejectReason = \"Requested shoulder height exceeds the credible shoulder-milling recipe window.\";\n        }\n        if (!hardRejectReason && recipeAeFit.hardFail) {\n          hardRejectReason = \"Requested radial engagement drifts outside the credible shoulder-milling recipe window.\";\n        }\n        if (!hardRejectReason && reachMargin != null && reachMargin < 0) {\n          hardRejectReason = \"Usable length is shorter than the requested shoulder height.\";\n        }\n        if (!hardRejectReason && apmxMargin != null && apmxMargin < 0) {\n          hardRejectReason = \"APMX is shorter than the requested shoulder height.\";\n        }\n        if (!hardRejectReason && maxToolDiameter != null && candidateDiameter != null && candidateDiameter > maxToolDiameter) {\n          hardRejectReason = \"Tool diameter exceeds the stated clearance limit for this shoulder.\";\n        }\n        if (!hardRejectReason && cornerRadiusFit.hardFail) {\n          hardRejectReason = \"Candidate corner radius exceeds the allowed shoulder-root radius.\";\n        }\n    \n        metrics = {\n          requestedShoulderHeightMm: shoulderHeight,\n          requestedShoulderWidthMm: shoulderWidth,\n          requestedAePct: aePctReq,\n          requestedApRatio: apRatio,\n          shoulderAspectRatio: shoulderHeight != null && shoulderWidth != null && shoulderWidth > 0 ? shoulderHeight / shoulderWidth : null,\n          requestedConditionStage: conditionStage,\n          requestedPriority: priority,\n          requestedAccessLabel: access,\n          requestedShoulder90: shoulder90,\n          requestedShoulder90Label: shoulder90 === \"true_90_finish_critical\" ? \"True 90 finish-critical\" : shoulder90 === \"close_to_90_ok\" ? \"Close-to-90 roughing okay\" : \"Unknown\",\n          cornerRequirementLabel: getCornerRequirementLabel(ctx, allowedCornerRadius),\n          allowedCornerRadiusMm: allowedCornerRadius,\n          candidateCornerRadiusMm: candidateCornerRadius,\n          candidateDiameterMm: candidateDiameter,\n          candidateUsableLengthMm: candidateUsableLength,\n          candidateApmxMm: candidateApmx,\n          candidateFluteCount: candidateFluteCount,\n          candidateHelixAngleDeg: toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg),\n          candidateNeckDiameterMm: toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm),\n          reachRequirementMm: reachRequirement,\n          maxToolDiameterMm: maxToolDiameter,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          rowCoolantMode: row && row.constraints ? row.constraints.coolantMode : null,\n          rowRecipeKind: row && row.familyData ? row.familyData.recipeRowKind : null,\n          recipeVcMin: toNullableNumber(recipe.vc && recipe.vc.min),\n          recipeVcTyp: toNullableNumber(recipe.vc && recipe.vc.typ),\n          recipeVcMax: toNullableNumber(recipe.vc && recipe.vc.max),\n          recipeFzMin: toNullableNumber(recipe.fz && recipe.fz.min),\n          recipeFzTyp: toNullableNumber(recipe.fz && recipe.fz.typ),\n          recipeFzMax: toNullableNumber(recipe.fz && recipe.fz.max),\n          recipeApMin: recipeApFit.min,\n          recipeApTyp: recipeApFit.typ,\n          recipeApMax: recipeApFit.max,\n          recipeAePctMin: recipeAeFit.min,\n          recipeAePctTyp: recipeAeFit.typ,\n          recipeAePctMax: recipeAeFit.max,\n          recipeApFitClass: recipeApFit.className,\n          recipeApFitScore: recipeApFit.score,\n          recipeAeFitClass: recipeAeFit.className,\n          recipeAeFitScore: recipeAeFit.score,\n          reachMarginMm: reachMargin,\n          apmxMarginMm: apmxMargin,\n          reachReserveScore: reachReserveScore,\n          cornerRadiusFit: cornerRadiusFit.fits,\n          cornerRadiusFitScore: cornerRadiusFit.score,\n          accessFitClass: accessFit.className,\n          accessFitScore: accessFit.score,\n          toolConceptGuess: candidateConcept,\n          toolConceptDesired: suggestedConcept,\n          toolConceptExplicit: explicitConcept,\n          toolConceptFitClass: conceptFit.className,\n          toolConceptScore: conceptFit.score,\n          chatterRiskClass: chatterRisk.className,\n          chatterRiskScore: chatterRisk.score,\n          machineLoadSeverityClass: machineLoad.className,\n          machineLoadScore: machineLoad.score,\n          coolantSupportClass: coolantSupport.className,\n          coolantSupportScore: coolantSupport.score,\n          true90ConfidenceClass: true90Fit.className,\n          true90Score: true90Fit.score,\n          stageFitScore: stageFitScore,\n          slottingDriftFlag: slottingDrift,\n          cutInterruption: cutInterruption,\n          rpmTyp: rpmTyp,\n          feedTypMmMin: feedTyp,\n          mrrTyp: mrrTyp,\n        };\n        Object.assign(metrics, recipeResult.debug || {});\n    \n        priorityBias = getPriorityBias(priority, metrics);\n        riskPenalty = clamp(\n          chatterRisk.score * 0.55 +\n          machineLoad.score * 0.25 +\n          (slottingDrift ? 0.16 : 0) +\n          (true90Fit.className === \"uncertain\" ? 0.12 : 0) +\n          (cutInterruption === \"heavy\" ? 0.1 : cutInterruption === \"light\" ? 0.04 : 0),\n          0,\n          1\n        );\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.15,\n          process: kernel.processFit(candidate, ctx) * 1.1,\n          engagement: average([recipeApFit.score, recipeAeFit.score]) * 2.35,\n          reach: reachReserveScore * 1.8,\n          cornerRadius: cornerRadiusFit.score * 1.6,\n          access: accessFit.score * 1.2,\n          toolConcept: conceptFit.score * 1.15,\n          true90: true90Fit.score * 1.05,\n          stability: (1 - chatterRisk.score) * 1.15,\n          stage: stageFitScore * 0.65,\n          coolant: coolantSupport.score * 0.45,\n          priorityBias: priorityBias,\n          riskPenalty: -riskPenalty,\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.82 : recipeResult.source === \"estimated\" ? 0.68 : 0.48;\n        confidence -= true90Fit.className === \"uncertain\" ? 0.08 : 0;\n        confidence -= accessFit.className === \"poor\" ? 0.1 : accessFit.className === \"conditional\" ? 0.04 : 0;\n        confidence -= chatterRisk.className === \"high\" ? 0.07 : chatterRisk.className === \"medium\" ? 0.03 : 0;\n        confidence = clamp(confidence, 0, 0.97);\n        if (hardRejectReason) confidence = 0;\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            average([recipeApFit.score, recipeAeFit.score]) >= 0.82\n              ? \"ap and ae stay inside a credible shoulder-milling engagement window.\"\n              : \"ap or ae are close to the edge of the current shoulder-milling recipe window.\",\n            cornerRadiusFit.fits\n              ? \"The cutter corner radius stays inside the requested shoulder-root limit.\"\n              : \"Corner radius is the main geometry blocker for this shoulder.\",\n            accessFit.className === \"good\"\n              ? \"The stated access still supports a stable shoulder pass.\"\n              : accessFit.className === \"conditional\"\n                ? \"Access is workable, but this shoulder should be released conservatively.\"\n                : \"Access remains a major constraint for this shoulder geometry.\",\n            conceptFit.className === \"strong\"\n              ? \"The cutter style lines up well with the expected shoulder strategy.\"\n              : \"Tool concept remains a soft trade-off between fidelity, access and productivity.\",\n            slottingDrift\n              ? \"This engagement is drifting toward slotting rather than a clean open shoulder.\"\n              : \"The cut still behaves like a shoulder operation rather than a slotting boundary case.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/slotting/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/slotting/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/slotting/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/slotting/presenter.js\");\n    exports.default = createStubProcessModule(\"slotting\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/slotting/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(0);\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = String(item || \"\").replace(/\\s+/g, \" \").trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative slotting option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      var items = [];\n    \n      if (metrics.widthModelBoundaryFlag) {\n        items.push({\n          severity: \"warning\",\n          title: \"Dedicated slotting-cutter boundary\",\n          message: \"A dedicated slotting-cutter route is technically plausible here, but exact width matching is not fully kernel-backed in V1 yet.\",\n        });\n      }\n      if (metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Chip evacuation\",\n          message: \"Chip evacuation is the main limiter in this slot. Reduce radial burden, improve coolant support or move toward a calmer strategy.\",\n        });\n      }\n      if (metrics.chatterRiskClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Stability\",\n          message: \"The slot is vibration-sensitive under the stated reach and topology. Keep gauge length short and release the first pass conservatively.\",\n        });\n      }\n      if (metrics.qualityFitClass === \"low\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Finish credibility\",\n          message: \"The current route does not cleanly support a finish-critical slot in one aggressive pass. Review a rough-plus-finish split.\",\n        });\n      }\n    \n      return items.slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"evacuation\",\n          label: \"Chip evacuation\",\n          result: metrics.chipEvacuationSeverityClass === \"low\" ? \"pass\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"limited\" : \"fail\",\n          note: \"Severity: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") + \".\",\n        },\n        {\n          key: \"stability\",\n          label: \"Stability\",\n          result: metrics.chatterRiskClass === \"low\" ? \"pass\" : metrics.chatterRiskClass === \"medium\" ? \"limited\" : \"fail\",\n          note: \"Risk: \" + titleCase(metrics.chatterRiskClass || \"review\") + \".\",\n        },\n        {\n          key: \"strategy\",\n          label: \"Strategy\",\n          result: metrics.qualityFitClass === \"good\" ? \"pass\" : metrics.qualityFitClass === \"conditional\" ? \"limited\" : \"fail\",\n          note: \"Route: \" + titleCase(metrics.strategyClass || \"review\") + \".\",\n        },\n      ];\n    }\n    \n    function buildFeatureItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"slot_width\", label: \"Slot width\", value: metrics.requestedSlotWidthMm != null ? formatDisplayNumber(metrics.requestedSlotWidthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"slot_depth\", label: \"Slot depth\", value: metrics.requestedSlotDepthMm != null ? formatDisplayNumber(metrics.requestedSlotDepthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"topology\", label: \"Topology\", value: metrics.requestedTopologyLabel || \"Review\" },\n        { key: \"start_state\", label: \"Start state\", value: titleCase(metrics.requestedStartState || \"review\") },\n        { key: \"quality\", label: \"Quality target\", value: titleCase(metrics.requestedQualityTarget || \"rough_slot\") },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"tool_width\",\n          label: \"Tool diameter vs slot width\",\n          actual: metrics.candidateDiameterMm != null ? formatDisplayNumber(metrics.candidateDiameterMm, 2) + \" mm\" : null,\n          target: metrics.requestedSlotWidthMm != null ? formatDisplayNumber(metrics.requestedSlotWidthMm, 2) + \" mm\" : null,\n          result: metrics.slotWidthToToolRatio != null && metrics.slotWidthToToolRatio >= 1 ? \"fit\" : \"near\",\n        },\n        {\n          key: \"engagement\",\n          label: \"Requested ae %\",\n          actual: metrics.requestedAePct != null ? formatDisplayNumber(metrics.requestedAePct, 1) + \" %\" : null,\n          target: metrics.recipeAePctMax != null ? \"<= \" + formatDisplayNumber(metrics.recipeAePctMax, 1) + \" %\" : null,\n          result: metrics.recipeAeFitClass === \"good\" || metrics.recipeAeFitClass === \"light\" ? \"fit\" : metrics.recipeAeFitClass === \"conditional\" ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"reach\",\n          label: \"Usable length vs slot depth\",\n          actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null,\n          target: metrics.requestedSlotDepthMm != null ? formatDisplayNumber(metrics.requestedSlotDepthMm, 2) + \" mm\" : null,\n          result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n        {\n          key: \"apmx\",\n          label: \"APMX vs slot depth\",\n          actual: metrics.candidateApmxMm != null ? formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm\" : null,\n          target: metrics.requestedSlotDepthMm != null ? formatDisplayNumber(metrics.requestedSlotDepthMm, 2) + \" mm\" : null,\n          result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n        {\n          key: \"corner_radius\",\n          label: \"Slot-bottom radius\",\n          actual: metrics.candidateCornerRadiusMm != null ? formatDisplayNumber(metrics.candidateCornerRadiusMm, 2) + \" mm\" : null,\n          target: metrics.allowedCornerRadiusMm != null ? \"<= \" + formatDisplayNumber(metrics.allowedCornerRadiusMm, 2) + \" mm\" : metrics.cornerRequirementLabel || null,\n          result: metrics.cornerRadiusFit ? \"fit\" : \"mismatch\",\n        },\n      ];\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"engagement_fit\",\n          label: \"Engagement fit\",\n          value: formatDisplayNumber(metrics.engagementFitScore, 2) || \"n/a\",\n          status: metrics.engagementFitScore >= 0.82 ? \"good\" : metrics.engagementFitScore >= 0.6 ? \"ok\" : \"weak\",\n        },\n        {\n          key: \"reach\",\n          label: \"Reach reserve\",\n          value: formatDisplayNumber(metrics.reachReserveScore, 2) || \"n/a\",\n          status: metrics.reachReserveScore >= 0.8 ? \"good\" : metrics.reachReserveScore >= 0.6 ? \"ok\" : \"weak\",\n        },\n        {\n          key: \"chip_severity\",\n          label: \"Chip severity\",\n          value: titleCase(metrics.chipEvacuationSeverityClass || \"review\"),\n          status: metrics.chipEvacuationSeverityClass === \"low\" ? \"good\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"ok\" : \"weak\",\n        },\n        {\n          key: \"stability\",\n          label: \"Chatter risk\",\n          value: titleCase(metrics.chatterRiskClass || \"review\"),\n          status: metrics.chatterRiskClass === \"low\" ? \"good\" : metrics.chatterRiskClass === \"medium\" ? \"ok\" : \"weak\",\n        },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) {\n          return item.min != null || item.typ != null || item.max != null;\n        }),\n      });\n    \n      block.data.presentation = {\n        kicker: \"Start values\",\n        rowBackedValues: [\n          { label: \"Topology\", value: metrics.requestedTopologyLabel || \"Review\", tone: \"text\" },\n          { label: \"Strategy\", value: titleCase(metrics.strategyClass || \"review\"), tone: \"text\" },\n          { label: \"ap fit\", value: titleCase(metrics.recipeApFitClass || \"review\"), tone: \"text\" },\n          { label: \"ae fit\", value: titleCase(metrics.recipeAeFitClass || \"review\"), tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"ap upper\", value: formatDisplayNumber(metrics.recipeApUpperMm, 2) || \"n/a\", unit: \"mm\" },\n        ],\n        machineValues: [\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n        ],\n      };\n      return block;\n    }\n    \n    function buildSetupBlock(top, riskItems) {\n      var metrics = top.metrics || {};\n      var notes = [\n        { area: \"topology\", message: \"Topology: \" + (metrics.requestedTopologyLabel || \"Review\") },\n        { area: \"strategy\", message: \"Suggested route: \" + titleCase(metrics.strategyClass || \"review\") },\n        { area: \"stability\", message: \"Stability class: \" + titleCase(metrics.chatterRiskClass || \"review\") },\n      ];\n    \n      var block = setupNotes(notes);\n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Fit\",\n            highlight: \"The recommendation is driven mainly by width/depth engagement, reach reserve, chip control and whether the topology still supports a credible slotting route.\",\n            items: dedupeTextItems([\n              metrics.engagementFitScore >= 0.82 ? \"Width and depth stay inside a credible slotting window.\" : null,\n              metrics.cornerRadiusFit ? \"Corner radius stays inside the allowed slot-bottom limit.\" : null,\n              metrics.chipEvacuationSeverityClass === \"low\" || metrics.chipEvacuationSeverityClass === \"medium\" ? \"Chip evacuation stays controllable for this slot.\" : null,\n            ]).slice(0, 3),\n          },\n          strategy: {\n            title: \"Strategy\",\n            tone: metrics.strategyClass === \"conventional_full_slot\" ? \"good\" : \"watch\",\n            badge: titleCase(metrics.strategyClass || \"review\"),\n            highlight: metrics.strategyClass === \"trochoidal\"\n              ? \"This slot is better released with a trochoidal-style route than with aggressive direct full-slotting.\"\n              : metrics.strategyClass === \"plunge\"\n                ? \"Reach or machine limits push the opening toward plunge-style logic.\"\n                : metrics.strategyClass === \"rough_plus_finish\"\n                  ? \"A split rough-plus-finish route is more credible than trusting one pass for slot fidelity.\"\n                  : \"A conventional slotting route still looks credible for the stated geometry.\",\n            items: dedupeTextItems([\n              metrics.trochoidalEligibleFlag ? \"Smaller-tool trochoidal motion is geometrically plausible.\" : null,\n              metrics.widthModelBoundaryFlag ? \"Dedicated slotting-cutter logic is technically relevant but only partly width-backed in V1.\" : null,\n              metrics.qualityFitClass === \"low\" ? \"Finish demand is stronger than the one-pass route can cleanly support.\" : null,\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: \"Slotting gets difficult quickly once depth, closed topology, chip evacuation and chatter stack up together.\",\n            items: dedupeTextItems([\n              metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\" ? \"Chip evacuation is the main limiter.\" : null,\n              metrics.chatterRiskClass === \"high\" ? \"The slot is chatter-sensitive under the stated reach.\" : null,\n              metrics.widthModelBoundaryFlag ? \"Dedicated slotting-cutter width matching is not fully kernel-backed.\" : null,\n            ]).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"Topology & concept\",\n            tone: metrics.toolConceptFitClass === \"strong\" ? \"good\" : \"default\",\n            badge: titleCase(metrics.toolConceptDesired || \"either\"),\n            value: \"Requested topology: \" + (metrics.requestedTopologyLabel || \"Review\") + \". Candidate reads as \" + titleCase(metrics.toolConceptGuess || \"either\") + \".\",\n            note: metrics.widthModelBoundaryFlag ? \"Dedicated slotting-cutter width matching remains a soft boundary in V1.\" : null,\n            items: dedupeTextItems([\n              metrics.requestedStartState ? \"Start state: \" + titleCase(metrics.requestedStartState) + \".\" : null,\n              metrics.requestedQualityTarget ? \"Quality target: \" + titleCase(metrics.requestedQualityTarget) + \".\" : null,\n              metrics.toolConceptExplicit && metrics.toolConceptExplicit !== \"either\" ? \"Explicit concept preference applied.\" : null,\n            ]),\n          },\n          {\n            title: \"Reach & evacuation\",\n            tone: metrics.chipEvacuationSeverityClass === \"low\" ? \"good\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"default\" : \"watch\",\n            badge: titleCase(metrics.chipEvacuationSeverityClass || \"review\"),\n            value: \"Reach reserve and chip evacuation together decide whether the slot stays stable or needs a calmer route.\",\n            note: dedupeTextItems([\n              metrics.reachMarginMm != null ? \"Usable-length margin \" + formatDisplayNumber(metrics.reachMarginMm, 2) + \" mm\" : null,\n              metrics.apmxMarginMm != null ? \"APMX margin \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm\" : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.reachRequirementMm != null ? \"Reach requirement: \" + formatDisplayNumber(metrics.reachRequirementMm, 2) + \" mm.\" : null,\n              metrics.candidateNeckDiameterMm != null ? \"Neck diameter: \" + formatDisplayNumber(metrics.candidateNeckDiameterMm, 2) + \" mm.\" : null,\n              metrics.coolantSupportClass ? \"Coolant support: \" + titleCase(metrics.coolantSupportClass) + \".\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Chip control\",\n            tone: metrics.chipEvacuationSeverityClass === \"critical\" ? \"high\" : metrics.chipEvacuationSeverityClass === \"high\" ? \"watch\" : \"default\",\n            actions: dedupeTextItems([\n              \"Reduce radial burden if chips start packing in the slot.\",\n              \"Prefer better coolant support or a calmer route in deep or closed slots.\",\n              metrics.trochoidalEligibleFlag ? \"Use a smaller tool and trochoidal motion when the slot stops behaving like a clean full-slot case.\" : null,\n            ]),\n          },\n          {\n            title: \"Boundary review\",\n            tone: metrics.widthModelBoundaryFlag || metrics.qualityFitClass === \"low\" ? \"watch\" : \"default\",\n            actions: dedupeTextItems([\n              metrics.widthModelBoundaryFlag ? \"Treat dedicated slotting-cutter matches as advisory until width backing becomes canonical.\" : \"Stay inside the cleaner end-mill-backed model when possible.\",\n              metrics.qualityFitClass === \"low\" ? \"Split the slot into roughing plus finish when fidelity matters.\" : \"Release the first part before pushing productivity.\",\n              metrics.strategyClass === \"plunge\" ? \"Expect a follow-up clean-up step after plunge-style opening.\" : null,\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var riskItems;\n      var alternativeItems;\n      var heroBlock;\n      var featureBlock;\n      var geometryBlock;\n      var fitBlock;\n      var recipeBlock;\n      var machineBlock;\n      var setupBlock;\n      var riskBlock;\n      var alternativesBlock;\n      var bundleBlock;\n      var commerceBlock;\n      var metrics;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"slotting\",\n          outcome: \"no_match\",\n          summary: \"No credible slotting recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current slotting inputs do not support a credible recommendation.\"),\n            noMatchGuidance({\n              message: \"Check slot width, slot depth, topology, allowed bottom radius and whether the slot should stay conventional, move to trochoidal logic or split into roughing plus finish.\",\n              steps: [\n                \"Confirm the real slot width and total slot depth.\",\n                \"Clarify whether the slot is open, one-side open, closed from solid or non-linear.\",\n                \"Check the allowed slot-bottom corner radius.\",\n                \"Add a max tool diameter or explicit reach requirement when access is constrained.\",\n                \"Review trochoidal, plunge or rough-plus-finish logic when direct full-slotting is no longer credible.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust slot inputs\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      bundleBlock = buildMillingBundleRecommendation(candidate);\n      riskItems = buildRiskItems(top);\n      alternativeItems = buildAlternativeItems(scored);\n    \n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best slotting fit for \" + (metrics.requestedSlotWidthMm != null ? formatDisplayNumber(metrics.requestedSlotWidthMm, 2) + \" mm width\" : \"the requested slot\") + \" and \" + (metrics.requestedSlotDepthMm != null ? formatDisplayNumber(metrics.requestedSlotDepthMm, 2) + \" mm depth\" : \"the stated depth\") + \".\",\n        headerPills: [\n          { tone: \"good\", text: \"Best fit\" },\n          { tone: metrics.chipEvacuationSeverityClass === \"low\" ? \"good\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"default\" : \"watch\", text: \"Chip: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") },\n          { tone: metrics.chatterRiskClass === \"low\" ? \"good\" : metrics.chatterRiskClass === \"medium\" ? \"default\" : \"watch\", text: \"Chatter: \" + titleCase(metrics.chatterRiskClass || \"review\") },\n          { tone: metrics.widthModelBoundaryFlag ? \"watch\" : \"default\", text: metrics.widthModelBoundaryFlag ? \"Boundary: Slotting-cutter width\" : \"Boundary: Width model clean\" },\n        ],\n      };\n    \n      featureBlock = featureSummary(buildFeatureItems(top));\n      geometryBlock = geometryFit(buildGeometryItems(top));\n      fitBlock = fitKpis(buildFitItems(top));\n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      setupBlock = buildSetupBlock(top, riskItems);\n      riskBlock = riskNotes(riskItems);\n      alternativesBlock = alternatives(alternativeItems);\n      commerceBlock = commerceCta(Object.assign({\n        productUrl: candidate.catalog.url,\n        available: candidate.commerce.available,\n        priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n        ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n      }, buildMillingCompositeCommerceData(candidate) || {}));\n    \n      return createResultViewModel({\n        processId: \"slotting\",\n        outcome: top.score.total >= 7.8 ? \"match\" : \"limited_match\",\n        summary: \"Best slotting result based on engagement fit, reach, chip evacuation and strategy credibility.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          bundleBlock,\n          featureBlock,\n          geometryBlock,\n          fitBlock,\n          recipeBlock,\n          machineBlock,\n          setupBlock,\n          riskBlock,\n          alternativesBlock,\n          commerceBlock,\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust slot inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/slotting/questions.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { getQuestionDefinition } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function cloneQuestion(questionId, overrides) {\n      return createQuestionDef(Object.assign({}, getQuestionDefinition(questionId), overrides || {}));\n    }\n    \n    function getQuestions() {\n      return [\n        cloneQuestion(\"feature_width_mm\", {\n          label: \"What slot width do you need?\",\n          helpText: \"Why it matters: slot width is the primary geometry anchor and is the main comparison value against tool diameter and ae-based recipe windows.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"feature_depth_mm\", {\n          label: \"How deep is the slot?\",\n          helpText: \"Why it matters: slot depth drives reach, APMX, chip evacuation, repeated step-down risk and chatter sensitivity.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"slot_type\", {\n          label: \"What slot topology best matches the feature?\",\n          helpText: \"Why it matters: open, one-side-open, closed and non-linear slots pull the tool concept and strategy in very different directions.\",\n          type: \"chips\",\n          options: [\n            { value: \"open_linear\", label: \"Open linear\" },\n            { value: \"one_side_open_linear\", label: \"One-side open\" },\n            { value: \"closed_linear\", label: \"Closed linear\" },\n            { value: \"non_linear\", label: \"Non-linear / curved\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"slot_start_state\", {\n          label: \"Are you cutting from solid or working an existing groove?\",\n          helpText: \"Why it matters: slotting from solid raises radial load and chip-packing risk, while an existing groove or finish-only pass opens calmer strategies.\",\n          type: \"chips\",\n          options: [\n            { value: \"from_solid\", label: \"From solid\" },\n            { value: \"existing_channel\", label: \"Existing groove / widen\" },\n            { value: \"finish_pass_only\", label: \"Finish or rework only\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"corner_radius_need\", {\n          label: \"How small may the slot-bottom corner radius be?\",\n          helpText: \"Why it matters: the allowed bottom radius is one of the cleanest geometry filters in slotting and often decides whether a finish pass is still credible.\",\n          type: \"chips\",\n          options: [\n            { value: \"sharp\", label: \"Sharp / as small as possible\" },\n            { value: \"max_radius_defined\", label: \"Defined max radius\" },\n            { value: \"not_critical\", label: \"Not critical\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"max_corner_radius_mm\", {\n          label: \"Maximum allowed slot-bottom radius\",\n          helpText: \"Why it matters: this sets the hard limit for the internal radius at the slot bottom.\",\n          visibleWhen: function visibleWhen(ctx) {\n            return ctx && ctx.answers && ctx.answers.corner_radius_need === \"max_radius_defined\";\n          },\n          hiddenValuePolicy: \"clear\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"material_condition_class\", {\n          label: \"Is there a material behavior to keep in mind?\",\n          helpText: \"Why it matters: long-chipping, sticky, work-hardening and hard materials change slotting risk far more than the broad ISO group alone suggests.\",\n          type: \"chips\",\n          options: [\n            { value: \"standard\", label: \"Standard\" },\n            { value: \"tough_long_chipping\", label: \"Tough / long-chipping\" },\n            { value: \"sticky_bue\", label: \"Sticky / BUE-prone\" },\n            { value: \"work_hardening\", label: \"Work-hardening\" },\n            { value: \"hard_abrasive\", label: \"Hard / abrasive\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"setup_stability\", {\n          label: \"How stable is the slotting setup?\",\n          helpText: \"Why it matters: slotting is much more vibration-sensitive than open shoulder cuts, especially in deep or weak setups.\",\n          type: \"chips\",\n          options: [\n            { value: \"stable\", label: \"Stable\" },\n            { value: \"normal\", label: \"Normal\" },\n            { value: \"deep_slot_reach\", label: \"Deep slot / reach-sensitive\" },\n            { value: \"chatter_sensitive\", label: \"Chatter-sensitive\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"coolant_capability\", {\n          label: \"Which coolant or chip-evacuation support is available?\",\n          helpText: \"Why it matters: deep or closed slots become much less forgiving when chip evacuation support is weak.\",\n          type: \"chips\",\n          options: [\n            { value: \"internal\", label: \"Internal / through\" },\n            { value: \"external\", label: \"External\" },\n            { value: \"dry\", label: \"Dry\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"high\" },\n        }),\n        cloneQuestion(\"priority\", {\n          label: \"What matters most in this slot?\",\n          helpText: \"Why it matters: this biases the ranking between process security, geometry quality, balanced performance and productivity.\",\n          type: \"chips\",\n          required: false,\n          group: \"advanced\",\n          options: [\n            { value: \"safety\", label: \"Process security\" },\n            { value: \"precision\", label: \"Accuracy / finish\" },\n            { value: \"balanced\", label: \"Balanced\" },\n            { value: \"productivity\", label: \"Productivity\" },\n          ],\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n        }),\n        cloneQuestion(\"condition_stage\", {\n          label: \"Which machining stage is this slot in?\",\n          helpText: \"Why it matters: roughing, semi-finishing and finishing slots tolerate very different engagement and strategy choices.\",\n          required: false,\n          group: \"advanced\",\n        }),\n        cloneQuestion(\"max_tool_diameter_mm\", {\n          label: \"Maximum allowed tool diameter\",\n          helpText: \"Why it matters: an explicit clearance limit makes access checks much more reliable for narrow or constrained slots.\",\n          group: \"advanced\",\n          expertOnly: true,\n        }),\n        cloneQuestion(\"slot_reach_mm\", {\n          label: \"Required slot reach\",\n          helpText: \"Why it matters: if the effective reach is longer than the slot depth, it changes neck-clearance and overhang risk materially.\",\n          group: \"advanced\",\n          expertOnly: true,\n        }),\n        cloneQuestion(\"tool_concept_preference\", {\n          label: \"Is the tool concept fixed?\",\n          helpText: \"Why it matters: slotting often splits between end-mill logic and dedicated slotting-cutter logic, even when the core model cannot prove every width detail canonically.\",\n          group: \"advanced\",\n          expertOnly: true,\n          options: [\n            { value: \"either\", label: \"Either\" },\n            { value: \"solid_carbide_only\", label: \"End mill / solid only\" },\n            { value: \"indexable_only\", label: \"Slotting cutter / indexable only\" },\n            { value: \"unknown\", label: \"Unknown\" },\n          ],\n        }),\n        cloneQuestion(\"slot_quality_target\", {\n          label: \"How demanding is the slot quality target?\",\n          helpText: \"Why it matters: finish-critical or keyway-like slots often need a rough-plus-finish mindset instead of trusting one aggressive full-slot pass.\",\n          group: \"advanced\",\n          expertOnly: true,\n          required: false,\n          type: \"chips\",\n          options: [\n            { value: \"rough_slot\", label: \"Rough slot\" },\n            { value: \"semi_finish\", label: \"Semi-finish\" },\n            { value: \"finish_critical\", label: \"Finish-critical\" },\n            { value: \"keyway_fit\", label: \"Keyway / tight width\" },\n          ],\n        }),\n        cloneQuestion(\"machine_torque_capability\", {\n          label: \"Is spindle power or torque a concern?\",\n          helpText: \"Why it matters: deep slots and productive open-slotting concepts can hit torque limits before the recipe band becomes useful.\",\n          group: \"machine\",\n          expertOnly: true,\n          required: false,\n        }),\n        cloneQuestion(\"cut_interruption\", {\n          label: \"Is there an interrupted skin or interrupted cut to expect?\",\n          helpText: \"Why it matters: interrupted entry or skin raises edge-chipping risk and makes one-pass slotting less credible.\",\n          group: \"safety\",\n          expertOnly: true,\n          required: false,\n          type: \"chips\",\n          options: [\n            { value: \"none\", label: \"None\" },\n            { value: \"light\", label: \"Light\" },\n            { value: \"heavy\", label: \"Heavy\" },\n          ],\n        }),\n      ];\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/slotting/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function average(values) {\n      var filtered = (values || []).filter(function keep(value) {\n        return value != null && Number.isFinite(value);\n      });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) {\n        return total + value;\n      }, 0) / filtered.length;\n    }\n    \n    function scoreToken(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function getAllowedCornerRadius(ctx) {\n      var need = getAnswer(ctx, \"corner_radius_need\");\n      var explicitRadius = toNullableNumber(getAnswer(ctx, \"max_corner_radius_mm\"));\n    \n      if (need === \"max_radius_defined\" && explicitRadius != null) return explicitRadius;\n      if (need === \"sharp\") return 0.1;\n      return null;\n    }\n    \n    function getCornerRequirementLabel(ctx, allowedRadius) {\n      var need = getAnswer(ctx, \"corner_radius_need\");\n      if (need === \"sharp\") return \"Sharp / as small as possible\";\n      if (need === \"max_radius_defined\" && allowedRadius != null) return \"Max corner radius \" + allowedRadius + \" mm\";\n      return \"Corner radius not critical\";\n    }\n    \n    function deriveTopologyClass(slotType, startState) {\n      if (slotType === \"non_linear\") return \"non_linear\";\n      if (slotType === \"open_linear\") return \"open_linear\";\n      if (slotType === \"one_side_open_linear\") return \"one_side_open_linear\";\n      if (slotType === \"closed_linear\" && startState === \"from_solid\") return \"closed_from_solid\";\n      if (slotType === \"closed_linear\") return \"closed_existing\";\n      return startState === \"from_solid\" ? \"closed_from_solid\" : \"closed_existing\";\n    }\n    \n    function getTopologyLabel(topologyClass) {\n      return {\n        open_linear: \"Open linear slot\",\n        one_side_open_linear: \"One-side-open slot\",\n        closed_from_solid: \"Closed slot from solid\",\n        closed_existing: \"Closed slot / existing groove\",\n        non_linear: \"Non-linear / curved slot\",\n      }[topologyClass] || \"Slot topology\";\n    }\n    \n    function normalizeExplicitConcept(value) {\n      if (value === \"solid_carbide_only\") return \"solid_carbide\";\n      if (value === \"indexable_only\") return \"indexable\";\n      return \"either\";\n    }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var fluteCount = getCandidateFluteCount(candidate);\n      var helixAngle = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neckDiameter = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var productText = [candidate.catalog && candidate.catalog.productTitle, candidate.catalog && candidate.catalog.variantTitle].join(\" \").toLowerCase();\n      var solidSignals = 0;\n      var indexableSignals = 0;\n    \n      if (diameter != null && diameter <= 16) solidSignals += 2;\n      if (diameter != null && diameter >= 22) indexableSignals += 2;\n      if (fluteCount != null && fluteCount >= 4) solidSignals += 1;\n      if (helixAngle != null && helixAngle >= 30) solidSignals += 1;\n      if (neckDiameter != null && diameter != null && neckDiameter < diameter) solidSignals += 1;\n      if (productText.indexOf(\"end mill\") >= 0 || productText.indexOf(\"solid\") >= 0 || productText.indexOf(\"plura\") >= 0) solidSignals += 1;\n      if (productText.indexOf(\"slot\") >= 0 || productText.indexOf(\"disc\") >= 0 || productText.indexOf(\"cutter\") >= 0 || productText.indexOf(\"body\") >= 0 || productText.indexOf(\"index\") >= 0) indexableSignals += 1;\n    \n      if (solidSignals >= indexableSignals + 2) return \"solid_carbide\";\n      if (indexableSignals >= solidSignals + 2) return \"indexable\";\n      return \"either\";\n    }\n    \n    function deriveSuggestedConcept(inputs) {\n      var solidBias = 0;\n      var indexableBias = 0;\n    \n      if (inputs.topologyClass === \"non_linear\") solidBias += 4;\n      if (inputs.topologyClass === \"closed_from_solid\" || inputs.topologyClass === \"closed_existing\") solidBias += 2;\n      if (inputs.priority === \"precision\") solidBias += 2;\n      if (inputs.qualityTarget === \"finish_critical\" || inputs.qualityTarget === \"keyway_fit\") solidBias += 2;\n      if (inputs.allowedCornerRadius != null && inputs.allowedCornerRadius <= 0.15) solidBias += 2;\n      if (inputs.stability === \"deep_slot_reach\" || inputs.stability === \"chatter_sensitive\") solidBias += 1;\n      if (inputs.materialCondition === \"work_hardening\" || inputs.materialCondition === \"hard_abrasive\") solidBias += 1;\n    \n      if (inputs.topologyClass === \"open_linear\" || inputs.topologyClass === \"one_side_open_linear\") indexableBias += 2;\n      if (inputs.priority === \"productivity\") indexableBias += 2;\n      if (inputs.slotWidth != null && inputs.slotWidth >= 14) indexableBias += 1;\n      if (inputs.depthRatio != null && inputs.depthRatio <= 2.2) indexableBias += 1;\n      if (inputs.qualityTarget === \"rough_slot\" && inputs.startState !== \"from_solid\") indexableBias += 1;\n    \n      if (solidBias >= indexableBias + 2) return \"solid_carbide\";\n      if (indexableBias >= solidBias + 2) return \"indexable\";\n      return \"either\";\n    }\n    \n    function evaluateConceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var score = 0.78;\n    \n      if (desiredConcept === \"either\" || candidateConcept === \"either\") score = 0.82;\n      else if (candidateConcept === desiredConcept) score = explicitConcept === \"either\" ? 0.9 : 1;\n      else score = explicitConcept === \"either\" ? 0.6 : 0.35;\n    \n      return {\n        score: score,\n        className: score >= 0.9 ? \"strong\" : score >= 0.7 ? \"usable\" : \"conditional\",\n      };\n    }\n    \n    function evaluateAxialDepthFit(requestedDepth, band) {\n      var min = toNullableNumber(band && band.min);\n      var typ = toNullableNumber(band && band.typ);\n      var max = toNullableNumber(band && band.max);\n      var upper = max != null ? max : (typ != null ? typ * 2.2 : (min != null ? min * 2 : null));\n      var lower = min != null ? min : 0;\n      var overflowRatio;\n      var score;\n    \n      if (requestedDepth == null) {\n        return { score: 0.5, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      }\n      if (upper == null) {\n        return { score: 0.6, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      }\n      if (requestedDepth > upper) {\n        overflowRatio = upper > 0 ? (requestedDepth - upper) / upper : 1;\n        score = clamp(0.72 - overflowRatio * 0.35, 0.15, 0.72);\n        return {\n          score: score,\n          className: overflowRatio <= 0.35 ? \"conditional\" : overflowRatio <= 1.35 ? \"heavy\" : \"over\",\n          hardFail: overflowRatio > 1.35,\n          min: min,\n          typ: typ,\n          max: max,\n          upper: upper,\n        };\n      }\n      if (typ != null && requestedDepth > typ) {\n        score = clamp(1 - ((requestedDepth - typ) / Math.max((upper - typ) || typ || 1, 1)) * 0.22, 0.82, 1);\n        return { score: score, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      }\n      if (requestedDepth >= lower) {\n        return { score: 0.94, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      }\n      return { score: 0.84, className: \"light\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n    }\n    \n    function evaluateRadialFit(requestedAePct, band, options) {\n      var min = toNullableNumber(band && band.min);\n      var typ = toNullableNumber(band && band.typ);\n      var max = toNullableNumber(band && band.max);\n      var upper = max != null ? max : (typ != null ? typ : min);\n      var lower = min != null ? min : 0;\n      var overflowRatio;\n      var score;\n      var strategyManaged = !!(options && options.strategyManaged);\n      var slotWidthToToolRatio = toNullableNumber(options && options.slotWidthToToolRatio);\n    \n      if (requestedAePct == null) {\n        return { score: 0.5, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max };\n      }\n      if (upper == null) {\n        return { score: 0.58, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max };\n      }\n      if (requestedAePct > upper) {\n        overflowRatio = upper > 0 ? (requestedAePct - upper) / upper : 1;\n        if (strategyManaged) {\n          score = clamp(\n            0.52 -\n            Math.max(overflowRatio - 0.5, 0) * 0.08 +\n            clamp(((slotWidthToToolRatio || 1) - 1) / 0.6, 0, 1) * 0.18,\n            0.28,\n            0.74\n          );\n          return {\n            score: score,\n            className: overflowRatio <= 1.8 ? \"conditional\" : \"heavy\",\n            hardFail: false,\n            min: min,\n            typ: typ,\n            max: max,\n          };\n        }\n        score = clamp(0.58 - overflowRatio * 0.95, 0, 0.58);\n        return {\n          score: score,\n          className: overflowRatio <= 0.2 ? \"conditional\" : \"over\",\n          hardFail: overflowRatio > 0.2,\n          min: min,\n          typ: typ,\n          max: max,\n        };\n      }\n      if (typ != null && requestedAePct > typ) {\n        score = clamp(1 - ((requestedAePct - typ) / Math.max((upper - typ) || typ || 1, 1)) * 0.25, 0.78, 1);\n        return { score: score, className: \"good\", hardFail: false, min: min, typ: typ, max: max };\n      }\n      if (requestedAePct >= lower) {\n        return { score: 0.94, className: \"good\", hardFail: false, min: min, typ: typ, max: max };\n      }\n      return { score: 0.86, className: \"light\", hardFail: false, min: min, typ: typ, max: max };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 5) return 1;\n      if (margin >= 2) return 0.88;\n      if (margin >= 0.5) return 0.74;\n      if (margin >= 0) return 0.58;\n      if (margin >= -1) return 0.2;\n      return 0;\n    }\n    \n    function evaluateCornerRadius(candidateCornerRadius, allowedCornerRadius) {\n      if (allowedCornerRadius == null) {\n        return { score: 0.86, fits: true, hardFail: false };\n      }\n      if (candidateCornerRadius == null) {\n        return { score: 0.2, fits: false, hardFail: true };\n      }\n      if (candidateCornerRadius <= allowedCornerRadius) {\n        return { score: 1, fits: true, hardFail: false };\n      }\n      return { score: 0, fits: false, hardFail: true };\n    }\n    \n    function evaluateAccessFit(inputs, candidate) {\n      var candidateDiameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var usableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n      var neckDiameter = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var score = scoreToken(inputs.topologyClass, {\n        open_linear: 0.92,\n        one_side_open_linear: 0.82,\n        closed_existing: 0.74,\n        closed_from_solid: 0.66,\n        non_linear: 0.72,\n      }, 0.72);\n    \n      if (inputs.maxToolDiameter != null && candidateDiameter != null && candidateDiameter > inputs.maxToolDiameter) {\n        return { score: 0, className: \"poor\" };\n      }\n      if (inputs.reachRequirement != null && usableLength != null && usableLength < inputs.reachRequirement) {\n        score -= 0.16;\n      }\n      if ((inputs.topologyClass === \"closed_from_solid\" || inputs.topologyClass === \"non_linear\") && neckDiameter != null && candidateDiameter != null) {\n        score += neckDiameter < candidateDiameter ? 0.08 : -0.08;\n      }\n      if (inputs.topologyClass === \"non_linear\" && candidateDiameter != null && inputs.slotWidth != null && candidateDiameter > inputs.slotWidth) {\n        score -= 0.15;\n      }\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.78 ? \"good\" : score >= 0.54 ? \"conditional\" : \"poor\",\n      };\n    }\n    \n    function classifyChipEvacuationSeverity(inputs, candidate) {\n      var candidateHasTsc = candidate.common && candidate.common.coolantTsc === true;\n      var score = 0;\n    \n      score += scoreToken(inputs.materialCondition, {\n        standard: 0.08,\n        tough_long_chipping: 0.18,\n        sticky_bue: 0.22,\n        work_hardening: 0.28,\n        hard_abrasive: 0.26,\n        unknown: 0.16,\n      }, 0.16);\n      score += scoreToken(inputs.topologyClass, {\n        open_linear: 0.04,\n        one_side_open_linear: 0.08,\n        closed_existing: 0.18,\n        closed_from_solid: 0.28,\n        non_linear: 0.16,\n      }, 0.14);\n      score += clamp((inputs.depthRatio || 0) / 4.5, 0, 1) * 0.24;\n      score += scoreToken(inputs.coolantCapability, {\n        internal: candidateHasTsc ? 0 : 0.03,\n        external: 0.08,\n        dry: 0.18,\n        unknown: 0.12,\n      }, 0.12);\n    \n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.7 ? \"critical\" : score >= 0.5 ? \"high\" : score >= 0.26 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyChatterRisk(inputs) {\n      var score = 0;\n    \n      score += scoreToken(inputs.stability, {\n        stable: 0,\n        normal: 0.12,\n        deep_slot_reach: 0.28,\n        chatter_sensitive: 0.36,\n      }, 0.14);\n      score += scoreToken(inputs.topologyClass, {\n        open_linear: 0.04,\n        one_side_open_linear: 0.08,\n        closed_existing: 0.14,\n        closed_from_solid: 0.22,\n        non_linear: 0.18,\n      }, 0.1);\n      score += clamp((inputs.depthRatio || 0) / 5, 0, 1) * 0.22;\n      score += scoreToken(inputs.materialCondition, {\n        standard: 0.02,\n        tough_long_chipping: 0.08,\n        sticky_bue: 0.08,\n        work_hardening: 0.12,\n        hard_abrasive: 0.12,\n        unknown: 0.06,\n      }, 0.06);\n      score += scoreToken(inputs.cutInterruption, {\n        none: 0,\n        light: 0.05,\n        heavy: 0.12,\n      }, 0.02);\n    \n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.62 ? \"high\" : score >= 0.3 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyCoolantSupport(inputs, candidate) {\n      var candidateHasTsc = candidate.common && candidate.common.coolantTsc === true;\n    \n      if (!inputs.coolantCapability || inputs.coolantCapability === \"unknown\") return { score: 0.54, className: \"unknown\" };\n      if (inputs.coolantCapability === \"internal\") return { score: candidateHasTsc ? 1 : 0.62, className: candidateHasTsc ? \"strong\" : \"conditional\" };\n      if (inputs.coolantCapability === \"external\") return { score: 0.74, className: \"acceptable\" };\n      if (inputs.coolantCapability === \"dry\") return { score: inputs.materialCondition === \"standard\" ? 0.52 : 0.36, className: \"limited\" };\n      return { score: 0.54, className: \"unknown\" };\n    }\n    \n    function deriveStrategyClass(inputs) {\n      var difficultMaterial = inputs.materialCondition === \"work_hardening\" || inputs.materialCondition === \"hard_abrasive\" || inputs.materialCondition === \"sticky_bue\" || inputs.materialCondition === \"tough_long_chipping\";\n      var finishDemand = inputs.qualityTarget === \"finish_critical\" || inputs.qualityTarget === \"keyway_fit\" || inputs.priority === \"precision\";\n      var trochoidalEligible = inputs.toolToWidthRatio != null && inputs.toolToWidthRatio <= 0.7;\n    \n      if ((inputs.stability === \"deep_slot_reach\" || inputs.machineTorque === \"low\") && inputs.depthRatio != null && inputs.depthRatio >= 3.5) {\n        return { className: \"plunge\", trochoidalEligible: trochoidalEligible };\n      }\n      if ((inputs.topologyClass === \"closed_from_solid\" || inputs.topologyClass === \"non_linear\" || difficultMaterial || inputs.stability === \"chatter_sensitive\") && trochoidalEligible) {\n        return { className: \"trochoidal\", trochoidalEligible: true };\n      }\n      if (finishDemand && (inputs.startState === \"from_solid\" || inputs.topologyClass === \"closed_from_solid\" || inputs.allowedCornerRadius != null && inputs.allowedCornerRadius <= 0.1)) {\n        return { className: \"rough_plus_finish\", trochoidalEligible: trochoidalEligible };\n      }\n      return { className: \"conventional_full_slot\", trochoidalEligible: trochoidalEligible };\n    }\n    \n    function usesStrategyManagedWidthModel(strategyClass, topologyClass, slotWidthToToolRatio) {\n      if (slotWidthToToolRatio == null || slotWidthToToolRatio <= 1.05) return false;\n      if (strategyClass === \"trochoidal\" || strategyClass === \"rough_plus_finish\" || strategyClass === \"plunge\") return true;\n      return topologyClass === \"non_linear\" && slotWidthToToolRatio > 1.1;\n    }\n    \n    function evaluateQualityFit(inputs, strategyClass, candidateConcept, cornerRadiusFit) {\n      var qualityTarget = inputs.qualityTarget || \"rough_slot\";\n    \n      if (qualityTarget === \"rough_slot\") {\n        return { score: 0.9, className: \"good\" };\n      }\n      if (qualityTarget === \"semi_finish\") {\n        return { score: strategyClass === \"plunge\" ? 0.56 : 0.82, className: strategyClass === \"plunge\" ? \"conditional\" : \"good\" };\n      }\n      if (qualityTarget === \"finish_critical\" || qualityTarget === \"keyway_fit\") {\n        if (strategyClass === \"rough_plus_finish\") return { score: 1, className: \"good\" };\n        if (candidateConcept === \"solid_carbide\" && cornerRadiusFit.fits) return { score: 0.82, className: \"conditional\" };\n        return { score: 0.48, className: \"low\" };\n      }\n      return { score: 0.78, className: \"conditional\" };\n    }\n    \n    function scoreStageFit(requestedStage, row) {\n      var rowStage = row && row.constraints ? row.constraints.conditionStage : null;\n      if (!requestedStage || !rowStage) return 0.76;\n      if (requestedStage === rowStage) return 1;\n      if (rowStage === \"semi-finishing\") return 0.84;\n      return 0.62;\n    }\n    \n    function getPriorityBias(priority, metrics) {\n      if (priority === \"precision\") {\n        return average([metrics.cornerRadiusFitScore, metrics.qualityFitScore, metrics.accessFitScore]) * 0.45;\n      }\n      if (priority === \"safety\") {\n        return average([metrics.reachReserveScore, 1 - metrics.chipEvacuationSeverityScore, 1 - metrics.chatterRiskScore]) * 0.45;\n      }\n      if (priority === \"productivity\") {\n        return average([metrics.engagementFitScore, metrics.toolConceptScore, metrics.coolantSupportScore]) * 0.45;\n      }\n      return 0.32;\n    }\n    \n    function computeRpm(vcTyp, diameter) {\n      if (vcTyp == null || diameter == null || diameter <= 0) return null;\n      return (1000 * vcTyp) / (Math.PI * diameter);\n    }\n    \n    function computeFeed(fzTyp, rpm, fluteCount) {\n      if (fzTyp == null || rpm == null || fluteCount == null || fluteCount <= 0) return null;\n      return fzTyp * rpm * fluteCount;\n    }\n    \n    function computeMrr(ap, ae, feed) {\n      if (ap == null || ae == null || feed == null) return null;\n      return (ap * ae * feed) / 1000;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"slotting\", ctx, toolkits));\n      var slotWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var slotDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var allowedCornerRadius = getAllowedCornerRadius(ctx);\n      var topologyClass = deriveTopologyClass(getAnswer(ctx, \"slot_type\"), getAnswer(ctx, \"slot_start_state\"));\n    \n      derived.requested_slot_width_mm = slotWidth;\n      derived.requested_slot_depth_mm = slotDepth;\n      derived.allowed_corner_radius_mm = allowedCornerRadius;\n      derived.corner_radius_requirement_label = getCornerRequirementLabel(ctx, allowedCornerRadius);\n      derived.slot_depth_ratio = slotWidth != null && slotDepth != null && slotWidth > 0 ? slotDepth / slotWidth : null;\n      derived.slot_topology_class = topologyClass;\n      derived.slot_topology_label = getTopologyLabel(topologyClass);\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"slotting\", ctx);\n      var slotWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var slotDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var slotDepthRatio = slotWidth != null && slotDepth != null && slotWidth > 0 ? slotDepth / slotWidth : null;\n      var topologyClass = deriveTopologyClass(getAnswer(ctx, \"slot_type\"), getAnswer(ctx, \"slot_start_state\"));\n      var coolantCapability = getAnswer(ctx, \"coolant_capability\");\n      var toolConceptPreference = normalizeExplicitConcept(getAnswer(ctx, \"tool_concept_preference\"));\n      var qualityTarget = getAnswer(ctx, \"slot_quality_target\");\n    \n      if (slotDepthRatio != null && slotDepthRatio > 4) {\n        issues.push({\n          field: \"feature_depth_mm\",\n          message: \"This is a deep slot and should be treated as a reach-, evacuation- and vibration-sensitive case.\",\n          severity: \"warning\",\n          code: \"deep_slot_ratio_high\",\n        });\n      }\n      if (topologyClass === \"closed_from_solid\" && (coolantCapability === \"dry\" || coolantCapability === \"unknown\")) {\n        issues.push({\n          field: \"coolant_capability\",\n          message: \"Closed slotting from solid with weak coolant support narrows the release window substantially.\",\n          severity: \"warning\",\n          code: \"closed_slot_weak_coolant\",\n        });\n      }\n      if (topologyClass === \"non_linear\" && toolConceptPreference === \"indexable\") {\n        issues.push({\n          field: \"tool_concept_preference\",\n          message: \"A non-linear slot usually points back toward end-mill logic rather than a dedicated slotting-cutter route.\",\n          severity: \"warning\",\n          code: \"non_linear_indexable_conflict\",\n        });\n      }\n      if ((qualityTarget === \"finish_critical\" || qualityTarget === \"keyway_fit\") && getAnswer(ctx, \"slot_start_state\") === \"from_solid\") {\n        issues.push({\n          field: \"slot_quality_target\",\n          message: \"Finish-critical slots from solid often need a rough-plus-finish route instead of one aggressive full-slot pass.\",\n          severity: \"warning\",\n          code: \"finish_split_recommended\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"slotting\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var slotWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var slotDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var topologyClass = deriveTopologyClass(getAnswer(ctx, \"slot_type\"), getAnswer(ctx, \"slot_start_state\"));\n      var allowedCornerRadius = getAllowedCornerRadius(ctx);\n      var materialCondition = getAnswer(ctx, \"material_condition_class\");\n      var stability = getAnswer(ctx, \"setup_stability\");\n      var coolantCapability = getAnswer(ctx, \"coolant_capability\");\n      var priority = getAnswer(ctx, \"priority\") || \"balanced\";\n      var conditionStage = getAnswer(ctx, \"condition_stage\");\n      var maxToolDiameter = toNullableNumber(getAnswer(ctx, \"max_tool_diameter_mm\"));\n      var reachRequirement = toNullableNumber(getAnswer(ctx, \"slot_reach_mm\")) || slotDepth;\n      var explicitConcept = normalizeExplicitConcept(getAnswer(ctx, \"tool_concept_preference\"));\n      var qualityTarget = getAnswer(ctx, \"slot_quality_target\") || \"rough_slot\";\n      var machineTorque = getAnswer(ctx, \"machine_torque_capability\");\n      var cutInterruption = getAnswer(ctx, \"cut_interruption\");\n      var startState = getAnswer(ctx, \"slot_start_state\");\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var row = recipeResult.row || rows[0] || null;\n        var recipe = recipeResult.recipe || {};\n        var candidateDiameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var candidateUsableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var candidateApmx = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var candidateCornerRadius = toNullableNumber(candidate.milling && candidate.milling.cornerRadiusMm);\n        var candidateFluteCount = getCandidateFluteCount(candidate);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var requestedAePct = slotWidth != null && candidateDiameter != null && candidateDiameter > 0 ? (slotWidth / candidateDiameter) * 100 : null;\n        var slotWidthToToolRatio = slotWidth != null && candidateDiameter != null && candidateDiameter > 0 ? slotWidth / candidateDiameter : null;\n        var toolToWidthRatio = slotWidth != null && candidateDiameter != null && slotWidth > 0 ? candidateDiameter / slotWidth : null;\n        var depthRatio = slotWidth != null && slotDepth != null && slotWidth > 0 ? slotDepth / slotWidth : null;\n        var axialDepthFit = evaluateAxialDepthFit(slotDepth, recipe.ap);\n        var reachMargin = candidateUsableLength != null && slotDepth != null ? candidateUsableLength - slotDepth : null;\n        var apmxMargin = candidateApmx != null && slotDepth != null ? candidateApmx - slotDepth : null;\n        var cornerRadiusFit = evaluateCornerRadius(candidateCornerRadius, allowedCornerRadius);\n        var suggestedConcept = explicitConcept === \"either\"\n          ? deriveSuggestedConcept({\n              topologyClass: topologyClass,\n              priority: priority,\n              qualityTarget: qualityTarget,\n              allowedCornerRadius: allowedCornerRadius,\n              stability: stability,\n              materialCondition: materialCondition,\n              slotWidth: slotWidth,\n              depthRatio: depthRatio,\n              startState: startState,\n            })\n          : explicitConcept;\n        var conceptFit = evaluateConceptFit(candidateConcept, suggestedConcept, explicitConcept);\n        var accessFit = evaluateAccessFit({\n          topologyClass: topologyClass,\n          maxToolDiameter: maxToolDiameter,\n          reachRequirement: reachRequirement,\n          slotWidth: slotWidth,\n        }, candidate);\n        var chipSeverity = classifyChipEvacuationSeverity({\n          materialCondition: materialCondition,\n          topologyClass: topologyClass,\n          depthRatio: depthRatio,\n          coolantCapability: coolantCapability,\n        }, candidate);\n        var chatterRisk = classifyChatterRisk({\n          stability: stability,\n          topologyClass: topologyClass,\n          depthRatio: depthRatio,\n          materialCondition: materialCondition,\n          cutInterruption: cutInterruption,\n        });\n        var coolantSupport = classifyCoolantSupport({\n          coolantCapability: coolantCapability,\n          materialCondition: materialCondition,\n        }, candidate);\n        var strategy = deriveStrategyClass({\n          topologyClass: topologyClass,\n          materialCondition: materialCondition,\n          stability: stability,\n          coolantCapability: coolantCapability,\n          slotWidthToToolRatio: slotWidthToToolRatio,\n          toolToWidthRatio: toolToWidthRatio,\n          depthRatio: depthRatio,\n          qualityTarget: qualityTarget,\n          priority: priority,\n          startState: startState,\n          allowedCornerRadius: allowedCornerRadius,\n          machineTorque: machineTorque,\n        });\n        var strategyManagedWidthModel = usesStrategyManagedWidthModel(strategy.className, topologyClass, slotWidthToToolRatio);\n        var radialFit = evaluateRadialFit(requestedAePct, recipe.aePct, {\n          strategyManaged: strategyManagedWidthModel,\n          slotWidthToToolRatio: slotWidthToToolRatio,\n        });\n        var qualityFit = evaluateQualityFit({\n          qualityTarget: qualityTarget,\n          priority: priority,\n        }, strategy.className, candidateConcept, cornerRadiusFit);\n        var reachReserveScore = average([marginScore(reachMargin), marginScore(apmxMargin)]);\n        var stageFitScore = scoreStageFit(conditionStage, row);\n        var widthModelBoundary = suggestedConcept === \"indexable\" && (topologyClass === \"open_linear\" || topologyClass === \"one_side_open_linear\") && slotWidth != null && slotWidth >= 10;\n        var hardRejectReason = null;\n        var metrics;\n        var parts;\n        var total;\n        var confidence;\n        var rpmTyp = computeRpm(toNullableNumber(recipe.vc && recipe.vc.typ), candidateDiameter);\n        var feedTyp = computeFeed(toNullableNumber(recipe.fz && recipe.fz.typ), rpmTyp, candidateFluteCount);\n        var mrrTyp = computeMrr(slotDepth, slotWidth, feedTyp);\n        var priorityBias;\n        var riskPenalty;\n    \n        if (!rows.length) {\n          hardRejectReason = \"No valid slotting row is available for this material and process context.\";\n        }\n        if (!hardRejectReason && radialFit.hardFail) {\n          hardRejectReason = \"Requested slot width pushes radial engagement outside the credible slotting recipe window.\";\n        }\n        if (!hardRejectReason && axialDepthFit.hardFail) {\n          hardRejectReason = \"Requested slot depth exceeds a credible slotting window even with repeated step-down logic.\";\n        }\n        if (!hardRejectReason && reachMargin != null && reachMargin < 0) {\n          hardRejectReason = \"Usable length is shorter than the requested slot depth.\";\n        }\n        if (!hardRejectReason && apmxMargin != null && apmxMargin < 0) {\n          hardRejectReason = \"APMX is shorter than the requested slot depth.\";\n        }\n        if (!hardRejectReason && maxToolDiameter != null && candidateDiameter != null && candidateDiameter > maxToolDiameter) {\n          hardRejectReason = \"Tool diameter exceeds the stated clearance limit for this slot.\";\n        }\n        if (!hardRejectReason && cornerRadiusFit.hardFail) {\n          hardRejectReason = \"Candidate corner radius exceeds the allowed slot-bottom radius.\";\n        }\n    \n        metrics = {\n          requestedSlotWidthMm: slotWidth,\n          requestedSlotDepthMm: slotDepth,\n          requestedAePct: requestedAePct,\n          slotDepthRatio: depthRatio,\n          slotWidthToToolRatio: slotWidthToToolRatio,\n          trochoidalToolRatio: toolToWidthRatio,\n          requestedTopologyClass: topologyClass,\n          requestedTopologyLabel: getTopologyLabel(topologyClass),\n          requestedStartState: startState,\n          requestedQualityTarget: qualityTarget,\n          requestedPriority: priority,\n          requestedConditionStage: conditionStage,\n          allowedCornerRadiusMm: allowedCornerRadius,\n          cornerRequirementLabel: getCornerRequirementLabel(ctx, allowedCornerRadius),\n          candidateCornerRadiusMm: candidateCornerRadius,\n          candidateDiameterMm: candidateDiameter,\n          candidateUsableLengthMm: candidateUsableLength,\n          candidateApmxMm: candidateApmx,\n          candidateFluteCount: candidateFluteCount,\n          candidateHelixAngleDeg: toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg),\n          candidateNeckDiameterMm: toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm),\n          maxToolDiameterMm: maxToolDiameter,\n          reachRequirementMm: reachRequirement,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          rowCoolantMode: row && row.constraints ? row.constraints.coolantMode : null,\n          rowRecipeKind: row && row.familyData ? row.familyData.recipeRowKind : null,\n          recipeVcMin: toNullableNumber(recipe.vc && recipe.vc.min),\n          recipeVcTyp: toNullableNumber(recipe.vc && recipe.vc.typ),\n          recipeVcMax: toNullableNumber(recipe.vc && recipe.vc.max),\n          recipeFzMin: toNullableNumber(recipe.fz && recipe.fz.min),\n          recipeFzTyp: toNullableNumber(recipe.fz && recipe.fz.typ),\n          recipeFzMax: toNullableNumber(recipe.fz && recipe.fz.max),\n          recipeApMin: axialDepthFit.min,\n          recipeApTyp: axialDepthFit.typ,\n          recipeApMax: axialDepthFit.max,\n          recipeApUpperMm: axialDepthFit.upper,\n          recipeAePctMin: radialFit.min,\n          recipeAePctTyp: radialFit.typ,\n          recipeAePctMax: radialFit.max,\n          recipeApFitClass: axialDepthFit.className,\n          recipeApFitScore: axialDepthFit.score,\n          recipeAeFitClass: radialFit.className,\n          recipeAeFitScore: radialFit.score,\n          reachMarginMm: reachMargin,\n          apmxMarginMm: apmxMargin,\n          reachReserveScore: reachReserveScore,\n          cornerRadiusFit: cornerRadiusFit.fits,\n          cornerRadiusFitScore: cornerRadiusFit.score,\n          accessFitClass: accessFit.className,\n          accessFitScore: accessFit.score,\n          toolConceptGuess: candidateConcept,\n          toolConceptDesired: suggestedConcept,\n          toolConceptExplicit: explicitConcept,\n          toolConceptFitClass: conceptFit.className,\n          toolConceptScore: conceptFit.score,\n          chipEvacuationSeverityClass: chipSeverity.className,\n          chipEvacuationSeverityScore: chipSeverity.score,\n          chatterRiskClass: chatterRisk.className,\n          chatterRiskScore: chatterRisk.score,\n          coolantSupportClass: coolantSupport.className,\n          coolantSupportScore: coolantSupport.score,\n          strategyClass: strategy.className,\n          trochoidalEligibleFlag: strategy.trochoidalEligible,\n          strategyManagedWidthModelFlag: strategyManagedWidthModel,\n          widthModelBoundaryFlag: widthModelBoundary,\n          qualityFitClass: qualityFit.className,\n          qualityFitScore: qualityFit.score,\n          cutInterruption: cutInterruption,\n          rpmTyp: rpmTyp,\n          feedTypMmMin: feedTyp,\n          mrrTyp: mrrTyp,\n        };\n        Object.assign(metrics, recipeResult.debug || {});\n    \n        metrics.engagementFitScore = average([axialDepthFit.score, radialFit.score]);\n        priorityBias = getPriorityBias(priority, metrics);\n        riskPenalty = clamp(\n          chipSeverity.score * 0.45 +\n          chatterRisk.score * 0.28 +\n          (widthModelBoundary ? 0.1 : 0) +\n          (qualityFit.className === \"low\" ? 0.12 : qualityFit.className === \"conditional\" ? 0.04 : 0) +\n          (cutInterruption === \"heavy\" ? 0.08 : cutInterruption === \"light\" ? 0.03 : 0),\n          0,\n          1\n        );\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.15,\n          process: kernel.processFit(candidate, ctx) * 1.1,\n          engagement: metrics.engagementFitScore * 2.2,\n          reach: reachReserveScore * 1.55,\n          cornerRadius: cornerRadiusFit.score * 1.45,\n          access: accessFit.score * 1.05,\n          toolConcept: conceptFit.score * 1.15,\n          chipControl: (1 - chipSeverity.score) * 1.35,\n          stability: (1 - chatterRisk.score) * 1.15,\n          quality: qualityFit.score * 0.95,\n          coolant: coolantSupport.score * 0.6,\n          stage: stageFitScore * 0.55,\n          priorityBias: priorityBias,\n          riskPenalty: -riskPenalty,\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.82 : recipeResult.source === \"estimated\" ? 0.68 : 0.48;\n        confidence -= chipSeverity.className === \"critical\" ? 0.1 : chipSeverity.className === \"high\" ? 0.06 : 0;\n        confidence -= chatterRisk.className === \"high\" ? 0.08 : chatterRisk.className === \"medium\" ? 0.03 : 0;\n        confidence -= widthModelBoundary ? 0.05 : 0;\n        confidence = clamp(confidence, 0, 0.97);\n        if (hardRejectReason) confidence = 0;\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            metrics.engagementFitScore >= 0.82\n              ? \"Width and depth stay inside a credible slotting engagement window.\"\n              : \"Width or depth are close to the edge of the current slotting window.\",\n            chipSeverity.className === \"low\" || chipSeverity.className === \"medium\"\n              ? \"Chip evacuation stays within a controllable range for this slot.\"\n              : \"Chip evacuation is the main limiter in this slotting case.\",\n            strategy.className === \"trochoidal\"\n              ? \"The geometry and risk profile point toward a trochoidal slotting route.\"\n              : strategy.className === \"plunge\"\n                ? \"Reach or machine limits point toward plunge-style opening rather than direct full-slotting.\"\n                : strategy.className === \"rough_plus_finish\"\n                  ? \"The slot is more credible as a rough-plus-finish route than as a single aggressive pass.\"\n                  : \"A conventional slotting route still looks credible for this geometry.\",\n            conceptFit.className === \"strong\"\n              ? \"The cutter concept lines up well with the expected slotting route.\"\n              : \"Tool concept remains a trade-off between topology, finish and productivity.\",\n            strategyManagedWidthModel\n              ? \"The slot width is being treated as a strategy-managed path rather than as a literal full-width engagement.\"\n              : widthModelBoundary\n                ? \"A dedicated slotting-cutter route is technically plausible here, but exact width matching is not fully kernel-backed yet.\"\n                : \"The current width-to-tool relationship stays inside the cleaner end-mill-style model window.\",\n            widthModelBoundary\n              ? \"A dedicated slotting-cutter route is technically plausible here, but exact width matching is not fully kernel-backed yet.\"\n              : strategyManagedWidthModel\n                ? \"A finish-pass or trochoidal-style route keeps this slot inside a more credible runtime model.\"\n                : \"The current width-to-tool relationship stays inside the cleaner end-mill-style model window.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/tapping-blind/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/tapping-blind/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/tapping-blind/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/tapping-blind/presenter.js\");\n    exports.default = createStubProcessModule(\"tapping_blind\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/tapping-blind/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, threadIdentity, toleranceNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { getTroubleshootingEntries } = __bundle.require(\"core/troubleshooting-library.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function formatMaybeNumber(value, unit, digits) {\n      if (value == null || !Number.isFinite(value)) return \"n/a\";\n      return String(Math.round(value * Math.pow(10, digits == null ? 2 : digits)) / Math.pow(10, digits == null ? 2 : digits)) + (unit ? \" \" + unit : \"\");\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var precision = digits == null ? 2 : digits;\n      var rounded;\n      var fixed;\n      if (value == null || !Number.isFinite(value)) return null;\n      rounded = Math.round(value * Math.pow(10, precision)) / Math.pow(10, precision);\n      fixed = rounded.toFixed(precision);\n      return precision > 0 ? fixed.replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\") : fixed;\n    }\n    \n    function formatPriceLabel(priceCents) {\n      if (priceCents == null || !Number.isFinite(priceCents)) return \"Price on request\";\n      return \"EUR \" + (priceCents / 100).toFixed(2);\n    }\n    \n    function humanizeToken(value) {\n      return value == null ? \"\" : String(value).replace(/_/g, \" \");\n    }\n    \n    function titleCase(value) {\n      var text = humanizeToken(value);\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function getThreadLengthMm(metrics) {\n      return metrics && metrics.threadLengthMm != null\n        ? metrics.threadLengthMm\n        : metrics && metrics.requiredFullThreadLengthMm != null\n          ? metrics.requiredFullThreadLengthMm\n          : null;\n    }\n    \n    function getDepthRatio(metrics) {\n      return metrics && metrics.threadDepthRatio != null\n        ? metrics.threadDepthRatio\n        : metrics && metrics.requiredDepthRatio != null\n          ? metrics.requiredDepthRatio\n          : null;\n    }\n    \n    function getMaterialGroup(metrics, ctx) {\n      if (metrics && metrics.materialGroup) return String(metrics.materialGroup).toUpperCase();\n      if (ctx && ctx.material && ctx.material.subgroupCode) return String(ctx.material.subgroupCode).toUpperCase().charAt(0);\n      return null;\n    }\n    \n    function getMaterialProfile(ctx) {\n      return ctx && ctx.material ? ctx.material.profile || null : null;\n    }\n    \n    function getMaterialDisplayName(ctx) {\n      var material = ctx && ctx.material ? ctx.material : {};\n      var code = material && material.subgroupCode ? String(material.subgroupCode) : \"\";\n      var label = material && material.subgroupLabel ? String(material.subgroupLabel) : \"\";\n      if (code && label && label !== code) return code + \" - \" + label;\n      return code || label || \"selected material\";\n    }\n    \n    function ensureSentence(value) {\n      var text = String(value || \"\").trim();\n      if (!text) return null;\n      return /[.!?]$/.test(text) ? text : text + \".\";\n    }\n    \n    function hasHighTendency(value) {\n      return String(value || \"\").toLowerCase().indexOf(\"high\") >= 0;\n    }\n    \n    function formatProfileCoolant(profile) {\n      var parts = [];\n      if (!profile) return null;\n      if (profile.preferredCoolant) parts.push(String(profile.preferredCoolant).toLowerCase());\n      if (profile.coolantPressureBar) parts.push(String(profile.coolantPressureBar) + \" bar\");\n      return parts.join(\" / \");\n    }\n    \n    function formatProfileFact(value) {\n      return value ? humanizeToken(value).toLowerCase() : null;\n    }\n    \n    function cleanShortText(value) {\n      return String(value == null ? \"\" : value).trim().replace(/[.;:]+$/, \"\");\n    }\n    \n    function formatTroubleshootingFocusLabel(value) {\n      switch (String(value || \"\").toLowerCase()) {\n        case \"workholding\":\n          return \"Clamping and holder\";\n        case \"machine power\":\n          return \"Machine load\";\n        case \"pre-processing\":\n          return \"Hole preparation\";\n        default:\n          return titleCase(value);\n      }\n    }\n    \n    function getTroubleshootingTone(entry) {\n      switch (String(entry && entry.problemCategory || \"\").toLowerCase()) {\n        case \"process stability\":\n          return \"process\";\n        case \"workpiece quality\":\n          return \"quality\";\n        case \"tool life\":\n          return \"tool\";\n        default:\n          return \"default\";\n      }\n    }\n    \n    function appendUniqueHandle(handles, handle) {\n      if (!handle || handles.indexOf(handle) >= 0) return;\n      handles.push(handle);\n    }\n    \n    function buildTroubleshootingHandles(ctx, top, materialProfile) {\n      var metrics = top.metrics || {};\n      var handles = [];\n      var problemHistory = String(metrics.problemHistory || \"\").toLowerCase();\n      var weakLubrication = metrics.coolantMode === \"Dry\" || metrics.coolantMode === \"Unknown coolant mode\";\n    \n      switch (problemHistory) {\n        case \"tap_breakage\":\n          appendUniqueHandle(handles, \"tap-breaks-in-hole\");\n          break;\n        case \"chip_packing\":\n          appendUniqueHandle(handles, \"chips-pack-in-deep-holes\");\n          break;\n        case \"built_up_edge\":\n          appendUniqueHandle(handles, \"thread-flanks-with-built-up-edge-or-smearing\");\n          break;\n        case \"gauge_failure\":\n          appendUniqueHandle(handles, \"thread-out-of-tolerance-core-hole-too-small-large\");\n          appendUniqueHandle(handles, \"thread-flanks-uneven-profile-incorrect\");\n          break;\n        case \"bottom_contact\":\n          appendUniqueHandle(handles, \"tap-breaks-in-hole\");\n          appendUniqueHandle(handles, \"thread-flanks-uneven-profile-incorrect\");\n          break;\n        case \"high_torque\":\n          appendUniqueHandle(handles, \"tap-breaks-in-hole\");\n          appendUniqueHandle(handles, \"spindle-at-power-limit-or-stalls\");\n          break;\n        default:\n          break;\n      }\n    \n      if (metrics.bottomRiskClass === \"critical\" || metrics.bottomClearanceClass === \"high\") {\n        appendUniqueHandle(handles, \"tap-breaks-in-hole\");\n        appendUniqueHandle(handles, \"chips-pack-in-deep-holes\");\n      }\n      if (metrics.predrillDeltaMm != null && Math.abs(metrics.predrillDeltaMm) > 0.08) {\n        appendUniqueHandle(handles, \"thread-out-of-tolerance-core-hole-too-small-large\");\n      }\n      if (metrics.loadClass === \"high\") {\n        appendUniqueHandle(handles, \"tap-breaks-in-hole\");\n      }\n      if (weakLubrication && materialProfile && hasHighTendency(materialProfile.buildUpEdgeTendency)) {\n        appendUniqueHandle(handles, \"thread-flanks-with-built-up-edge-or-smearing\");\n      }\n    \n      return handles;\n    }\n    \n    function buildTroubleshootingCards(ctx, top) {\n      var materialProfile = getMaterialProfile(ctx);\n      return getTroubleshootingEntries(buildTroubleshootingHandles(ctx, top, materialProfile)).slice(0, 2).map(function mapEntry(entry) {\n        var focusFlags = [];\n        if (entry.rootWorkholding) focusFlags.push(\"workholding\");\n        if (entry.rootMachinePower) focusFlags.push(\"machine power\");\n        if (entry.rootPreprocessing) focusFlags.push(\"pre-processing\");\n    \n        return {\n          title: entry.problem,\n          tone: getTroubleshootingTone(entry),\n          eyebrow: \"Focused response\",\n          category: entry.problemCategory || \"Troubleshooting\",\n          wear: entry.dominantToolWear || null,\n          checkFirst: focusFlags.map(formatTroubleshootingFocusLabel),\n          cause: ensureSentence(entry.cause),\n          actions: (entry.actions || []).slice(0, 4).map(cleanShortText).filter(Boolean),\n          note: entry.alternativeProcess ? ensureSentence(entry.alternativeProcess) : null,\n          items: dedupeTextItems([\n            entry.problemCategory ? \"Category: \" + entry.problemCategory + \".\" : null,\n            entry.dominantToolWear ? \"Dominant wear: \" + entry.dominantToolWear + \".\" : null,\n            focusFlags.length ? \"Primary check: \" + focusFlags.join(\", \") + \".\" : null,\n            entry.cause ? \"Likely cause: \" + ensureSentence(entry.cause) : null,\n            entry.actions && entry.actions.length ? \"Actions: \" + entry.actions.slice(0, 4).join(\"; \") + \".\" : null,\n            entry.alternativeProcess ? \"Alternative process: \" + ensureSentence(entry.alternativeProcess) : null,\n          ]).slice(0, 5),\n        };\n      });\n    }\n    \n    function getPredrillRouteLabel(value) {\n      switch (String(value || \"\")) {\n        case \"actual_known\":\n          return \"Actual core hole confirmed\";\n        case \"fixed_unknown\":\n          return \"Prepared hole needs confirmation\";\n        case \"recommend\":\n          return \"Recommendation route active\";\n        case \"missing\":\n          return \"Core hole not prepared\";\n        default:\n          return \"Core-hole route open\";\n      }\n    }\n    \n    function getBottomClearanceLabel(metrics) {\n      switch (String(metrics && metrics.bottomClearanceClass || \"\")) {\n        case \"low\":\n          return \"Enough run-out\";\n        case \"high\":\n          return \"Very short / near bottom\";\n        case \"medium\":\n          return metrics && metrics.actualBottomClearanceMm != null ? \"Measured run-out\" : \"Short or unknown run-out\";\n        default:\n          return \"Run-out not qualified\";\n      }\n    }\n    \n    function getRecipeOperationLabel(metrics) {\n      var raw = metrics && (metrics.recipeOperationId || metrics.recipeOperationHandle);\n      var normalized = String(raw || \"\").toLowerCase();\n      if (!raw) return \"Blind tapping\";\n      if (normalized === \"tap\" || normalized === \"tapping\") return \"Tapping\";\n      return titleCase(raw);\n    }\n    \n    function getRecipeCoolantLabel(value) {\n      switch (String(value || \"\")) {\n        case \"through\":\n          return \"Through\";\n        case \"external\":\n          return \"External\";\n        case \"mist\":\n          return \"MQL / mist\";\n        case \"dry\":\n          return \"Dry\";\n        case \"unknown\":\n          return \"Unspecified\";\n        default:\n          return \"Unspecified\";\n      }\n    }\n    \n    function getValueOrNa(value, digits) {\n      var formatted = formatDisplayNumber(value, digits);\n      return formatted != null ? formatted : \"n/a\";\n    }\n    \n    function buildVcBandLabel(metrics) {\n      var parts = [\n        formatDisplayNumber(metrics && metrics.recipeVcMin, 1),\n        formatDisplayNumber(metrics && metrics.recipeVcTyp, 1),\n        formatDisplayNumber(metrics && metrics.recipeVcMax, 1),\n      ].filter(function keep(value) {\n        return value != null;\n      });\n      return parts.length ? parts.join(\" / \") + \" m/min\" : \"n/a\";\n    }\n    \n    function getMaterialWhyLine(materialGroup, metrics, materialProfile) {\n      if (materialProfile) {\n        switch (materialGroup) {\n          case \"M\":\n            return materialProfile.code + \" is \" + formatProfileFact(materialProfile.chipForm) + \"-chipping with \" + formatProfileFact(materialProfile.workHardening) + \" work hardening, so blind-hole chip return and lubrication stability matter from the first hole.\";\n          case \"K\":\n            return materialProfile.code + \" is \" + formatProfileFact(materialProfile.chipForm) + \"-chipping and \" + formatProfileFact(materialProfile.abrasiveness) + \" abrasive, so the blind-hole geometry must stay material-led instead of assuming maximum helix by default.\";\n          case \"N\":\n            return materialProfile.code + \" combines \" + formatProfileFact(materialProfile.chipForm) + \" chips with \" + formatProfileFact(materialProfile.buildUpEdgeTendency) + \" built-up-edge tendency, so blind-hole lubrication and clean reversal matter from the first hole.\";\n          case \"S\":\n            return materialProfile.code + \" runs with \" + formatProfileFact(materialProfile.abrasiveness) + \" abrasiveness and low machinability, so the recommendation favors bottom safety and process robustness over raw output.\";\n          case \"H\":\n            return materialProfile.code + \" is very abrasive and near a practical blind-hole thread-cutting boundary, so the recommendation stays deliberately conservative.\";\n          case \"P\":\n          default:\n            return metrics && metrics.geometrySuitability >= 0.8\n              ? materialProfile.code + \" is a manageable steel case and the selected geometry still supports clean chip return away from the bore bottom.\"\n              : materialProfile.code + \" remains workable, but the current steel setup still needs a conservative blind-hole release window.\";\n        }\n      }\n      switch (materialGroup) {\n        case \"M\":\n          return \"M-group stainless needs lubrication-aware geometry and a conservative blind-hole window against adhesion and work hardening.\";\n        case \"K\":\n          return \"K-group cast materials are short-chipping, so the recommendation follows material-led blind-hole geometry rather than a generic high-helix rule.\";\n        case \"N\":\n          return \"N-group non-ferrous materials need burr- and built-up-edge-aware blind-hole logic instead of a universal long-chamfer assumption.\";\n        case \"S\":\n          return \"S-group heat-resistant materials run in a narrow load window, so the recommendation favors bottom safety and process robustness over output.\";\n        case \"H\":\n          return \"H-group sits near the practical limit for blind-hole thread cutting, so the recommendation stays deliberately conservative.\";\n        case \"P\":\n        default:\n          return metrics && metrics.geometrySuitability >= 0.8\n            ? \"P-group steel is a standard blind-hole case and the selected geometry supports clean chip return from the bottom.\"\n            : \"P-group steel remains workable, but the selected setup still needs a conservative blind-hole release window.\";\n      }\n    }\n    \n    function getMaterialHowLine(materialGroup, metrics, materialProfile) {\n      var preferredCoolant = formatProfileCoolant(materialProfile);\n      if (materialProfile) {\n        switch (materialGroup) {\n          case \"M\":\n            return \"Keep \" + String(preferredCoolant || \"lubrication\") + \" stable and avoid dwell near reversal so the tap does not rub and work-harden the flanks.\";\n          case \"K\":\n            return \"Stay consistent with \" + String(preferredCoolant || \"dry running\") + \" and do not assume that a higher helix is automatically better in cast material.\";\n          case \"N\":\n            return \"Keep \" + String(preferredCoolant || \"lubrication\") + \" clean, keep reversal smooth and do not run too cold if adhesion rises.\";\n          case \"S\":\n            return \"Use \" + String(preferredCoolant || \"stable emulsion support\") + \" with a short-overhang setup and qualify the first blind holes before opening the band.\";\n          case \"H\":\n            return \"Keep the setup very rigid with minimal overhang and treat the first blind hole as a strict qualification hole.\";\n          case \"P\":\n          default:\n            return \"Use \" + String(preferredCoolant || \"stable emulsion support\") + \" and only raise output after torque, sound and chip return stay stable.\";\n        }\n      }\n      switch (materialGroup) {\n        case \"M\":\n          return \"Keep lubrication stable and avoid dwell near reversal so the tap does not rub and work-harden the flanks.\";\n        case \"K\":\n          return \"Do not force an aggressive helix or unnecessarily short run-out logic that the short-chipping material does not need.\";\n        case \"N\":\n          return \"Watch adhesion early and keep lubrication clean before increasing output in non-ferrous material.\";\n        case \"S\":\n          return \"Qualify the first blind holes conservatively and only open the band once spindle load and chip return stay stable.\";\n        case \"H\":\n          return \"Treat the first blind hole as a strict qualification hole and keep the release plan conservative from the start.\";\n        case \"P\":\n        default:\n          return \"Start with the suggested band and only raise output after torque, sound and chip return stay stable.\";\n      }\n    }\n    \n    function getMaterialWatchLine(materialGroup, metrics, materialProfile) {\n      if (materialProfile) {\n        switch (materialGroup) {\n          case \"M\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"adhesion and notch wear\").toLowerCase() + \"; if lubrication or synchronization drift, blind-hole tapping loads rise quickly.\";\n          case \"K\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"abrasive wear\").toLowerCase() + \"; coolant shock can damage the edge quickly.\";\n          case \"N\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"burrs and adhesion\").toLowerCase() + \"; do not force a universal long-chamfer rule in a blind hole.\";\n          case \"S\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"crater wear and edge damage\").toLowerCase() + \"; if load or bottom reserve stay marginal, thread milling is the safer fallback.\";\n          case \"H\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"chipping\").toLowerCase() + \"; treat thread milling as the preferred fallback if process security dominates.\";\n          case \"P\":\n          default:\n            return metrics && metrics.loadClass === \"high\"\n              ? \"Typical steel failure mode here is \" + String(materialProfile.typicalFailure || \"flank wear\").toLowerCase() + \", so watch torque and bottom reserve closely on the first holes.\"\n              : \"Typical steel failure mode here is \" + String(materialProfile.typicalFailure || \"flank wear\").toLowerCase() + \"; bottom reserve and chip return still decide whether the case stays stable.\";\n        }\n      }\n      switch (materialGroup) {\n        case \"M\":\n          return \"Watch for built-up edge, flank rubbing and work-hardening if lubrication or synchronization drift.\";\n        case \"K\":\n          return \"Do not assume a universal B-chamfer rule in cast iron; chip behavior stays material-led even in through holes.\";\n        case \"N\":\n          return \"A universal long-chamfer rule is risky in aluminium and other non-ferrous materials because adhesion and smearing can rise quickly.\";\n        case \"S\":\n          return \"If load, stability or bottom reserve stay marginal, thread milling is the safer fallback for this setup.\";\n        case \"H\":\n          return \"Treat thread milling as the preferred fallback if process security dominates, because the material is near a thread-cutting boundary.\";\n        case \"P\":\n        default:\n          return metrics && metrics.loadClass === \"high\"\n            ? \"Higher-load steel still needs close attention to torque and bottom reserve on the first holes.\"\n            : \"Even in steel, bottom reserve and chip return decide whether the nominal blind-hole case stays stable.\";\n      }\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = item == null ? \"\" : String(item).trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item.score.eligible;\n      }).map(function mapAlternative(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative threading option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n        { key: \"feed_per_rev\", label: \"Feed per rev\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n        { key: \"rpm\", label: \"RPM\", min: metrics.rpmMin, typ: metrics.rpmTyp, max: metrics.rpmMax, unit: \"rpm\" },\n        { key: \"feed_speed\", label: \"Feed speed\", min: metrics.feedMinMmMin, typ: metrics.feedTypMmMin, max: metrics.feedMaxMmMin, unit: \"mm/min\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildRiskItems(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n    \n      if (metrics.bottomRiskClass === \"critical\" || metrics.bottomClearanceClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Bottom reserve\",\n          message: \"The remaining run-out below the full thread is tight for this blind-hole setup and needs close qualification.\",\n        });\n      }\n      if (metrics.loadClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Tapping load\",\n          message: \"The derived load window is high for this material and geometry. Keep chip flow and synchronization conservative.\",\n        });\n      }\n      if (metrics.predrillActualMm == null && getAnswer(ctx, \"core_hole_status\") === \"fixed_unknown\") {\n        items.push({\n          severity: \"info\",\n          title: \"Pre-drill status\",\n          message: \"The core hole exists, but the actual drill diameter is unknown. The recommendation assumes the candidate pre-drill diameter.\",\n        });\n      }\n      if (metrics.predrillDeltaMm != null && Math.abs(metrics.predrillDeltaMm) > 0.08) {\n        items.push({\n          severity: \"warning\",\n          title: \"Pre-drill delta\",\n          message: \"Actual pre-drill differs from the candidate recommendation by \" + formatMaybeNumber(metrics.predrillDeltaMm, \"mm\", 3) + \". Expect load or gauge risk.\",\n        });\n      }\n      if (metrics.coolantMode === \"Dry\" || metrics.coolantMode === \"Unknown coolant mode\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Lubrication\",\n          message: \"Coolant or lubrication support is weak for a tapping process and narrows the safe window.\",\n        });\n      }\n      if (metrics.problemHistory && metrics.problemHistory !== \"none\") {\n        items.push({\n          severity: \"info\",\n          title: \"Known issue\",\n          message: \"Previous issue flagged: \" + String(metrics.problemHistory).replace(/_/g, \" \") + \". Review the guidance before release.\",\n        });\n      }\n      if (metrics.alternativeProcessFlag) {\n        items.push({\n          severity: \"info\",\n          title: \"Alternative process\",\n          message: \"For this setup, thread milling may be the more robust fallback if process security remains critical.\",\n        });\n      }\n      return items;\n    }\n    \n    function buildMachineChecks(ctx, top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"sync_mode\",\n          label: \"Tapping mode\",\n          result: getAnswer(ctx, \"sync_tapping_capability\") === \"rigid\" || getAnswer(ctx, \"sync_tapping_capability\") === \"synchro_chuck\" ? \"pass\" : \"limited\",\n          note: metrics.machineMode || \"n/a\",\n        },\n        {\n          key: \"holder\",\n          label: \"Holder\",\n          result: getAnswer(ctx, \"holder_type\") === \"synchro_chuck\" ? \"pass\" : getAnswer(ctx, \"holder_type\") ? \"limited\" : \"unknown\",\n          note: getAnswer(ctx, \"holder_type\") ? String(getAnswer(ctx, \"holder_type\")).replace(/_/g, \" \") : \"Not specified\",\n        },\n        {\n          key: \"coolant\",\n          label: \"Coolant / lubrication\",\n          result: (metrics.coolantFit || 0) >= 0.8 ? \"pass\" : (metrics.coolantFit || 0) >= 0.5 ? \"limited\" : \"fail\",\n          note: metrics.coolantMode || \"n/a\",\n        },\n      ];\n    }\n    \n    function buildRecipeSourceUi(top) {\n      switch (top && top.score && top.score.recipeConfidence) {\n        case \"exact\":\n          return {\n            tone: \"exact\",\n            chip: \"Exact cutting data\",\n            title: \"Cutting-data basis\",\n            value: \"Exact recipe row match\",\n            note: \"Start values come from a threading row that matches the current process, material and setup keys.\",\n          };\n        case \"near\":\n          return {\n            tone: \"near\",\n            chip: \"Nearest valid cutting data\",\n            title: \"Cutting-data basis\",\n            value: \"Nearest recipe row used\",\n            note: \"Start values use the closest valid threading row because one setup key does not match exactly.\",\n          };\n        case \"estimated\":\n          return {\n            tone: \"default\",\n            chip: \"Conservative thread estimate\",\n            title: \"Thread-data basis\",\n            value: \"Estimated from conservative defaults\",\n            note: \"No exact threading row matched all keys, so the start values stay conservative.\",\n          };\n        default:\n          return {\n            tone: \"default\",\n            chip: \"Awaiting valid cutting data\",\n            title: \"Thread-data basis\",\n            value: \"No valid threading row yet\",\n            note: \"Complete one more setup detail to tighten the starting window.\",\n          };\n      }\n    }\n    \n    function buildMachineUi(machineChecks) {\n      var fail = (machineChecks || []).some(function hasFail(item) { return item.result === \"fail\"; });\n      var limited = (machineChecks || []).some(function hasLimited(item) { return item.result === \"limited\"; });\n      var notes = [];\n    \n      (machineChecks || []).forEach(function eachCheck(item) {\n        if (!item || !item.note) return;\n        if (item.result === \"pass\") {\n          notes.push(item.label + \": \" + item.note + \".\");\n        } else if (item.result === \"limited\") {\n          notes.push(item.label + \" still narrows the release window.\");\n        }\n      });\n    \n      if (fail) {\n        return {\n          tone: \"tight\",\n          value: \"Tight\",\n          note: \"Machine-side limits narrow the safe tapping window.\",\n          items: dedupeTextItems(notes).slice(0, 2),\n        };\n      }\n      if (limited) {\n        return {\n          tone: \"limited\",\n          value: \"Limited\",\n          note: \"One or more machine-side inputs still narrow the recommended band.\",\n          items: dedupeTextItems(notes).slice(0, 2),\n        };\n      }\n      return {\n        tone: \"good\",\n        value: \"Checked\",\n        note: \"No major machine limits were used in the recommendation.\",\n        items: dedupeTextItems(notes).slice(0, 2),\n      };\n    }\n    \n    function buildRiskUi(top, riskItems) {\n      var metrics = top.metrics || {};\n      var warnings = (riskItems || []).filter(function keep(item) { return item.severity === \"warning\"; }).length;\n    \n      if (metrics.bottomRiskClass === \"critical\" || metrics.loadClass === \"high\" || warnings >= 2) {\n        return {\n          tone: \"high\",\n          value: \"High\",\n          note: \"Run conservatively and watch bottom reserve, chip return and torque on the first holes.\",\n        };\n      }\n      if ((riskItems || []).length > 0 || (metrics.coolantFit || 0) < 0.75 || (metrics.machineFit || 0) < 0.75 || (metrics.predrillFit || 0) < 0.75 || (metrics.bottomFit || 0) < 0.75) {\n        return {\n          tone: \"medium\",\n          value: \"Medium\",\n          note: \"A few setup factors still need attention, but the recommendation remains workable.\",\n        };\n      }\n      return {\n        tone: \"low\",\n        value: \"Low\",\n        note: \"No major qualification risks detected from the current inputs.\",\n      };\n    }\n    \n    function buildConfidenceUi(top, recipeUi, machineUi, riskUi) {\n      var confidence = top && top.score ? top.score.confidence : 0;\n      if (recipeUi.tone === \"exact\" && confidence >= 0.82 && machineUi.tone === \"good\" && riskUi.tone === \"low\") {\n        return { tone: \"high\", label: \"High\" };\n      }\n      if (confidence >= 0.76 && riskUi.tone !== \"high\" && machineUi.tone !== \"tight\") {\n        return { tone: \"medium\", label: \"Medium\" };\n      }\n      return { tone: \"low\", label: \"Low\" };\n    }\n    \n    function buildSummaryLine(ctx, top) {\n      var metrics = top.metrics || {};\n      var threadLengthMm = getThreadLengthMm(metrics);\n      var depthRatio = getDepthRatio(metrics);\n      var bits = [];\n      var materialLabel = getMaterialDisplayName(ctx);\n      if (metrics.requestedThreadSize) bits.push(metrics.requestedThreadSize);\n      if (threadLengthMm != null) bits.push(formatDisplayNumber(threadLengthMm, 1) + \" mm thread length\");\n      if (depthRatio != null) bits.push(formatDisplayNumber(depthRatio, 2) + \" xD\");\n      if (metrics.requestedTolerance || metrics.candidateTolerance) bits.push(\"class \" + String(metrics.requestedTolerance || metrics.candidateTolerance));\n      if (metrics.bottomClearanceClass) bits.push(getBottomClearanceLabel(metrics));\n      if (metrics.machineMode) bits.push(metrics.machineMode);\n      return \"Best fit for \" + (bits.length ? bits.join(\" - \") + \" - \" : \"\") + \"Tapping Blind Hole in \" + materialLabel + \".\";\n    }\n    \n    function buildHeaderPills(confidenceUi, recipeUi, machineUi, riskUi) {\n      return [\n        { tone: \"fit\", text: \"Best fit\" },\n        { tone: \"conf-\" + confidenceUi.tone, text: \"Confidence: \" + confidenceUi.label },\n        { tone: \"source-\" + recipeUi.tone, text: recipeUi.chip },\n        { tone: \"machine-\" + machineUi.tone, text: \"Machine: \" + machineUi.value },\n        { tone: \"risk-\" + riskUi.tone, text: \"Risk: \" + riskUi.value },\n      ];\n    }\n    \n    function buildStartCardData(top, recipeUi) {\n      var metrics = top.metrics || {};\n      var threadLengthMm = getThreadLengthMm(metrics);\n      var depthRatio = getDepthRatio(metrics);\n      var threadTimeSec = threadLengthMm != null && metrics.feedTypMmMin ? (threadLengthMm / metrics.feedTypMmMin) * 60 : null;\n      var rowBackedValues = [\n        { key: \"operation\", label: \"Operation\", value: getRecipeOperationLabel(metrics), unit: null, tone: \"text\" },\n        { key: \"predrill\", label: \"Pre-drill\", value: getValueOrNa(metrics.predrillRecommendedMm, 2), unit: metrics.predrillRecommendedMm != null ? \"mm\" : null },\n        { key: \"coolant\", label: \"Coolant\", value: getRecipeCoolantLabel(metrics.rowCoolantMode), unit: null, tone: \"text\" },\n        { key: \"vc_min\", label: \"vc min\", value: getValueOrNa(top.recipe && top.recipe.vc && top.recipe.vc.min, 1), unit: top.recipe && top.recipe.vc && top.recipe.vc.min != null ? \"m/min\" : null },\n        { key: \"vc_typ\", label: \"vc typ\", value: getValueOrNa(top.recipe && top.recipe.vc && top.recipe.vc.typ, 1), unit: top.recipe && top.recipe.vc && top.recipe.vc.typ != null ? \"m/min\" : null },\n        { key: \"vc_max\", label: \"vc max\", value: getValueOrNa(top.recipe && top.recipe.vc && top.recipe.vc.max, 1), unit: top.recipe && top.recipe.vc && top.recipe.vc.max != null ? \"m/min\" : null },\n      ];\n      var machineValues = [\n        { key: \"n\", label: \"N\", value: getValueOrNa(metrics.rpmTyp, 0), unit: metrics.rpmTyp != null ? \"rpm\" : null },\n        { key: \"vf\", label: \"VF\", value: getValueOrNa(metrics.feedTypMmMin, 0), unit: metrics.feedTypMmMin != null ? \"mm/min\" : null },\n        { key: \"time\", label: \"T/HOLE\", value: getValueOrNa(threadTimeSec, 1), unit: threadTimeSec != null ? \"s\" : null },\n      ];\n    \n      return {\n        title: \"Start here\",\n        description: recipeUi.tone === \"exact\"\n          ? \"Use the matched threading row for operation, coolant and cutting-speed band. Spindle speed, feed and time are derived from pitch and nominal diameter.\"\n          : recipeUi.tone === \"near\"\n            ? \"Use the nearest valid threading row for operation, coolant and cutting-speed band. Qualify the first hole before release because one setup key is still approximate.\"\n            : \"Use the best available threading row conservatively. Qualify the first hole before raising output because the current band is still estimated.\",\n        rowBackedValues: rowBackedValues,\n        machineValues: machineValues,\n        primaryValues: rowBackedValues,\n        secondaryValues: machineValues,\n        depthRatio: depthRatio,\n      };\n    }\n    \n    function buildHolePreparationCard(top) {\n      var metrics = top.metrics || {};\n      var margin = metrics.bottomClearanceMarginMm;\n      var tone = \"default\";\n      var badge = \"Review\";\n      var value = \"Bottom reserve is still one of the key release checks for this blind-hole tap.\";\n      var note = getBottomClearanceLabel(metrics);\n    \n      if (metrics.actualBottomClearanceMm != null && margin != null) {\n        if (margin >= 0.5) {\n          tone = \"good\";\n          badge = \"Safe\";\n          value = \"Measured run-out stays comfortably above the tap chamfer length.\";\n          note = \"Bottom reserve supports clean reversal before the bore bottom becomes critical.\";\n        } else if (margin >= 0) {\n          tone = \"limited\";\n          badge = \"Tight\";\n          value = \"Measured run-out is workable, but reversal happens close to the bore bottom.\";\n          note = \"Qualify the first blind holes carefully before increasing output.\";\n        } else {\n          tone = \"high\";\n          badge = \"Critical\";\n          value = \"Measured run-out is below the tap chamfer length for this candidate.\";\n          note = \"Expect bottom-contact or chip-packing risk until the setup or tool geometry changes.\";\n        }\n      } else if (metrics.bottomClearanceClass === \"high\") {\n        tone = \"high\";\n        badge = \"Very short\";\n        value = \"The operator flagged a very short run-out below the last full thread.\";\n        note = \"Blind-hole safety depends strongly on chamfer length and controlled reversal.\";\n      } else if (metrics.bottomClearanceClass === \"medium\") {\n        tone = \"limited\";\n        badge = \"Review\";\n        value = \"Bottom reserve is present, but still too tight or too uncertain for an aggressive release.\";\n        note = \"Confirm the real run-out in mm if you need a tighter process window.\";\n      }\n    \n      return {\n        title: \"Bottom reserve\",\n        tone: tone,\n        badge: badge,\n        value: value,\n        note: note,\n        items: dedupeTextItems([\n          metrics.actualBottomClearanceMm != null ? \"Measured run-out: \" + formatDisplayNumber(metrics.actualBottomClearanceMm, 2) + \" mm.\" : getBottomClearanceLabel(metrics) + \".\",\n          metrics.tapChamferLengthMm != null ? \"Estimated chamfer length: \" + formatDisplayNumber(metrics.tapChamferLengthMm, 2) + \" mm.\" : null,\n          metrics.bottomClearanceMarginMm != null ? \"Bottom margin: \" + formatDisplayNumber(metrics.bottomClearanceMarginMm, 2) + \" mm.\" : null,\n        ]).slice(0, 3),\n      };\n    }\n    \n    function buildStoryData(ctx, top, recipeUi) {\n      var metrics = top.metrics || {};\n      var materialGroup = getMaterialGroup(metrics, ctx);\n      var materialProfile = getMaterialProfile(ctx);\n      var threadLengthMm = getThreadLengthMm(metrics);\n      var depthRatio = getDepthRatio(metrics);\n      var why = dedupeTextItems([\n        metrics.requestedThreadIdentity ? \"Thread identity matched to \" + metrics.requestedThreadIdentity + (metrics.candidateTolerance ? \" with \" + metrics.candidateTolerance + \" tap tolerance.\" : \".\") : null,\n        threadLengthMm != null ? \"Full thread length aligned to \" + formatDisplayNumber(threadLengthMm, 1) + \" mm with positive tool-length margin.\" : null,\n        depthRatio != null ? (depthRatio > 1.5 ? \"Requested engagement sits at \" + formatDisplayNumber(depthRatio, 2) + \" xD, so the recommendation prioritizes margin, run-out reserve and process security.\" : \"Requested engagement sits at \" + formatDisplayNumber(depthRatio, 2) + \" xD, which stays inside a manageable blind-hole window.\") : null,\n        metrics.predrillRecommendedMm != null ? \"Core-hole guidance aligns to \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm for the selected setup.\" : null,\n        metrics.bottomClearanceClass ? \"Blind-hole reserve is currently rated as \" + getBottomClearanceLabel(metrics).toLowerCase() + \".\" : null,\n        materialGroup ? getMaterialWhyLine(materialGroup, metrics, materialProfile) : null,\n      ].concat(top.score.reasons || [])).slice(0, 4);\n    \n      var how = dedupeTextItems([\n        \"Start with the suggested band and qualify the first hole before increasing output.\",\n        materialGroup ? getMaterialHowLine(materialGroup, metrics, materialProfile) : null,\n        materialProfile && materialProfile.avoid ? \"Avoid: \" + ensureSentence(materialProfile.avoid) : null,\n        metrics.coolantMode ? \"Keep \" + humanizeToken(metrics.coolantMode).toLowerCase() + \" stable so pitch, chip return and reversal stay consistent.\" : null,\n        recipeUi.tone !== \"exact\" ? \"Treat the first hole as a qualification hole because the current start values are not from an exact row match.\" : null,\n        getAnswer(ctx, \"holder_type\") == null ? \"Prefer a synchro chuck or confirm holder alignment before full release.\" : null,\n      ]).slice(0, 4);\n    \n      var watch = dedupeTextItems([\n        \"Blind-hole tapping is bottom-sensitive: watch run-out reserve, reversal quality and chip packing near the bore bottom.\",\n        materialGroup ? getMaterialWatchLine(materialGroup, metrics, materialProfile) : null,\n        metrics.loadClass === \"high\" ? \"The derived load window is high for this setup. Start conservatively and watch torque and sound on the first holes.\" : null,\n        metrics.predrillActualMm == null && getAnswer(ctx, \"core_hole_status\") !== \"actual_known\" ? \"Core-hole diameter is not yet confirmed. Verify the actual predrill before increasing output.\" : null,\n        metrics.actualBottomClearanceMm == null && getAnswer(ctx, \"bottom_clearance_class\") !== \"comfortable\" ? \"Actual run-out to the bore bottom is not confirmed in mm yet. Verify it before raising output.\" : null,\n        metrics.problemHistory && metrics.problemHistory !== \"none\" ? \"Previous issue flagged: \" + humanizeToken(metrics.problemHistory) + \". Review the first holes against that failure mode.\" : null,\n        metrics.alternativeProcessFlag ? \"If process security remains critical, thread milling is the safer fallback for this setup.\" : null,\n        metrics.coolantMode === \"Dry\" || metrics.coolantMode === \"Unknown coolant mode\" ? \"Weak lubrication narrows the safe tapping window quickly. Do not raise speed until the first holes look stable.\" : null,\n      ]).slice(0, 4);\n    \n      return { why: why, how: how, watch: watch };\n    }\n    \n    function buildStoryPanels(ctx, top, recipeUi, machineUi, riskUi, storyData) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var depthRatio = getDepthRatio(metrics);\n      var materialLabel = getMaterialDisplayName(ctx);\n      var holderAnswer = getAnswer(ctx, \"holder_type\");\n      return {\n        why: {\n          tone: \"fit\",\n          eyebrow: \"Recommendation logic\",\n          title: \"Why it fits\",\n          badge: recipeUi.chip,\n          highlight: metrics.requestedThreadIdentity\n            ? metrics.requestedThreadIdentity + \" is covered cleanly by this tap.\"\n            : \"The requested thread is covered cleanly by this tap.\",\n          summary: top.score.reasons[0] || \"The selected tap matches the requested thread, the material window and a workable blind-hole release plan.\",\n          facts: dedupeTextItems([\n            materialLabel ? \"Material: \" + materialLabel : null,\n            depthRatio != null ? \"Engagement: \" + formatDisplayNumber(depthRatio, 2) + \" xD\" : null,\n            metrics.predrillRecommendedMm != null ? \"Core hole: \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm\" : null,\n            metrics.bottomClearanceClass ? \"Run-out: \" + getBottomClearanceLabel(metrics) : null,\n          ]).slice(0, 3),\n          items: (storyData && storyData.why || []).slice(0, 3),\n        },\n        how: {\n          tone: \"start\",\n          eyebrow: \"First release\",\n          title: \"How to start\",\n          badge: machineUi.tone === \"good\" ? \"Machine checked\" : \"Controlled first hole\",\n          highlight: \"Qualify one hole before opening the band.\",\n          summary: recipeUi.note,\n          facts: dedupeTextItems([\n            metrics.rowCoolantMode ? \"Coolant: \" + getRecipeCoolantLabel(metrics.rowCoolantMode) : null,\n            buildVcBandLabel(metrics) !== \"n/a\" ? \"vc band: \" + buildVcBandLabel(metrics) : null,\n            holderAnswer ? \"Holder: \" + titleCase(holderAnswer) : \"Holder: confirm before full release\",\n          ]).slice(0, 3),\n          items: (storyData && storyData.how || []).slice(0, 3),\n        },\n        watch: {\n          tone: \"watch\",\n          eyebrow: \"Critical signals\",\n          title: \"Watch-outs\",\n          badge: \"Risk: \" + riskUi.value,\n          highlight: metrics.bottomRiskClass === \"critical\" || metrics.bottomClearanceClass === \"high\"\n            ? \"Bottom reserve is the main release limiter in this setup.\"\n            : metrics.loadClass === \"high\"\n              ? \"Torque and sound are the main release limiters in this setup.\"\n              : \"Bottom reserve and chip return still decide whether the case stays stable.\",\n          summary: riskUi.note,\n          facts: dedupeTextItems([\n            metrics.bottomClearanceClass ? \"Run-out: \" + getBottomClearanceLabel(metrics) : null,\n            metrics.loadClass ? \"Load: \" + titleCase(metrics.loadClass) : null,\n            materialProfile && materialProfile.typicalFailure ? \"Typical failure: \" + cleanShortText(materialProfile.typicalFailure) : null,\n          ]).slice(0, 3),\n          items: (storyData && storyData.watch || []).slice(0, 3),\n        },\n      };\n    }\n    \n    function buildRefineData(ctx, top, confidenceUi, recipeUi) {\n      var metrics = top.metrics || {};\n      var items = [];\n      if (!getAnswer(ctx, \"thread_tolerance\")) items.push({ questionId: \"thread_tolerance\", label: \"Confirm thread tolerance\" });\n      if (metrics.predrillActualMm == null && getAnswer(ctx, \"core_hole_status\") !== \"actual_known\") items.push({ questionId: \"actual_predrill_diameter_mm\", label: \"Confirm core hole diameter\" });\n      if (metrics.actualBottomClearanceMm == null && getAnswer(ctx, \"bottom_clearance_class\") !== \"comfortable\") items.push({ questionId: \"actual_bottom_clearance_mm\", label: \"Confirm bottom reserve\" });\n      if (!getAnswer(ctx, \"holder_type\")) items.push({ questionId: \"holder_type\", label: \"Confirm holder type\" });\n      if (!getAnswer(ctx, \"quality_sensitivity\")) items.push({ questionId: \"quality_sensitivity\", label: \"Confirm quality target\" });\n      return {\n        visible: items.length > 0 && (confidenceUi.label !== \"High\" || recipeUi.tone !== \"exact\"),\n        title: \"Improve recommendation confidence\",\n        description: \"Confirm one missing setup detail to tighten the start values and reduce estimation.\",\n        items: items.slice(0, 2),\n      };\n    }\n    \n    function buildTrustCards(top, recipeUi, machineUi, riskUi, machineChecks) {\n      var metrics = top.metrics || {};\n      return {\n        recipe: {\n          title: recipeUi.title,\n          tone: recipeUi.tone,\n          badge: recipeUi.chip,\n          value: recipeUi.value,\n          note: recipeUi.note,\n          items: dedupeTextItems([\n            metrics.apmxMarginMm != null ? \"APMX margin \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm.\" : null,\n            metrics.usableLengthMarginMm != null ? \"Usable-length margin \" + formatDisplayNumber(metrics.usableLengthMarginMm, 2) + \" mm.\" : null,\n            metrics.recommendedChamferClass ? \"Recommended chamfer class: \" + metrics.recommendedChamferClass + \".\" : null,\n          ]).slice(0, 2),\n        },\n        holePrep: buildHolePreparationCard(top),\n        machine: {\n          title: \"Machine fit\",\n          tone: machineUi.tone,\n          badge: machineUi.value,\n          value: machineUi.note,\n          note: riskUi.note,\n          items: dedupeTextItems((machineChecks || []).map(function mapCheck(item) {\n            if (!item) return null;\n            return item.label + \": \" + titleCase(item.result) + (item.note ? \" - \" + item.note + \".\" : \".\");\n          })).slice(0, 2),\n        },\n      };\n    }\n    \n    function formatMachineCheckReleaseNote(item) {\n      if (!item) return null;\n      if (item.result === \"pass\") {\n        return item.label + \": \" + item.note + \".\";\n      }\n      if (item.result === \"limited\") {\n        return item.label + \": \" + item.note + \" still narrows the safe release window.\";\n      }\n      if (item.result === \"unknown\") {\n        return item.label + \": still unconfirmed for full release.\";\n      }\n      return item.label + \": current setup is not ideal for a wider tapping band.\";\n    }\n    \n    function buildDetailPanels(ctx, top, recipeUi, machineUi, riskUi, machineChecks, alternativeItems) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var panels = [];\n    \n      panels.push({\n        type: \"summary\",\n        tone: recipeUi.tone,\n        eyebrow: \"Technical basis\",\n        title: \"Why this starting band is credible\",\n        summary: recipeUi.note,\n        facts: dedupeTextItems([\n          getMaterialDisplayName(ctx) ? \"Material: \" + getMaterialDisplayName(ctx) : null,\n          recipeUi.value ? \"Cutting-data basis: \" + recipeUi.value : null,\n          buildVcBandLabel(metrics) !== \"n/a\" ? \"vc band: \" + buildVcBandLabel(metrics) : null,\n        ]).slice(0, 3),\n        items: dedupeTextItems([\n          \"Geometry uses chamfer form \" + String(metrics.tapChamferForm || \"n/a\") + \" with helix \" + formatMaybeNumber(metrics.tapHelixDeg, \"deg\", 0) + \".\",\n          metrics.recommendedChamferClass ? \"Recommended blind-hole chamfer logic is class \" + metrics.recommendedChamferClass + \".\" : null,\n          metrics.tapChamferLengthMm != null ? \"Estimated chamfer length is \" + formatMaybeNumber(metrics.tapChamferLengthMm, \"mm\", 2) + \".\" : null,\n          metrics.apmxMarginMm != null || metrics.usableLengthMarginMm != null\n            ? \"Length reserve stays at APMX \" + formatMaybeNumber(metrics.apmxMarginMm, \"mm\", 2) + \" and usable length \" + formatMaybeNumber(metrics.usableLengthMarginMm, \"mm\", 2) + \".\"\n            : null,\n        ]).slice(0, 3),\n      });\n    \n      panels.push({\n        type: \"summary\",\n        tone: riskUi.tone === \"high\" ? \"watch\" : machineUi.tone,\n        eyebrow: \"Release notes\",\n        title: \"What to verify before full release\",\n        summary: riskUi.note,\n        facts: dedupeTextItems([\n          machineUi.value ? \"Machine status: \" + machineUi.value : null,\n          metrics.bottomClearanceClass ? \"Run-out: \" + getBottomClearanceLabel(metrics) : null,\n          metrics.predrillValidationRoute ? \"Core-hole route: \" + getPredrillRouteLabel(metrics.predrillValidationRoute) : null,\n        ]).slice(0, 3),\n        items: dedupeTextItems([\n          formatMachineCheckReleaseNote(machineChecks[0]),\n          formatMachineCheckReleaseNote(machineChecks[1]),\n          formatMachineCheckReleaseNote(machineChecks[2]),\n          materialProfile && materialProfile.toolHolder ? ensureSentence(materialProfile.toolHolder) : null,\n          metrics.problemHistory && metrics.problemHistory !== \"none\" ? \"Previous issue to re-check: \" + humanizeToken(metrics.problemHistory) + \".\" : null,\n          metrics.alternativeProcessFlag ? \"If process security remains the priority, thread milling is the safer fallback for this setup.\" : null,\n        ]).slice(0, 4),\n      });\n    \n      if (alternativeItems && alternativeItems.length) {\n        panels.push({\n          type: \"alternatives\",\n          tone: \"default\",\n          eyebrow: \"Backup options\",\n          title: \"Alternatives worth checking\",\n          summary: \"If you need a nearby backup for stock, holder strategy or extra process margin, these taps are the closest next options.\",\n          items: alternativeItems.map(function mapAlternative(item, index) {\n            return {\n              badge: index === 0 ? \"Closest backup\" : \"Option \" + String(index + 1),\n              label: item.label,\n              reason: item.reason,\n            };\n          }),\n        });\n      }\n    \n      return panels;\n    }\n    \n    function buildToleranceNotes(ctx, top) {\n      var metrics = top.metrics || {};\n      var notes = [\n        \"Requested thread: \" + String(metrics.requestedThreadIdentity || getAnswer(ctx, \"thread_designation\") || \"not specified\"),\n        \"Requested tolerance: \" + String(metrics.requestedTolerance || \"not specified\"),\n        \"Candidate tolerance: \" + String(metrics.candidateTolerance || \"not specified\"),\n        \"Recommended tap drill diameter: \" + formatMaybeNumber(metrics.predrillRecommendedMm, \"mm\", 3),\n      ];\n      if (metrics.predrillActualMm != null) {\n        notes.push(\"Actual tap drill diameter: \" + formatMaybeNumber(metrics.predrillActualMm, \"mm\", 3));\n      }\n      if (metrics.predrillDeltaMm != null) {\n        notes.push(\"Pre-drill delta: \" + formatMaybeNumber(metrics.predrillDeltaMm, \"mm\", 3));\n      }\n      return notes;\n    }\n    \n    function buildSetupNotes(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var troubleshootingCards = buildTroubleshootingCards(ctx, top);\n      var notes = [\n        { area: \"cutting data\", message: \"Recipe row uses \" + getRecipeOperationLabel(metrics) + \" with \" + getRecipeCoolantLabel(metrics.rowCoolantMode).toLowerCase() + \" coolant and vc \" + buildVcBandLabel(metrics) + \".\" },\n        { area: \"geometry\", message: \"Chamfer form \" + String(metrics.tapChamferForm || \"n/a\") + \" with helix \" + formatMaybeNumber(metrics.tapHelixDeg, \"deg\", 0) + \".\" },\n        { area: \"blind-hole logic\", message: \"Recommended chamfer class for this setup: \" + String(metrics.recommendedChamferClass || \"n/a\") + \", estimated chamfer length \" + formatMaybeNumber(metrics.tapChamferLengthMm, \"mm\", 2) + \", run-out \" + getBottomClearanceLabel(metrics) + \".\" },\n        { area: \"length window\", message: \"APMX margin \" + formatMaybeNumber(metrics.apmxMarginMm, \"mm\", 2) + \", usable-length margin \" + formatMaybeNumber(metrics.usableLengthMarginMm, \"mm\", 2) + \".\" },\n      ];\n      if (materialProfile) {\n        notes.push({\n          area: \"material\",\n          message: getMaterialDisplayName(ctx) + \": chip form \" + String(formatProfileFact(materialProfile.chipForm) || \"n/a\") + \", work hardening \" + String(formatProfileFact(materialProfile.workHardening) || \"n/a\") + \", machinability \" + String(materialProfile.machinability != null ? materialProfile.machinability + \"/100\" : \"n/a\") + \", preferred coolant \" + String(formatProfileCoolant(materialProfile) || \"n/a\") + \".\",\n        });\n        if (materialProfile.toolHolder) {\n          notes.push({\n            area: \"holder baseline\",\n            message: ensureSentence(materialProfile.toolHolder),\n          });\n        }\n        if (materialProfile.typicalFailure || materialProfile.avoid) {\n          notes.push({\n            area: \"failure mode\",\n            message: (materialProfile.typicalFailure ? \"Typical failure: \" + ensureSentence(materialProfile.typicalFailure) + \" \" : \"\") + (materialProfile.avoid ? \"Avoid: \" + ensureSentence(materialProfile.avoid) : \"\"),\n          });\n        }\n      }\n      if (metrics.series || metrics.substrate || metrics.coating) {\n        notes.push({\n          area: \"program\",\n          message: \"Series \" + String(metrics.series || \"n/a\") + \", substrate \" + String(metrics.substrate || \"n/a\") + \", coating \" + String(metrics.coating || \"n/a\") + \".\",\n        });\n      }\n      if (troubleshootingCards.length) {\n        notes.push({\n          area: \"troubleshooting\",\n          message: \"Focused troubleshooting loaded for \" + troubleshootingCards.map(function mapCard(card) { return card.title; }).join(\" / \") + \".\",\n        });\n      }\n      return notes;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var alternativeItems;\n    \n      if (!top || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"tapping_blind\",\n          outcome: \"no_match\",\n          summary: \"No safe blind-hole tapping recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current setup is incomplete or incompatible for a safe blind-hole tap recommendation.\"),\n            noMatchGuidance({\n              message: \"Check thread designation, tapping mode, core-hole status, bottom reserve and full thread length. If the setup remains critical, consider thread milling as a fallback.\",\n              steps: [\n                \"Confirm the exact thread designation and tolerance.\",\n                \"Verify rigid tapping or a synchro chuck.\",\n                \"Provide the actual or target tap drill diameter.\",\n                \"Review bottom reserve and coolant availability.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust thread setup\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      alternativeItems = buildAlternativeItems(scored);\n    \n      var recipeUi = buildRecipeSourceUi(top);\n      var riskItems = buildRiskItems(ctx, top);\n      var machineChecks = buildMachineChecks(ctx, top);\n      var machineUi = buildMachineUi(machineChecks);\n      var riskUi = buildRiskUi(top, riskItems);\n      var confidenceUi = buildConfidenceUi(top, recipeUi, machineUi, riskUi);\n      var storyData = buildStoryData(ctx, top, recipeUi);\n      var refineData = buildRefineData(ctx, top, confidenceUi, recipeUi);\n      var troubleshootingCards = buildTroubleshootingCards(ctx, top);\n      var trustCards = buildTrustCards(top, recipeUi, machineUi, riskUi, machineChecks);\n      var storyPanels = buildStoryPanels(ctx, top, recipeUi, machineUi, riskUi, storyData);\n      var detailPanels = buildDetailPanels(ctx, top, recipeUi, machineUi, riskUi, machineChecks, alternativeItems);\n      var heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 4),\n        productUrl: candidate.catalog.url,\n      });\n      var threadBlock = threadIdentity({\n        standard: metrics.requestedThreadForm || getAnswer(ctx, \"thread_standard\"),\n        size: metrics.requestedThreadSize || getAnswer(ctx, \"thread_size\"),\n        pitch: metrics.requestedPitchMm != null ? String(metrics.requestedPitchMm) : getAnswer(ctx, \"pitch\"),\n        tolerance: metrics.requestedTolerance || metrics.candidateTolerance,\n        blindThrough: \"blind\",\n      });\n      var kpiBlock = fitKpis([\n        { key: \"thread_identity\", label: \"Thread identity\", value: (top.score.parts.threadIdentity || 0).toFixed(2), status: (top.score.parts.threadIdentity || 0) >= 2.5 ? \"good\" : \"weak\" },\n        { key: \"geometry_fit\", label: \"Blind-hole geometry\", value: formatMaybeNumber(metrics.geometrySuitability, null, 2), status: (metrics.geometrySuitability || 0) >= 0.8 ? \"good\" : \"ok\" },\n        { key: \"bottom_fit\", label: \"Bottom reserve\", value: formatMaybeNumber(metrics.bottomFit, null, 2), status: (metrics.bottomFit || 0) >= 0.8 ? \"good\" : \"ok\" },\n        { key: \"predrill_fit\", label: \"Pre-drill fit\", value: formatMaybeNumber(metrics.predrillFit, null, 2), status: (metrics.predrillFit || 0) >= 0.8 ? \"good\" : \"ok\" },\n        { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.78 ? \"good\" : \"ok\" },\n      ]);\n      var toleranceBlock = toleranceNotes(buildToleranceNotes(ctx, top));\n      var recipeBlock = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: buildRecipeValues(top),\n      });\n      var riskBlock = riskNotes(riskItems);\n      var machineBlock = machineFeasibility(machineChecks);\n      var setupBlock = setupNotes(buildSetupNotes(ctx, top));\n      var alternativesBlock = alternatives(alternativeItems);\n      var commerceBlock = commerceCta({\n        productUrl: candidate.catalog.url,\n        available: candidate.commerce.available,\n        priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n        ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n      });\n    \n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: buildSummaryLine(ctx, top),\n        headerPills: buildHeaderPills(confidenceUi, recipeUi, machineUi, riskUi),\n      };\n      recipeBlock.data.presentation = Object.assign(buildStartCardData(top, recipeUi), {\n        trustCard: trustCards.recipe,\n        holePrepCard: trustCards.holePrep,\n      });\n      riskBlock.data.presentation = riskUi;\n      machineBlock.data.presentation = Object.assign({}, machineUi, {\n        trustCard: trustCards.machine,\n      });\n      setupBlock.data.presentation = {\n        stories: storyData,\n        storyPanels: storyPanels,\n        refine: refineData,\n        troubleshooting: troubleshootingCards,\n        detailPanels: detailPanels,\n      };\n      commerceBlock.data.presentation = {\n        eyebrow: \"Order this tool\",\n        availabilityLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Ready to review\",\n        availabilityNote: candidate.commerce.available === false\n          ? \"This variant is currently not available.\"\n          : \"Open the product page to review live commerce details and place the order.\",\n      };\n    \n      return createResultViewModel({\n        processId: \"tapping_blind\",\n        outcome: top.score.total >= 5.25 ? \"match\" : \"limited_match\",\n        summary: \"Best blind-hole tapping match based on thread identity, geometry suitability, bottom reserve, pre-drill logic and process robustness.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          threadBlock,\n          kpiBlock,\n          toleranceBlock,\n          recipeBlock,\n          riskBlock,\n          machineBlock,\n          setupBlock,\n          alternativesBlock,\n          commerceBlock,\n        ],\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust thread setup\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/tapping-blind/questions.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { toNullableDraftNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getQuestionDefinition } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function cloneQuestion(questionId, overrides) {\n      return createQuestionDef(Object.assign({}, getQuestionDefinition(questionId), overrides || {}));\n    }\n    \n    function createTokenQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: config.type || \"chips\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: config.options || [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableString(value);\n        },\n        validate: config.validate || null,\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function createNumberQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: \"number\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: config.unit || null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableDraftNumber(value);\n        },\n        validate: config.validate || function validate(value) {\n          if (value == null) return [];\n          return value > 0\n            ? []\n            : [{ field: config.id, message: \"Please enter a positive value.\", severity: \"error\", code: \"positive_required\" }];\n        },\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"half\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function createTextQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: \"text\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableString(value);\n        },\n        validate: config.validate || null,\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function getThreadStandardFromAnswers(ctx) {\n      var explicit = toNullableString(ctx && ctx.answers && ctx.answers.thread_standard_choice);\n      if (explicit) return explicit.toUpperCase();\n      explicit = toNullableString(ctx && ctx.derived && ctx.derived.thread_standard);\n      return explicit ? explicit.toUpperCase() : null;\n    }\n    \n    function looksLikePipeThread(ctx) {\n      var explicitStandard = getThreadStandardFromAnswers(ctx);\n      var designation = toNullableString(ctx && ctx.answers && ctx.answers.thread_designation_override);\n    \n      if (explicitStandard) {\n        return explicitStandard === \"G\" || explicitStandard === \"NPT\" || explicitStandard === \"R\";\n      }\n      if (!designation) return false;\n      designation = designation.toUpperCase();\n      return designation.indexOf(\"NPT\") >= 0 || designation.indexOf(\"G\") === 0 || designation.indexOf(\"R\") === 0;\n    }\n    \n    function getQuestions() {\n      return [\n        createTokenQuestion({\n          id: \"thread_standard_choice\",\n          label: \"Which thread type do you need?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: the thread type defines the standard family, the automatic pitch rule and the exact blind-hole tap program that can fit.\",\n          options: [\n            { value: \"M\", label: \"M coarse\" },\n            { value: \"MF\", label: \"MF fine\" },\n            { value: \"UNC\", label: \"UNC\" },\n            { value: \"UNF\", label: \"UNF\" },\n            { value: \"G\", label: \"G / BSPP\" },\n            { value: \"NPT\", label: \"NPT\" },\n            { value: \"EGM\", label: \"EGM\" },\n          ],\n        }),\n        createTextQuestion({\n          id: \"thread_nominal_size\",\n          label: \"What is the nominal thread size?\",\n          placeholder: \"Metric example: 10 | Inch example: 1/4\",\n          group: \"core\",\n          required: true,\n          viewHint: { width: \"half\", emphasis: \"high\" },\n          helpText: \"Why it matters: the nominal size is enough to derive the standard pitch automatically for the supported thread families, so the operator does not need to type a full designation.\",\n          validate: function validate(value) {\n            var text = toNullableString(value);\n            if (!text) {\n              return [{ field: \"thread_nominal_size\", message: \"Enter the nominal thread size.\", severity: \"error\", code: \"required\" }];\n            }\n            return [];\n          },\n        }),\n        cloneQuestion(\"thread_length_mm\", {\n          label: \"Required full thread length\",\n          helpText: \"Why it matters: the requested full thread length drives tapping load, xD ratio, and whether APMX or usable length remain safe in the blind hole.\",\n          group: \"core\",\n          required: true,\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        createTokenQuestion({\n          id: \"bottom_clearance_class\",\n          label: \"How much run-out remains below the last full thread?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: this is the key blind-hole question. The remaining space to the bore bottom decides whether chamfer length, reversal and chip evacuation stay safe.\",\n          options: [\n            { value: \"comfortable\", label: \"Enough run-out\" },\n            { value: \"short\", label: \"Short reserve\" },\n            { value: \"minimal\", label: \"Very short / near bottom\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"sync_tapping_capability\",\n          label: \"Which tapping mode is available on the machine?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: blind-hole tapping tolerates pitch mismatch even less than through-hole tapping because reversal happens close to the bore bottom.\",\n          options: [\n            { value: \"rigid\", label: \"Rigid tapping\" },\n            { value: \"synchro_chuck\", label: \"Synchro chuck\" },\n            { value: \"unknown\", label: \"Unsure\" },\n            { value: \"no\", label: \"No sync mode\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"coolant_lubrication_mode\",\n          label: \"Which coolant or lubrication is available?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: lubrication changes friction, chip evacuation and reversal stability, especially in blind holes and in M, N, S or difficult P materials.\",\n          options: [\n            { value: \"through_emulsion\", label: \"Through coolant / emulsion\" },\n            { value: \"external_emulsion\", label: \"External emulsion\" },\n            { value: \"oil\", label: \"Cutting oil\" },\n            { value: \"mql\", label: \"MQL / mist\" },\n            { value: \"dry\", label: \"Dry\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"core_hole_status\",\n          label: \"What is the core-hole or pre-drill status?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: core-hole size is a real load lever. It decides whether the finder should validate an existing hole or recommend the safer tap-drill diameter.\",\n          options: [\n            { value: \"actual_known\", label: \"Actual drill diameter is known\" },\n            { value: \"fixed_unknown\", label: \"Prepared, but actual size is unknown\" },\n            { value: \"recommend\", label: \"Need a recommendation\" },\n            { value: \"missing\", label: \"No core hole prepared yet\" },\n          ],\n        }),\n        cloneQuestion(\"thread_tolerance\", {\n          label: \"Target tolerance override\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: false,\n          helpText: \"Why it matters: if the default tolerance is not enough, this tightens the tap choice and the final fit-class check.\",\n          placeholder: \"e.g. 6H, 6HX or 2B\",\n          viewHint: { width: \"half\", emphasis: \"normal\" },\n        }),\n        createTextQuestion({\n          id: \"thread_designation_override\",\n          label: \"Custom thread designation override\",\n          placeholder: \"e.g. M10x1.5-6H or 1/4-20UNC-2B\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: use this only when the automatic type + size route does not cover the requested thread. The override wins over the simplified entry path.\",\n        }),\n        createTokenQuestion({\n          id: \"priority\",\n          label: \"What matters most?\",\n          group: \"advanced\",\n          required: false,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: when several blind-hole taps are technically valid, this biases the ranking toward process security, quality, tool life or productivity.\",\n          options: [\n            { value: \"process_security\", label: \"Process security\" },\n            { value: \"thread_quality\", label: \"Thread quality\" },\n            { value: \"tool_life\", label: \"Tool life\" },\n            { value: \"productivity\", label: \"Productivity\" },\n          ],\n        }),\n        createNumberQuestion({\n          id: \"actual_predrill_diameter_mm\",\n          label: \"Actual pre-drill diameter\",\n          unit: \"mm\",\n          group: \"core\",\n          required: true,\n          expertOnly: false,\n          visibleWhen: function visibleWhen(ctx) {\n            return toNullableString(ctx && ctx.answers && ctx.answers.core_hole_status) === \"actual_known\";\n          },\n          helpText: \"Why it matters: when the actual drill diameter is known, the module can compare it against the tap recommendation and estimate load or gauge risk much more reliably.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        createNumberQuestion({\n          id: \"actual_bottom_clearance_mm\",\n          label: \"Measured run-out to the bore bottom\",\n          unit: \"mm\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          helpText: \"Why it matters: when the real run-out is known, the finder can compare it against the tap chamfer demand and judge bottom-contact risk much more reliably.\",\n          viewHint: { width: \"half\", emphasis: \"normal\" },\n        }),\n        createTokenQuestion({\n          id: \"holder_type\",\n          label: \"Which holder is used?\",\n          group: \"machine\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: holder behavior changes how well the setup tolerates small pitch errors and how safely the tap reverses near the bore bottom.\",\n          options: [\n            { value: \"rigid_holder\", label: \"Rigid holder\" },\n            { value: \"synchro_chuck\", label: \"Synchro chuck\" },\n            { value: \"length_comp\", label: \"Length compensation\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"quality_sensitivity\",\n          label: \"Is the thread quality target especially critical?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: gauge-critical, low-burr or surface-critical blind threads justify a more conservative tap and more explicit warnings.\",\n          options: [\n            { value: \"general\", label: \"General quality\" },\n            { value: \"gauge_critical\", label: \"Gauge critical\" },\n            { value: \"low_burr\", label: \"Low burr priority\" },\n            { value: \"surface_critical\", label: \"Surface or sealing critical\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"problem_history\",\n          label: \"What has gone wrong before, if anything?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: previous tap breakage, chip packing, built-up edge or bottom-contact issues are strong indicators for a safer blind-hole recommendation.\",\n          options: [\n            { value: \"none\", label: \"No recurring issue\" },\n            { value: \"tap_breakage\", label: \"Tap breakage\" },\n            { value: \"chip_packing\", label: \"Chip packing\" },\n            { value: \"built_up_edge\", label: \"Built-up edge\" },\n            { value: \"gauge_failure\", label: \"Gauge failure\" },\n            { value: \"bottom_contact\", label: \"Bottom contact\" },\n            { value: \"high_torque\", label: \"High torque\" },\n          ],\n        }),\n        cloneQuestion(\"sealing_relevant\", {\n          label: \"Is sealing or pipe-thread function relevant?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          visibleWhen: function visibleWhen(ctx) {\n            return looksLikePipeThread(ctx);\n          },\n          helpText: \"Why it matters: sealing function changes how strictly the thread standard and tolerance need to be respected, especially for pipe-thread styles.\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n        }),\n      ];\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/tapping-blind/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, createRecipe, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getAnswer, prefilterByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var KIENZLE_BY_GROUP = Object.freeze({\n      P: 1659,\n      M: 1397,\n      K: 1125,\n      N: 700,\n      S: 1450,\n      H: 2400,\n    });\n    \n    var AUTO_THREAD_LIBRARY = Object.freeze({\n      M: Object.freeze({\n        \"3\": \"0.5\",\n        \"4\": \"0.7\",\n        \"5\": \"0.8\",\n        \"6\": \"1\",\n        \"8\": \"1.25\",\n        \"10\": \"1.5\",\n        \"12\": \"1.75\",\n        \"14\": \"2\",\n        \"16\": \"2\",\n        \"18\": \"2.5\",\n        \"20\": \"2.5\",\n        \"22\": \"2.5\",\n        \"24\": \"3\",\n        \"27\": \"3\",\n        \"30\": \"3.5\",\n      }),\n      MF: Object.freeze({\n        \"8\": \"1\",\n        \"10\": \"1.25\",\n        \"12\": \"1.5\",\n        \"14\": \"1.5\",\n        \"16\": \"1.5\",\n        \"18\": \"1.5\",\n        \"20\": \"1.5\",\n        \"24\": \"2\",\n        \"27\": \"2\",\n        \"30\": \"2\",\n      }),\n      EGM: Object.freeze({\n        \"6\": \"1\",\n        \"8\": \"1.25\",\n        \"10\": \"1.5\",\n        \"12\": \"1.75\",\n        \"14\": \"2\",\n        \"16\": \"2\",\n        \"18\": \"2.5\",\n        \"20\": \"2.5\",\n      }),\n      UNC: Object.freeze({\n        \"1/4\": \"20\",\n        \"5/16\": \"18\",\n        \"3/8\": \"16\",\n        \"7/16\": \"14\",\n        \"1/2\": \"13\",\n        \"5/8\": \"11\",\n        \"3/4\": \"10\",\n        \"1\": \"8\",\n      }),\n      UNF: Object.freeze({\n        \"1/4\": \"28\",\n        \"5/16\": \"24\",\n        \"3/8\": \"24\",\n        \"7/16\": \"20\",\n        \"1/2\": \"20\",\n        \"5/8\": \"18\",\n        \"3/4\": \"16\",\n        \"1\": \"12\",\n      }),\n      G: Object.freeze({\n        \"1/8\": \"28\",\n        \"1/4\": \"19\",\n        \"3/8\": \"19\",\n        \"1/2\": \"14\",\n        \"3/4\": \"14\",\n        \"1\": \"11\",\n      }),\n      NPT: Object.freeze({\n        \"1/8\": \"27\",\n        \"1/4\": \"18\",\n        \"3/8\": \"18\",\n        \"1/2\": \"14\",\n        \"3/4\": \"14\",\n        \"1\": \"11.5\",\n      }),\n    });\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function clamp01(value) {\n      if (value == null || !Number.isFinite(value)) return 0;\n      if (value <= 0) return 0;\n      if (value >= 1) return 1;\n      return value;\n    }\n    \n    function roundValue(value, digits) {\n      var factor = Math.pow(10, digits == null ? 2 : digits);\n      if (value == null || !Number.isFinite(value)) return null;\n      return Math.round(value * factor) / factor;\n    }\n    \n    function firstNonNull(values) {\n      for (var index = 0; index < values.length; index += 1) {\n        if (values[index] != null) return values[index];\n      }\n      return null;\n    }\n    \n    function parseFractionToken(value) {\n      var text = toNullableString(value);\n      var parts;\n      var whole;\n      if (!text) return null;\n      if (text.indexOf(\"-\") >= 0) {\n        parts = text.split(\"-\");\n        if (parts.length === 2) {\n          whole = Number(parts[0]);\n          if (!Number.isFinite(whole)) return null;\n          return whole + (parseFractionToken(parts[1]) || 0);\n        }\n      }\n      if (text.indexOf(\"/\") >= 0) {\n        parts = text.split(\"/\");\n        if (parts.length !== 2 || !Number(parts[1])) return null;\n        return Number(parts[0]) / Number(parts[1]);\n      }\n      return toNullableNumber(text);\n    }\n    \n    function normalizeThreadForm(value) {\n      var text = toNullableString(value);\n      if (!text) return null;\n      text = text.toUpperCase();\n      if (text.indexOf(\"UNF\") >= 0) return \"UNF\";\n      if (text.indexOf(\"UNC\") >= 0) return \"UNC\";\n      if (text.indexOf(\"NPT\") >= 0) return \"NPT\";\n      if (text.indexOf(\"MF\") === 0) return \"MF\";\n      if (text.indexOf(\"EGM\") === 0) return \"EGM\";\n      if (text.indexOf(\"M\") === 0) return \"M\";\n      if (text.indexOf(\"G\") === 0) return \"G\";\n      if (text.indexOf(\"R\") === 0) return \"R\";\n      return text;\n    }\n    \n    function normalizeNominalSizeInput(threadStandard, value) {\n      var text = toNullableString(value);\n      var numeric;\n      if (!text) return null;\n      text = text.trim().toUpperCase().replace(/\\s+/g, \"\");\n      if (threadStandard === \"M\" || threadStandard === \"MF\" || threadStandard === \"EGM\") {\n        text = text.replace(/^(M|MF|EGM)/, \"\");\n        numeric = toNullableNumber(text);\n        return numeric == null ? null : String(numeric).replace(/\\.0+$/, \"\");\n      }\n      return text.replace(/^(UNC|UNF|NPT|G)/, \"\");\n    }\n    \n    function buildAutoThreadDesignation(threadStandard, nominalSize, tolerance) {\n      var standard = normalizeThreadForm(threadStandard);\n      var sizeKey = normalizeNominalSizeInput(standard, nominalSize);\n      var pitchToken;\n      if (!standard || !sizeKey) {\n        return { designation: null, supported: false, standard: standard, nominalSize: sizeKey, pitchToken: null };\n      }\n      pitchToken = AUTO_THREAD_LIBRARY[standard] && AUTO_THREAD_LIBRARY[standard][sizeKey];\n      if (!pitchToken) {\n        return { designation: null, supported: false, standard: standard, nominalSize: sizeKey, pitchToken: null };\n      }\n      if (standard === \"M\" || standard === \"MF\" || standard === \"EGM\") {\n        return {\n          designation: standard + sizeKey + \"x\" + pitchToken + (tolerance ? \"-\" + tolerance : \"\"),\n          supported: true,\n          standard: standard,\n          nominalSize: sizeKey,\n          pitchToken: pitchToken,\n        };\n      }\n      if (standard === \"UNC\" || standard === \"UNF\" || standard === \"NPT\") {\n        return {\n          designation: sizeKey + \"-\" + pitchToken + standard + (tolerance ? \"-\" + tolerance : \"\"),\n          supported: true,\n          standard: standard,\n          nominalSize: sizeKey,\n          pitchToken: pitchToken,\n        };\n      }\n      if (standard === \"G\") {\n        return {\n          designation: \"G\" + sizeKey + (tolerance ? \"-\" + tolerance : \"\"),\n          supported: true,\n          standard: standard,\n          nominalSize: sizeKey,\n          pitchToken: pitchToken,\n        };\n      }\n      return { designation: null, supported: false, standard: standard, nominalSize: sizeKey, pitchToken: pitchToken };\n    }\n    \n    function buildManualThreadDesignation(threadStandard, nominalSize) {\n      var standard = normalizeThreadForm(threadStandard);\n      var text = toNullableString(nominalSize);\n      var compact;\n      if (!standard || !text) return null;\n      compact = text.trim().toUpperCase().replace(/\\s+/g, \"\");\n      if (!compact) return null;\n      if (/^[A-Z]/.test(compact)) return compact;\n      if (standard === \"M\" || standard === \"MF\" || standard === \"EGM\") return standard + compact;\n      if (standard === \"G\" || standard === \"R\") return standard + compact;\n      if (standard === \"UNC\" || standard === \"UNF\" || standard === \"NPT\") {\n        return compact.indexOf(\"-\") >= 0 ? compact + standard : compact;\n      }\n      return compact;\n    }\n    \n    function parseThreadIdentity(value, explicitTolerance, explicitForm) {\n      var text = toNullableString(value);\n      var compact;\n      var match;\n      var form;\n      var size;\n      var pitchToken;\n      var tpi;\n      var tolerance = toNullableString(explicitTolerance);\n      var forcedForm = normalizeThreadForm(explicitForm);\n      var nominalMm = null;\n      var pitchMm = null;\n      if (!text) {\n        return {\n          standard: null,\n          size: null,\n          pitch: null,\n          pitchMm: null,\n          tolerance: tolerance,\n          pipeFlag: false,\n          nominalDiameterMm: null,\n          canonicalLabel: null,\n          valid: false,\n        };\n      }\n    \n      compact = text.replace(/\\s+/g, \"\").toUpperCase();\n    \n      match = compact.match(/^([A-Z]+)([0-9]+(?:[.,][0-9]+)?)(?:X([0-9]+(?:[.,][0-9]+)?))?(?:-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = forcedForm || normalizeThreadForm(match[1]);\n        size = form + match[2] + (match[3] ? \"x\" + match[3].replace(\",\", \".\") : \"\");\n        pitchToken = match[3] ? match[3].replace(\",\", \".\") : null;\n        pitchMm = toNullableNumber(pitchToken);\n        nominalMm = toNullableNumber(match[2]);\n        tolerance = tolerance || toNullableString(match[4]);\n        return {\n          standard: form,\n          size: size,\n          pitch: pitchToken,\n          pitchMm: pitchMm,\n          tolerance: tolerance,\n          pipeFlag: form === \"G\" || form === \"R\" || form === \"NPT\",\n          nominalDiameterMm: nominalMm,\n          canonicalLabel: size + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n    \n      match = compact.match(/^([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)\\-([0-9]+)(UNC|UNF)(?:\\-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = forcedForm || normalizeThreadForm(match[3]);\n        tpi = toNullableNumber(match[2]);\n        pitchMm = tpi ? 25.4 / tpi : null;\n        nominalMm = parseFractionToken(match[1]);\n        nominalMm = nominalMm != null ? nominalMm * 25.4 : null;\n        tolerance = tolerance || toNullableString(match[4]);\n        size = match[1] + \"-\" + match[2] + form;\n        return {\n          standard: form,\n          size: size,\n          pitch: match[2],\n          pitchMm: pitchMm,\n          tolerance: tolerance,\n          pipeFlag: false,\n          nominalDiameterMm: nominalMm,\n          canonicalLabel: size + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n    \n      match = compact.match(/^([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)\\-([0-9]+)(NPT)(?:\\-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = forcedForm || \"NPT\";\n        tpi = toNullableNumber(match[2]);\n        pitchMm = tpi ? 25.4 / tpi : null;\n        nominalMm = parseFractionToken(match[1]);\n        nominalMm = nominalMm != null ? nominalMm * 25.4 : null;\n        tolerance = tolerance || toNullableString(match[4]);\n        size = match[1] + \"-\" + match[2] + form;\n        return {\n          standard: form,\n          size: size,\n          pitch: match[2],\n          pitchMm: pitchMm,\n          tolerance: tolerance,\n          pipeFlag: true,\n          nominalDiameterMm: nominalMm,\n          canonicalLabel: size + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n    \n      match = compact.match(/^([GR])([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)$/);\n      if (match) {\n        form = forcedForm || match[1];\n        nominalMm = parseFractionToken(match[2]);\n        nominalMm = nominalMm != null ? nominalMm * 25.4 : null;\n        size = form + match[2];\n        return {\n          standard: form,\n          size: size,\n          pitch: null,\n          pitchMm: null,\n          tolerance: tolerance,\n          pipeFlag: true,\n          nominalDiameterMm: nominalMm,\n          canonicalLabel: size + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n    \n      return {\n        standard: forcedForm || normalizeThreadForm(compact),\n        size: compact,\n        pitch: null,\n        pitchMm: null,\n        tolerance: tolerance,\n        pipeFlag: compact.indexOf(\"NPT\") >= 0 || compact.indexOf(\"G\") === 0 || compact.indexOf(\"R\") === 0,\n        nominalDiameterMm: null,\n        canonicalLabel: compact + (tolerance ? \"-\" + tolerance : \"\"),\n        valid: false,\n      };\n    }\n    \n    function getMaterialGroup(materialCode) {\n      var text = toNullableString(materialCode);\n      if (!text) return null;\n      return text.toUpperCase().charAt(0);\n    }\n    \n    function mapSyncMode(syncMode) {\n      switch (toNullableString(syncMode)) {\n        case \"rigid\":\n          return { label: \"Rigid tapping\", score: 1, stable: true };\n        case \"synchro_chuck\":\n          return { label: \"Synchro chuck\", score: 0.92, stable: true };\n        case \"unknown\":\n          return { label: \"Unknown tapping mode\", score: 0.55, stable: false };\n        case \"no\":\n          return { label: \"No sync mode\", score: 0, stable: false };\n        default:\n          return { label: \"Unspecified tapping mode\", score: 0.45, stable: false };\n      }\n    }\n    \n    function mapBottomClearanceClass(value) {\n      switch (toNullableString(value)) {\n        case \"comfortable\":\n          return { code: \"low\", weight: 0.1, label: \"Enough run-out\", input: \"comfortable\" };\n        case \"short\":\n          return { code: \"medium\", weight: 0.48, label: \"Short run-out\", input: \"short\" };\n        case \"minimal\":\n          return { code: \"high\", weight: 0.82, label: \"Very short / near bottom\", input: \"minimal\" };\n        case \"unknown\":\n          return { code: \"medium\", weight: 0.42, label: \"Unknown run-out\", input: \"unknown\" };\n        default:\n          return { code: \"medium\", weight: 0.45, label: \"Unspecified run-out\", input: null };\n      }\n    }\n    \n    function mapCoolantModeAnswer(value) {\n      switch (toNullableString(value)) {\n        case \"through_emulsion\":\n          return { normalized: \"through\", label: \"Through coolant / emulsion\", quality: 1 };\n        case \"external_emulsion\":\n          return { normalized: \"external\", label: \"External emulsion\", quality: 0.78 };\n        case \"oil\":\n          return { normalized: \"external\", label: \"Cutting oil\", quality: 0.95 };\n        case \"mql\":\n          return { normalized: \"mist\", label: \"MQL / mist\", quality: 0.62 };\n        case \"dry\":\n          return { normalized: \"dry\", label: \"Dry\", quality: 0.2 };\n        case \"unknown\":\n          return { normalized: \"unknown\", label: \"Unknown coolant mode\", quality: 0.45 };\n        default:\n          return { normalized: \"unknown\", label: \"Unspecified coolant mode\", quality: 0.45 };\n      }\n    }\n    \n    function normalizeTolerance(value) {\n      var text = toNullableString(value);\n      return text ? text.toUpperCase() : null;\n    }\n    \n    function normalizeCoreHoleRoute(value) {\n      switch (toNullableString(value)) {\n        case \"actual_known\":\n        case \"fixed_unknown\":\n        case \"recommend\":\n        case \"missing\":\n          return value;\n        default:\n          return null;\n      }\n    }\n    \n    function getChamferLengthPitchFallback(chamferForm) {\n      switch (normalizeTolerance(chamferForm)) {\n        case \"E\":\n          return 1;\n        case \"C\":\n          return 2.5;\n        case \"B\":\n        case \"D\":\n          return 4;\n        case \"A\":\n          return 7;\n        default:\n          return 3;\n      }\n    }\n    \n    function deriveRecommendedChamfer(materialGroup, bottomClearanceCode, threadDepthRatio) {\n      if (bottomClearanceCode === \"high\") return \"E\";\n      if (materialGroup === \"S\" && threadDepthRatio != null && threadDepthRatio > 1.5) return \"E\";\n      if (materialGroup === \"M\" && bottomClearanceCode === \"medium\" && threadDepthRatio != null && threadDepthRatio > 1.4) return \"E\";\n      return \"C\";\n    }\n    \n    function computeBottomClearanceMetrics(candidate, derived) {\n      var chamferForm = normalizeTolerance(candidate.threading.tapChamferForm);\n      var pitchMm = derived.pitchMm;\n      var actualBottomClearanceMm = derived.actualBottomClearanceMm;\n      var bottomClearance = derived.bottomClearance;\n      var chamferLengthP = toNullableNumber(candidate.threading.tapChamferLengthP);\n      var chamferLengthMm;\n      var marginMm = null;\n      var fitScore = 0.45;\n      var riskClass = bottomClearance.code === \"high\" ? \"critical\" : bottomClearance.code === \"medium\" ? \"tight\" : \"safe\";\n    \n      if (chamferLengthP == null) chamferLengthP = getChamferLengthPitchFallback(chamferForm);\n      chamferLengthMm = pitchMm != null && chamferLengthP != null ? chamferLengthP * pitchMm : null;\n    \n      if (actualBottomClearanceMm != null && chamferLengthMm != null) {\n        marginMm = actualBottomClearanceMm - chamferLengthMm;\n        if (marginMm >= Math.max((pitchMm || 0) * 0.75, 0.5)) {\n          fitScore = 1;\n          riskClass = \"safe\";\n        } else if (marginMm >= 0.2) {\n          fitScore = 0.8;\n          riskClass = \"tight\";\n        } else if (marginMm >= 0) {\n          fitScore = 0.55;\n          riskClass = \"tight\";\n        } else {\n          fitScore = 0;\n          riskClass = \"critical\";\n        }\n      } else if (bottomClearance.input === \"comfortable\") {\n        fitScore = chamferForm === \"B\" ? 0.52 : 0.92;\n      } else if (bottomClearance.input === \"short\") {\n        if (chamferForm === \"E\") fitScore = 0.92;\n        else if (chamferForm === \"C\") fitScore = 0.72;\n        else fitScore = 0.32;\n      } else if (bottomClearance.input === \"minimal\") {\n        if (chamferForm === \"E\") fitScore = 0.72;\n        else if (chamferForm === \"C\") fitScore = 0.28;\n        else fitScore = 0.05;\n      }\n    \n      return {\n        classCode: bottomClearance.code,\n        classLabel: bottomClearance.label,\n        inputClass: bottomClearance.input,\n        actualMm: actualBottomClearanceMm,\n        chamferLengthP: chamferLengthP,\n        chamferLengthMm: chamferLengthMm != null ? roundValue(chamferLengthMm, 2) : null,\n        marginMm: marginMm != null ? roundValue(marginMm, 2) : null,\n        riskClass: riskClass,\n        fitScore: clamp01(fitScore),\n      };\n    }\n    \n    function computeGeometrySuitability(candidate, derived, bottomClearanceMetrics) {\n      var materialGroup = derived.materialGroup;\n      var chamfer = normalizeTolerance(candidate.threading.tapChamferForm);\n      var helix = toNullableNumber(candidate.threading.tapHelixDeg);\n      var bottomClearance = derived.bottomClearance;\n      var score = 0.45;\n    \n      if (materialGroup === \"P\") {\n        if (chamfer === \"C\" && helix != null && helix >= 15) score = 1;\n        else if (chamfer === \"C\") score = 0.88;\n        else if (chamfer === \"E\") score = bottomClearance.code === \"high\" ? 0.86 : 0.62;\n        else if (chamfer === \"B\") score = 0.18;\n      } else if (materialGroup === \"M\") {\n        if (chamfer === \"C\" && helix != null && helix >= 25) score = 1;\n        else if (chamfer === \"C\") score = 0.82;\n        else if (chamfer === \"E\") score = bottomClearance.code === \"high\" ? 0.68 : 0.4;\n        else if (chamfer === \"B\") score = 0.08;\n      } else if (materialGroup === \"K\") {\n        if (chamfer === \"C\" && (helix == null || helix <= 20)) score = 0.95;\n        else if (chamfer === \"C\") score = 0.76;\n        else if (chamfer === \"E\") score = bottomClearance.code === \"high\" ? 0.72 : 0.55;\n        else if (chamfer === \"B\") score = 0.14;\n      } else if (materialGroup === \"N\") {\n        if (chamfer === \"C\" && helix != null && helix >= 15) score = 0.9;\n        else if (chamfer === \"C\") score = 0.8;\n        else if (chamfer === \"E\") score = bottomClearance.code === \"high\" ? 0.78 : 0.52;\n        else if (chamfer === \"B\") score = 0.16;\n      } else if (materialGroup === \"S\") {\n        if (chamfer === \"C\" && helix != null && helix >= 25) score = 0.84;\n        else if (chamfer === \"C\") score = 0.72;\n        else if (chamfer === \"E\") score = bottomClearance.code === \"high\" ? 0.58 : 0.38;\n        else if (chamfer === \"B\") score = 0.1;\n      } else if (materialGroup === \"H\") {\n        if (chamfer === \"C\") score = 0.34;\n        else if (chamfer === \"E\") score = 0.22;\n        else score = 0.08;\n      }\n    \n      if (bottomClearance.code === \"high\") {\n        if (chamfer === \"E\") score += 0.08;\n        else if (chamfer === \"C\") score -= 0.12;\n        else score -= 0.22;\n      } else if (bottomClearance.code === \"medium\") {\n        if (chamfer === \"E\") score += 0.04;\n        else if (chamfer === \"B\") score -= 0.12;\n        else score -= 0.04;\n      }\n    \n      if (materialGroup === \"K\" && helix != null && helix > 25) score -= 0.12;\n      if ((materialGroup === \"P\" || materialGroup === \"M\" || materialGroup === \"N\" || materialGroup === \"S\") && helix != null && helix < 10) score -= 0.08;\n      if (bottomClearanceMetrics && bottomClearanceMetrics.riskClass === \"critical\") score -= 0.14;\n    \n      return clamp01(score);\n    }\n    \n    function computeProgramFit(candidate, materialGroup) {\n      var attachments = candidate.attachments || {};\n      var catalog = attachments.catalogContext || {};\n      var materialContext = attachments.materialContext || {};\n      var series = toNullableString(catalog.series);\n      var isoGroups = (materialContext.isoGroups && materialContext.isoGroups.codes) || [];\n      var seriesUpper = series ? series.toUpperCase() : null;\n    \n      if (isoGroups.length > 0 && isoGroups.indexOf(materialGroup) >= 0) return 1;\n      if (seriesUpper) {\n        if (seriesUpper.indexOf(\"INOX\") >= 0 && (materialGroup === \"M\" || materialGroup === \"S\")) return 0.95;\n        if (seriesUpper.indexOf(\"UNI\") >= 0) return 0.8;\n        if (seriesUpper.indexOf(\"TYPE G\") >= 0 && (materialGroup === \"K\" || materialGroup === \"N\")) return 0.95;\n        if (seriesUpper.indexOf(\"THROUGH\") >= 0) return 0.75;\n      }\n      return isoGroups.length > 0 ? 0.45 : 0.55;\n    }\n    \n    function computeToleranceMatch(candidate, requestedTolerance) {\n      var candidateTolerance = normalizeTolerance(candidate.threading.tapTolerance);\n      var request = normalizeTolerance(requestedTolerance);\n      if (!request && candidateTolerance) return 0.72;\n      if (!request || !candidateTolerance) return 0.45;\n      if (request === candidateTolerance) return 1;\n      if (request.replace(/\\+/g, \"\") === candidateTolerance.replace(/\\+/g, \"\")) return 0.8;\n      return 0.18;\n    }\n    \n    function computeLengthMetrics(candidate, requiredLengthMm) {\n      var apmx = toNullableNumber(candidate.common.apmxMm);\n      var usable = toNullableNumber(candidate.common.usableLengthMm);\n      var apmxMargin = apmx != null && requiredLengthMm != null ? apmx - requiredLengthMm : null;\n      var usableMargin = usable != null && requiredLengthMm != null ? usable - requiredLengthMm : null;\n      var minMargin = firstNonNull([usableMargin, apmxMargin]);\n      var fitScore = 0.55;\n    \n      if (requiredLengthMm == null) {\n        fitScore = 0.4;\n      } else if (usableMargin != null || apmxMargin != null) {\n        if ((usableMargin != null && usableMargin < 0) || (apmxMargin != null && apmxMargin < 0)) {\n          fitScore = 0;\n        } else if (minMargin != null && minMargin >= requiredLengthMm * 0.3) {\n          fitScore = 1;\n        } else if (minMargin != null && minMargin >= requiredLengthMm * 0.1) {\n          fitScore = 0.84;\n        } else if (minMargin != null && minMargin >= 0) {\n          fitScore = 0.66;\n        }\n      }\n    \n      return {\n        apmxMm: apmx,\n        usableLengthMm: usable,\n        apmxMarginMm: apmxMargin,\n        usableMarginMm: usableMargin,\n        fitScore: fitScore,\n      };\n    }\n    \n    function computePredrillMetrics(candidate, derived) {\n      var recommended = toNullableNumber(candidate.drilling.preDrillDiameterMm);\n      var actual = derived.actualPredrillMm;\n      var delta = actual != null && recommended != null ? actual - recommended : null;\n      var status = derived.coreHoleRoute;\n      var fitScore = 0.42;\n    \n      if (status === \"recommend\") {\n        fitScore = recommended != null ? 0.9 : 0.35;\n      } else if (status === \"fixed_unknown\") {\n        fitScore = recommended != null ? 0.7 : 0.3;\n      } else if (status === \"actual_known\") {\n        if (recommended == null || actual == null) {\n          fitScore = 0.2;\n        } else if (Math.abs(delta) <= 0.03) {\n          fitScore = 1;\n        } else if (Math.abs(delta) <= 0.08) {\n          fitScore = 0.8;\n        } else if (Math.abs(delta) <= 0.15) {\n          fitScore = 0.5;\n        } else {\n          fitScore = 0.1;\n        }\n      } else if (status === \"missing\") {\n        fitScore = 0;\n      }\n    \n      return {\n        recommendedMm: recommended,\n        actualMm: actual,\n        deltaMm: delta,\n        fitScore: fitScore,\n      };\n    }\n    \n    function computeCoolantFit(candidate, derived, rowCoolantMode) {\n      var mode = derived.coolant;\n      var score = mode.quality;\n      if (mode.normalized === \"through\" && candidate.common.coolantTsc === true) score += 0.12;\n      if (mode.normalized === \"through\" && candidate.common.coolantTsc === false) score -= 0.18;\n      if (mode.normalized === \"dry\" && (derived.materialGroup === \"M\" || derived.materialGroup === \"S\" || derived.materialGroup === \"H\")) score -= 0.18;\n      if (rowCoolantMode && mode.normalized && rowCoolantMode === mode.normalized) score += 0.08;\n      return clamp01(score);\n    }\n    \n    function computePriorityBias(priority, metrics) {\n      switch (toNullableString(priority)) {\n        case \"process_security\":\n          return clamp01((metrics.geometrySuitability + metrics.machineFit + metrics.bottomFit) / 3);\n        case \"thread_quality\":\n          return clamp01((metrics.toleranceFit + metrics.predrillFit + metrics.bottomFit) / 3);\n        case \"tool_life\":\n          return clamp01((metrics.coolantFit + (1 - metrics.loadRiskWeight) + metrics.geometrySuitability) / 3);\n        case \"productivity\":\n          return metrics.recipeSource === \"none\" ? 0.45 : 0.72;\n        default:\n          return 0.55;\n      }\n    }\n    \n    function computeLoadProfile(derived, candidate, predrillMetrics, geometrySuitability, bottomClearanceMetrics) {\n      var kc = KIENZLE_BY_GROUP[derived.materialGroup] || 1300;\n      var diameter = derived.nominalDiameterMm || toNullableNumber(candidate.common.diameterMm);\n      var pitchMm = derived.pitchMm;\n      var predrill = predrillMetrics.recommendedMm;\n      var spanSection = null;\n      var loadIndex = null;\n      var loadClass = \"medium\";\n      if (diameter != null && pitchMm != null && predrill != null) {\n        spanSection = ((diameter - predrill) / 4) * pitchMm;\n        loadIndex = kc * Math.max(spanSection, 0.01);\n        if (derived.threadDepthRatio != null) loadIndex = loadIndex * (1 + Math.max(0, derived.threadDepthRatio - 1) * 0.25);\n        loadIndex = loadIndex * (1 + derived.bottomClearance.weight * 0.16);\n        loadIndex = loadIndex * (1 + (1 - geometrySuitability) * 0.25);\n        if (bottomClearanceMetrics && bottomClearanceMetrics.riskClass === \"critical\") loadIndex = loadIndex * 1.18;\n        if (loadIndex >= 1200) loadClass = \"high\";\n        else if (loadIndex <= 700) loadClass = \"low\";\n      } else {\n        loadClass = derived.materialGroup === \"N\" ? \"low\" : (derived.materialGroup === \"H\" || derived.materialGroup === \"S\" ? \"high\" : \"medium\");\n      }\n      return {\n        kienzleKc: kc,\n        spanSection: spanSection,\n        loadIndex: loadIndex != null ? roundValue(loadIndex, 0) : null,\n        loadClass: loadClass,\n        loadRiskWeight: loadClass === \"high\" ? 0.85 : loadClass === \"medium\" ? 0.45 : 0.18,\n      };\n    }\n    \n    function computeRpmWindow(recipe, nominalDiameterMm) {\n      function rpmFromVc(vc) {\n        if (vc == null || nominalDiameterMm == null || nominalDiameterMm <= 0) return null;\n        return (1000 * vc) / (Math.PI * nominalDiameterMm);\n      }\n      return {\n        min: roundValue(rpmFromVc(recipe && recipe.vc && recipe.vc.min), 0),\n        typ: roundValue(rpmFromVc(recipe && recipe.vc && recipe.vc.typ), 0),\n        max: roundValue(rpmFromVc(recipe && recipe.vc && recipe.vc.max), 0),\n      };\n    }\n    \n    function computeFeedWindow(rpmWindow, pitchMm) {\n      function feedFromRpm(rpm) {\n        return rpm != null && pitchMm != null ? rpm * pitchMm : null;\n      }\n      return {\n        min: roundValue(feedFromRpm(rpmWindow.min), 0),\n        typ: roundValue(feedFromRpm(rpmWindow.typ), 0),\n        max: roundValue(feedFromRpm(rpmWindow.max), 0),\n      };\n    }\n    \n    function buildDerived(ctx) {\n      var toleranceOverride = normalizeTolerance(getAnswer(ctx, \"thread_tolerance\"));\n      var simpleThread = buildAutoThreadDesignation(\n        getAnswer(ctx, \"thread_standard_choice\"),\n        getAnswer(ctx, \"thread_nominal_size\"),\n        toleranceOverride\n      );\n      var designationOverride = toNullableString(getAnswer(ctx, \"thread_designation_override\"));\n      var fallbackDesignation = toNullableString(getAnswer(ctx, \"thread_designation\"));\n      var canonicalDesignation = designationOverride || simpleThread.designation || fallbackDesignation;\n      var parsed = parseThreadIdentity(\n        canonicalDesignation,\n        toleranceOverride,\n        designationOverride ? null : (simpleThread.standard || getAnswer(ctx, \"thread_standard_choice\"))\n      );\n      var threadLengthMm = toNullableNumber(getAnswer(ctx, \"thread_length_mm\"));\n      var actualPredrillMm = toNullableNumber(getAnswer(ctx, \"actual_predrill_diameter_mm\"));\n      var actualBottomClearanceMm = toNullableNumber(getAnswer(ctx, \"actual_bottom_clearance_mm\"));\n      var materialCode = ctx.material && ctx.material.subgroupCode;\n      var materialGroup = getMaterialGroup(materialCode);\n      var bottomClearance = mapBottomClearanceClass(getAnswer(ctx, \"bottom_clearance_class\"));\n      var coolant = mapCoolantModeAnswer(getAnswer(ctx, \"coolant_lubrication_mode\"));\n      var machineMode = mapSyncMode(getAnswer(ctx, \"sync_tapping_capability\"));\n      var coreHoleRoute = normalizeCoreHoleRoute(getAnswer(ctx, \"core_hole_status\"));\n      var nominalDiameterMm = parsed.nominalDiameterMm;\n      var threadDepthRatio = nominalDiameterMm && threadLengthMm ? threadLengthMm / nominalDiameterMm : null;\n      return {\n        parsed: parsed,\n        canonicalDesignation: canonicalDesignation,\n        simpleThread: simpleThread,\n        materialCode: materialCode,\n        materialGroup: materialGroup,\n        threadLengthMm: threadLengthMm,\n        nominalDiameterMm: nominalDiameterMm,\n        pitchMm: parsed.pitchMm,\n        pitchLabel: parsed.pitch || (parsed.pitchMm != null ? String(parsed.pitchMm) : null),\n        threadTolerance: toleranceOverride || parsed.tolerance,\n        bottomClearance: bottomClearance,\n        coolant: coolant,\n        machineMode: machineMode,\n        coreHoleRoute: coreHoleRoute,\n        actualPredrillMm: actualPredrillMm,\n        actualBottomClearanceMm: actualBottomClearanceMm,\n        threadDepthRatio: threadDepthRatio,\n        recommendedChamferClass: deriveRecommendedChamfer(materialGroup, bottomClearance.code, threadDepthRatio),\n        holderType: toNullableString(getAnswer(ctx, \"holder_type\")),\n        qualitySensitivity: toNullableString(getAnswer(ctx, \"quality_sensitivity\")),\n        problemHistory: toNullableString(getAnswer(ctx, \"problem_history\")),\n        priority: toNullableString(getAnswer(ctx, \"priority\")),\n        sealingRelevant: toNullableString(getAnswer(ctx, \"sealing_relevant\")) === \"yes\",\n      };\n    }\n    \n    function buildReasons(metrics, scoreParts) {\n      var reasons = [];\n      if (scoreParts.threadIdentity >= 2.5) reasons.push(\"Thread form and size match exactly.\");\n      if (metrics.geometrySuitability >= 0.85) reasons.push(\"Tap geometry suits blind-hole chip evacuation and the selected material.\");\n      if (metrics.predrillFit >= 0.8) reasons.push(\"Pre-drill guidance aligns well with the requested setup.\");\n      if (metrics.lengthFit >= 0.8) reasons.push(\"Length window covers the required full thread safely.\");\n      if (metrics.bottomFit >= 0.8) reasons.push(\"Bottom reserve and chamfer length stay in a stable blind-hole window.\");\n      if (metrics.coolantFit >= 0.8) reasons.push(\"Coolant or lubrication supports the tapping window.\");\n      if (metrics.machineFit >= 0.85) reasons.push(\"Machine synchronization supports stable tapping.\");\n      if (metrics.programFit >= 0.85) reasons.push(\"Series and material program fit the selected ISO subgroup.\");\n      if (metrics.loadClass === \"high\") reasons.push(\"Expect a higher tapping load window for this setup.\");\n      return reasons.slice(0, 5);\n    }\n    \n    function derive(ctx) {\n      var derived = buildDerived(ctx);\n      return {\n        thread_designation: derived.canonicalDesignation,\n        thread_standard: derived.parsed.standard,\n        thread_size: derived.parsed.size,\n        pitch: derived.parsed.pitch,\n        pitch_mm: derived.parsed.pitchMm,\n        pipe_flag: derived.parsed.pipeFlag,\n        thread_tolerance_target: derived.threadTolerance,\n        requested_thread_nominal_mm: derived.nominalDiameterMm,\n        required_full_thread_length_mm: derived.threadLengthMm,\n        required_depth_ratio: derived.threadDepthRatio != null ? roundValue(derived.threadDepthRatio, 2) : null,\n        machine_mode_class: derived.machineMode.label,\n        coolant_mode_normalized: derived.coolant.normalized,\n        bottom_clearance_class: derived.bottomClearance.code,\n        bottom_clearance_label: derived.bottomClearance.label,\n        predrill_validation_route: derived.coreHoleRoute,\n        recommended_chamfer_class: derived.recommendedChamferClass,\n      };\n    }\n    \n    function validate(ctx) {\n      var issues = [];\n      var derived = buildDerived(ctx);\n      var selectedStandard = toNullableString(getAnswer(ctx, \"thread_standard_choice\"));\n      var selectedSize = toNullableString(getAnswer(ctx, \"thread_nominal_size\"));\n    \n      if (selectedStandard && selectedSize && !derived.simpleThread.supported && !toNullableString(getAnswer(ctx, \"thread_designation_override\"))) {\n        issues.push({\n          field: \"thread_nominal_size\",\n          message: \"This nominal size is not yet available for automatic pitch derivation. Use the custom designation override for this thread.\",\n          severity: \"error\",\n          code: \"thread_size_not_supported\",\n        });\n      } else if (!derived.parsed.valid) {\n        issues.push({\n          field: selectedStandard ? \"thread_nominal_size\" : \"thread_designation_override\",\n          message: \"Enter a supported thread type and nominal size, or use a parseable custom designation such as M10x1.5-6H or 1/4-20UNC-2B.\",\n          severity: \"error\",\n          code: \"thread_designation_invalid\",\n        });\n      }\n      if (derived.machineMode.score <= 0) {\n        issues.push({\n          field: \"sync_tapping_capability\",\n          message: \"Blind-hole tapping requires rigid tapping or a synchro chuck.\",\n          severity: \"error\",\n          code: \"sync_required\",\n        });\n      } else if (toNullableString(getAnswer(ctx, \"sync_tapping_capability\")) === \"unknown\") {\n        issues.push({\n          field: \"sync_tapping_capability\",\n          message: \"Machine synchronization is unclear. Verify rigid tapping or a synchro chuck before release.\",\n          severity: \"warning\",\n          code: \"sync_unknown\",\n        });\n      }\n      if (derived.coreHoleRoute === \"missing\") {\n        issues.push({\n          field: \"core_hole_status\",\n          message: \"Prepare the core hole first or switch to a recommendation route before blind-hole tapping.\",\n          severity: \"error\",\n          code: \"core_hole_missing\",\n        });\n      }\n      if (derived.threadDepthRatio != null && derived.threadDepthRatio > 1.5) {\n        issues.push({\n          field: \"thread_length_mm\",\n          message: \"Required full thread length is above 1.5 x D. Expect a tighter tapping window and stronger length checks.\",\n          severity: \"warning\",\n          code: \"thread_depth_ratio_high\",\n        });\n      }\n      if (derived.coolant.normalized === \"dry\" && (derived.materialGroup === \"M\" || derived.materialGroup === \"S\" || derived.materialGroup === \"H\")) {\n        issues.push({\n          field: \"coolant_lubrication_mode\",\n          message: \"Dry tapping is a high-risk setup for this ISO subgroup. Re-check coolant or lubrication support.\",\n          severity: \"warning\",\n          code: \"coolant_risk_high\",\n        });\n      }\n      if (derived.bottomClearance.input === \"unknown\") {\n        issues.push({\n          field: \"bottom_clearance_class\",\n          message: \"Bottom run-out is still unknown. That keeps the blind-hole safety window less certain.\",\n          severity: \"warning\",\n          code: \"bottom_clearance_unknown\",\n        });\n      } else if (derived.bottomClearance.code === \"high\") {\n        issues.push({\n          field: \"bottom_clearance_class\",\n          message: \"Bottom run-out is very short for a blind-hole tap. Review chamfer length and bottom reserve carefully.\",\n          severity: \"warning\",\n          code: \"bottom_clearance_critical\",\n        });\n      }\n      if (derived.sealingRelevant && !derived.parsed.pipeFlag) {\n        issues.push({\n          field: \"sealing_relevant\",\n          message: \"Sealing relevance is set, but the current designation is not a pipe-thread style.\",\n          severity: \"warning\",\n          code: \"sealing_non_pipe\",\n        });\n      }\n      if (derived.materialGroup === \"H\") {\n        issues.push({\n          field: null,\n          message: \"No normal H-group blind-tap inventory is expected in the current shop data. Expect conservative results or an alternative-process hint.\",\n          severity: \"warning\",\n          code: \"hard_material_boundary\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"tapping_blind\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var threadingTools = toolkits.threading;\n      var derived = buildDerived(ctx);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = threadingTools.resolveRows(candidate, ctx);\n        var recipeResult = threadingTools.resolveRecipe(candidate, ctx);\n        var recipeRow = recipeResult.row || null;\n        var candidateThread = parseThreadIdentity(candidate.threading.threadSize, candidate.threading.tapTolerance, candidate.threading.threadForm);\n        var requestedSize = derived.parsed.size;\n        var requestedForm = normalizeThreadForm(derived.parsed.standard);\n        var candidateSize = candidateThread.size;\n        var candidateForm = normalizeThreadForm(candidate.threading.threadForm || candidateThread.standard);\n        var rowCoolantMode = recipeRow && recipeRow.constraints ? recipeRow.constraints.coolantMode : null;\n        var rowProcessId = recipeRow && recipeRow.constraints && recipeRow.constraints.processIds && recipeRow.constraints.processIds[0]\n          ? recipeRow.constraints.processIds[0]\n          : null;\n        var rowProcessHandle = recipeRow && recipeRow.trace ? recipeRow.trace.sourceProcessHandleRaw : null;\n        var lengthMetrics = computeLengthMetrics(candidate, derived.threadLengthMm);\n        var predrillMetrics = computePredrillMetrics(candidate, derived);\n        var bottomClearanceMetrics = computeBottomClearanceMetrics(candidate, derived);\n        var geometrySuitability = computeGeometrySuitability(candidate, derived, bottomClearanceMetrics);\n        var toleranceFit = computeToleranceMatch(candidate, derived.threadTolerance);\n        var programFit = computeProgramFit(candidate, derived.materialGroup);\n        var coolantFit = computeCoolantFit(candidate, derived, rowCoolantMode);\n        var loadProfile = computeLoadProfile(derived, candidate, predrillMetrics, geometrySuitability, bottomClearanceMetrics);\n        var holderBoost = toNullableString(derived.holderType) === \"synchro_chuck\" ? 1 : derived.machineMode.score;\n        var machineFit = clamp01((derived.machineMode.score + holderBoost) / 2);\n        var recipe = recipeResult.recipe;\n        var hardRejectReason = null;\n        var threadIdentityFit;\n        var priorityBias;\n        var riskPenalty;\n        var parts;\n        var total;\n        var confidence;\n        var rpmWindow;\n        var feedWindow;\n        var metrics;\n    \n        if (requestedSize && candidateSize && requestedSize !== candidateSize) {\n          hardRejectReason = \"Candidate thread size does not match the requested thread designation.\";\n        }\n        if (!hardRejectReason && requestedForm && candidateForm && requestedForm !== candidateForm) {\n          hardRejectReason = \"Candidate thread form does not match the requested thread standard.\";\n        }\n        if (!hardRejectReason && derived.machineMode.score <= 0) {\n          hardRejectReason = \"Blind-hole tapping requires rigid tapping or a synchro chuck.\";\n        }\n        if (!hardRejectReason && derived.coreHoleRoute === \"missing\") {\n          hardRejectReason = \"A prepared core hole is required before blind-hole tapping.\";\n        }\n        if (!hardRejectReason && derived.threadLengthMm != null) {\n          if (lengthMetrics.apmxMarginMm != null && lengthMetrics.apmxMarginMm < 0) {\n            hardRejectReason = \"APMX is below the required full thread length.\";\n          } else if (lengthMetrics.usableMarginMm != null && lengthMetrics.usableMarginMm < 0) {\n            hardRejectReason = \"Usable thread length is below the required full thread length.\";\n          }\n        }\n        if (!hardRejectReason && derived.actualBottomClearanceMm != null && bottomClearanceMetrics.marginMm != null && bottomClearanceMetrics.marginMm < 0) {\n          hardRejectReason = \"Available bottom reserve is below the tap chamfer length for this blind-hole setup.\";\n        }\n        if (!hardRejectReason && derived.materialCode && candidate.classification.materialSubgroupCodes.length > 0 && kernel.materialFit(candidate, ctx) <= 0) {\n          hardRejectReason = \"Candidate material subgroup fit does not cover the selected ISO subgroup.\";\n        }\n    \n        threadIdentityFit = requestedSize && candidateSize && requestedSize === candidateSize ? 2.6 : 0.4;\n        if (!requestedSize || !candidateSize) threadIdentityFit = 1.1;\n    \n        priorityBias = computePriorityBias(derived.priority, {\n          geometrySuitability: geometrySuitability,\n          machineFit: machineFit,\n          lengthFit: lengthMetrics.fitScore,\n          bottomFit: bottomClearanceMetrics.fitScore,\n          toleranceFit: toleranceFit,\n          predrillFit: predrillMetrics.fitScore,\n          coolantFit: coolantFit,\n          loadRiskWeight: loadProfile.loadRiskWeight,\n          recipeSource: recipeResult.source,\n        });\n    \n        riskPenalty = clamp01(\n          (kernel.risk(candidate, ctx) || 0) +\n          derived.bottomClearance.weight * 0.45 +\n          loadProfile.loadRiskWeight * 0.35 +\n          (derived.machineMode.stable ? 0 : 0.2) +\n          (predrillMetrics.fitScore < 0.3 ? 0.12 : 0) +\n          (bottomClearanceMetrics.fitScore < 0.3 ? 0.18 : 0) +\n          (derived.materialGroup === \"H\" ? 0.25 : 0)\n        );\n    \n        if (recipeResult.source !== \"none\" && derived.pitchMm != null) {\n          recipe = createRecipe({\n            vc: recipeResult.recipe && recipeResult.recipe.vc,\n            fn: { min: derived.pitchMm, typ: derived.pitchMm, max: derived.pitchMm },\n          });\n        }\n    \n        rpmWindow = computeRpmWindow(recipe, derived.nominalDiameterMm);\n        feedWindow = computeFeedWindow(rpmWindow, derived.pitchMm);\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.25,\n          process: kernel.processFit(candidate, ctx),\n          threadIdentity: threadIdentityFit,\n          toleranceFit: toleranceFit * 0.95,\n          geometryFit: geometrySuitability * 1.35,\n          lengthWindow: lengthMetrics.fitScore * 1.1,\n          bottomFit: bottomClearanceMetrics.fitScore * 1.2,\n          predrillFit: predrillMetrics.fitScore * 1.15,\n          coolantFit: coolantFit * 0.95,\n          machineFit: machineFit * 1.05,\n          programFit: programFit * 0.7,\n          rowMatch: recipeRow || rows.length > 0 ? 0.45 : 0.15,\n          priorityBias: priorityBias * 0.35,\n          riskPenalty: -riskPenalty,\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.95 : recipeResult.source === \"near\" ? 0.86 : 0.72;\n        if (predrillMetrics.recommendedMm == null) confidence -= 0.08;\n        if (lengthMetrics.apmxMm == null && lengthMetrics.usableLengthMm == null) confidence -= 0.08;\n        if (derived.materialGroup === \"H\") confidence -= 0.1;\n        if (hardRejectReason) confidence = 0;\n        confidence = clamp01(confidence);\n    \n        metrics = Object.assign({}, threadingTools.getSharedMetrics(candidate, ctx), {\n          requestedThreadIdentity: derived.parsed.canonicalLabel,\n          requestedThreadSize: requestedSize,\n          requestedThreadForm: requestedForm,\n          requestedPitchMm: derived.pitchMm,\n          materialGroup: derived.materialGroup,\n          threadLengthMm: derived.threadLengthMm,\n          threadDepthRatio: derived.threadDepthRatio != null ? roundValue(derived.threadDepthRatio, 2) : null,\n          predrillValidationRoute: derived.coreHoleRoute,\n          requestedTolerance: derived.threadTolerance,\n          nominalThreadDiameterMm: derived.nominalDiameterMm,\n          requiredFullThreadLengthMm: derived.threadLengthMm,\n          requiredDepthRatio: derived.threadDepthRatio != null ? roundValue(derived.threadDepthRatio, 2) : null,\n          recommendedChamferClass: derived.recommendedChamferClass,\n          bottomClearanceClass: derived.bottomClearance.code,\n          bottomClearanceLabel: derived.bottomClearance.label,\n          machineMode: derived.machineMode.label,\n          coolantMode: derived.coolant.label,\n          qualitySensitivity: derived.qualitySensitivity,\n          problemHistory: derived.problemHistory,\n          holderType: derived.holderType,\n          candidateThreadForm: candidateForm,\n          candidateThreadSize: candidateSize,\n          candidateTolerance: normalizeTolerance(candidate.threading.tapTolerance),\n          tapChamferForm: normalizeTolerance(candidate.threading.tapChamferForm),\n          tapHelixDeg: toNullableNumber(candidate.threading.tapHelixDeg),\n          tapChamferLengthP: bottomClearanceMetrics.chamferLengthP,\n          tapChamferLengthMm: bottomClearanceMetrics.chamferLengthMm,\n          actualBottomClearanceMm: bottomClearanceMetrics.actualMm,\n          bottomClearanceMarginMm: bottomClearanceMetrics.marginMm,\n          bottomRiskClass: bottomClearanceMetrics.riskClass,\n          bottomFit: bottomClearanceMetrics.fitScore,\n          predrillRecommendedMm: predrillMetrics.recommendedMm,\n          predrillActualMm: predrillMetrics.actualMm,\n          predrillDeltaMm: predrillMetrics.deltaMm != null ? roundValue(predrillMetrics.deltaMm, 3) : null,\n          apmxMm: lengthMetrics.apmxMm,\n          usableLengthMm: lengthMetrics.usableLengthMm,\n          apmxMarginMm: lengthMetrics.apmxMarginMm != null ? roundValue(lengthMetrics.apmxMarginMm, 2) : null,\n          usableLengthMarginMm: lengthMetrics.usableMarginMm != null ? roundValue(lengthMetrics.usableMarginMm, 2) : null,\n          geometrySuitability: geometrySuitability,\n          coolantFit: coolantFit,\n          machineFit: machineFit,\n          lengthFit: lengthMetrics.fitScore,\n          predrillFit: predrillMetrics.fitScore,\n          toleranceFit: toleranceFit,\n          programFit: programFit,\n          kienzleKc: loadProfile.kienzleKc,\n          loadIndex: loadProfile.loadIndex,\n          loadClass: loadProfile.loadClass,\n          recipeSource: recipeResult.source,\n          recipeRowId: recipeRow && recipeRow.rowId || null,\n          recipeOperationId: rowProcessId,\n          recipeOperationHandle: rowProcessHandle,\n          rowCoolantMode: rowCoolantMode,\n          recipeVcMin: recipe && recipe.vc ? recipe.vc.min : null,\n          recipeVcTyp: recipe && recipe.vc ? recipe.vc.typ : null,\n          recipeVcMax: recipe && recipe.vc ? recipe.vc.max : null,\n          rpmMin: rpmWindow.min,\n          rpmTyp: rpmWindow.typ,\n          rpmMax: rpmWindow.max,\n          feedMinMmMin: feedWindow.min,\n          feedTypMmMin: feedWindow.typ,\n          feedMaxMmMin: feedWindow.max,\n          alternativeProcessFlag:\n            derived.materialGroup === \"H\" ||\n            (derived.materialGroup === \"S\" && loadProfile.loadClass === \"high\") ||\n            derived.bottomClearance.code === \"high\" ||\n            bottomClearanceMetrics.riskClass === \"critical\" ||\n            (derived.machineMode.stable === false && derived.materialGroup !== \"P\"),\n          series: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.series),\n          substrate: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.substrate),\n          coating: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.coating),\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: buildReasons(metrics, parts),\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/tapping-through/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/tapping-through/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/tapping-through/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/tapping-through/presenter.js\");\n    exports.default = createStubProcessModule(\"tapping_through\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/tapping-through/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, threadIdentity, toleranceNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { getTroubleshootingEntries } = __bundle.require(\"core/troubleshooting-library.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function formatMaybeNumber(value, unit, digits) {\n      if (value == null || !Number.isFinite(value)) return \"n/a\";\n      return String(Math.round(value * Math.pow(10, digits == null ? 2 : digits)) / Math.pow(10, digits == null ? 2 : digits)) + (unit ? \" \" + unit : \"\");\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var precision = digits == null ? 2 : digits;\n      var rounded;\n      var fixed;\n      if (value == null || !Number.isFinite(value)) return null;\n      rounded = Math.round(value * Math.pow(10, precision)) / Math.pow(10, precision);\n      fixed = rounded.toFixed(precision);\n      return precision > 0 ? fixed.replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\") : fixed;\n    }\n    \n    function formatPriceLabel(priceCents) {\n      if (priceCents == null || !Number.isFinite(priceCents)) return \"Price on request\";\n      return \"EUR \" + (priceCents / 100).toFixed(2);\n    }\n    \n    function humanizeToken(value) {\n      return value == null ? \"\" : String(value).replace(/_/g, \" \");\n    }\n    \n    function titleCase(value) {\n      var text = humanizeToken(value);\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function getThreadLengthMm(metrics) {\n      return metrics && metrics.threadLengthMm != null\n        ? metrics.threadLengthMm\n        : metrics && metrics.requiredFullThreadLengthMm != null\n          ? metrics.requiredFullThreadLengthMm\n          : null;\n    }\n    \n    function getDepthRatio(metrics) {\n      return metrics && metrics.threadDepthRatio != null\n        ? metrics.threadDepthRatio\n        : metrics && metrics.requiredDepthRatio != null\n          ? metrics.requiredDepthRatio\n          : null;\n    }\n    \n    function getMaterialGroup(metrics, ctx) {\n      if (metrics && metrics.materialGroup) return String(metrics.materialGroup).toUpperCase();\n      if (ctx && ctx.material && ctx.material.subgroupCode) return String(ctx.material.subgroupCode).toUpperCase().charAt(0);\n      return null;\n    }\n    \n    function getMaterialProfile(ctx) {\n      return ctx && ctx.material ? ctx.material.profile || null : null;\n    }\n    \n    function getMaterialDisplayName(ctx) {\n      var material = ctx && ctx.material ? ctx.material : {};\n      var code = material && material.subgroupCode ? String(material.subgroupCode) : \"\";\n      var label = material && material.subgroupLabel ? String(material.subgroupLabel) : \"\";\n      if (code && label && label !== code) return code + \" - \" + label;\n      return code || label || \"selected material\";\n    }\n    \n    function ensureSentence(value) {\n      var text = String(value || \"\").trim();\n      if (!text) return null;\n      return /[.!?]$/.test(text) ? text : text + \".\";\n    }\n    \n    function hasHighTendency(value) {\n      return String(value || \"\").toLowerCase().indexOf(\"high\") >= 0;\n    }\n    \n    function formatProfileCoolant(profile) {\n      var parts = [];\n      if (!profile) return null;\n      if (profile.preferredCoolant) parts.push(String(profile.preferredCoolant).toLowerCase());\n      if (profile.coolantPressureBar) parts.push(String(profile.coolantPressureBar) + \" bar\");\n      return parts.join(\" / \");\n    }\n    \n    function formatProfileFact(value) {\n      return value ? humanizeToken(value).toLowerCase() : null;\n    }\n    \n    function cleanShortText(value) {\n      return String(value == null ? \"\" : value).trim().replace(/[.;:]+$/, \"\");\n    }\n    \n    function formatTroubleshootingFocusLabel(value) {\n      switch (String(value || \"\").toLowerCase()) {\n        case \"workholding\":\n          return \"Clamping and holder\";\n        case \"machine power\":\n          return \"Machine load\";\n        case \"pre-processing\":\n          return \"Hole preparation\";\n        default:\n          return titleCase(value);\n      }\n    }\n    \n    function getTroubleshootingTone(entry) {\n      switch (String(entry && entry.problemCategory || \"\").toLowerCase()) {\n        case \"process stability\":\n          return \"process\";\n        case \"workpiece quality\":\n          return \"quality\";\n        case \"tool life\":\n          return \"tool\";\n        default:\n          return \"default\";\n      }\n    }\n    \n    function appendUniqueHandle(handles, handle) {\n      if (!handle || handles.indexOf(handle) >= 0) return;\n      handles.push(handle);\n    }\n    \n    function buildTroubleshootingHandles(ctx, top, materialProfile) {\n      var metrics = top.metrics || {};\n      var handles = [];\n      var problemHistory = String(metrics.problemHistory || \"\").toLowerCase();\n      var exitCondition = String(getAnswer(ctx, \"exit_condition\") || \"\").toLowerCase();\n      var weakLubrication = metrics.coolantMode === \"Dry\" || metrics.coolantMode === \"Unknown coolant mode\";\n    \n      switch (problemHistory) {\n        case \"tap_breakage\":\n          appendUniqueHandle(handles, \"tap-breaks-in-hole\");\n          break;\n        case \"built_up_edge\":\n          appendUniqueHandle(handles, \"thread-flanks-with-built-up-edge-or-smearing\");\n          break;\n        case \"burrs\":\n          appendUniqueHandle(handles, exitCondition === \"cross_hole\" ? \"burrs-or-breakout-at-cross-hole-intersection\" : \"burrs-at-entry-and-or-exit\");\n          break;\n        case \"gauge_failure\":\n          appendUniqueHandle(handles, \"thread-out-of-tolerance-core-hole-too-small-large\");\n          appendUniqueHandle(handles, \"thread-flanks-uneven-profile-incorrect\");\n          break;\n        case \"high_torque\":\n          appendUniqueHandle(handles, \"tap-breaks-in-hole\");\n          appendUniqueHandle(handles, \"spindle-at-power-limit-or-stalls\");\n          break;\n        default:\n          break;\n      }\n    \n      if (metrics.exitRiskClass === \"high\") {\n        appendUniqueHandle(handles, exitCondition === \"cross_hole\" ? \"burrs-or-breakout-at-cross-hole-intersection\" : \"burrs-at-entry-and-or-exit\");\n      }\n      if (metrics.predrillDeltaMm != null && Math.abs(metrics.predrillDeltaMm) > 0.08) {\n        appendUniqueHandle(handles, \"thread-out-of-tolerance-core-hole-too-small-large\");\n      }\n      if (metrics.loadClass === \"high\") {\n        appendUniqueHandle(handles, \"tap-breaks-in-hole\");\n      }\n      if (weakLubrication && materialProfile && hasHighTendency(materialProfile.buildUpEdgeTendency)) {\n        appendUniqueHandle(handles, \"thread-flanks-with-built-up-edge-or-smearing\");\n      }\n    \n      return handles;\n    }\n    \n    function buildTroubleshootingCards(ctx, top) {\n      var materialProfile = getMaterialProfile(ctx);\n      return getTroubleshootingEntries(buildTroubleshootingHandles(ctx, top, materialProfile)).slice(0, 2).map(function mapEntry(entry) {\n        var focusFlags = [];\n        if (entry.rootWorkholding) focusFlags.push(\"workholding\");\n        if (entry.rootMachinePower) focusFlags.push(\"machine power\");\n        if (entry.rootPreprocessing) focusFlags.push(\"pre-processing\");\n    \n        return {\n          title: entry.problem,\n          tone: getTroubleshootingTone(entry),\n          eyebrow: \"Focused response\",\n          category: entry.problemCategory || \"Troubleshooting\",\n          wear: entry.dominantToolWear || null,\n          checkFirst: focusFlags.map(formatTroubleshootingFocusLabel),\n          cause: ensureSentence(entry.cause),\n          actions: (entry.actions || []).slice(0, 4).map(cleanShortText).filter(Boolean),\n          note: entry.alternativeProcess ? ensureSentence(entry.alternativeProcess) : null,\n          items: dedupeTextItems([\n            entry.problemCategory ? \"Category: \" + entry.problemCategory + \".\" : null,\n            entry.dominantToolWear ? \"Dominant wear: \" + entry.dominantToolWear + \".\" : null,\n            focusFlags.length ? \"Primary check: \" + focusFlags.join(\", \") + \".\" : null,\n            entry.cause ? \"Likely cause: \" + ensureSentence(entry.cause) : null,\n            entry.actions && entry.actions.length ? \"Actions: \" + entry.actions.slice(0, 4).join(\"; \") + \".\" : null,\n            entry.alternativeProcess ? \"Alternative process: \" + ensureSentence(entry.alternativeProcess) : null,\n          ]).slice(0, 5),\n        };\n      });\n    }\n    \n    function getPredrillRouteLabel(value) {\n      switch (String(value || \"\")) {\n        case \"actual_known\":\n          return \"Actual core hole confirmed\";\n        case \"fixed_unknown\":\n          return \"Prepared hole needs confirmation\";\n        case \"recommend\":\n          return \"Recommendation route active\";\n        case \"missing\":\n          return \"Core hole not prepared\";\n        default:\n          return \"Core-hole route open\";\n      }\n    }\n    \n    function getRecipeOperationLabel(metrics) {\n      var raw = metrics && (metrics.recipeOperationId || metrics.recipeOperationHandle);\n      var normalized = String(raw || \"\").toLowerCase();\n      if (!raw) return \"Tapping through\";\n      if (normalized === \"tap\" || normalized === \"tapping\") return \"Tapping\";\n      return titleCase(raw);\n    }\n    \n    function getRecipeCoolantLabel(value) {\n      switch (String(value || \"\")) {\n        case \"through\":\n          return \"Through\";\n        case \"external\":\n          return \"External\";\n        case \"mist\":\n          return \"MQL / mist\";\n        case \"dry\":\n          return \"Dry\";\n        case \"unknown\":\n          return \"Unspecified\";\n        default:\n          return \"Unspecified\";\n      }\n    }\n    \n    function getValueOrNa(value, digits) {\n      var formatted = formatDisplayNumber(value, digits);\n      return formatted != null ? formatted : \"n/a\";\n    }\n    \n    function buildVcBandLabel(metrics) {\n      var parts = [\n        formatDisplayNumber(metrics && metrics.recipeVcMin, 1),\n        formatDisplayNumber(metrics && metrics.recipeVcTyp, 1),\n        formatDisplayNumber(metrics && metrics.recipeVcMax, 1),\n      ].filter(function keep(value) {\n        return value != null;\n      });\n      return parts.length ? parts.join(\" / \") + \" m/min\" : \"n/a\";\n    }\n    \n    function getMaterialWhyLine(materialGroup, metrics, materialProfile) {\n      if (materialProfile) {\n        switch (materialGroup) {\n          case \"M\":\n            return materialProfile.code + \" is \" + formatProfileFact(materialProfile.chipForm) + \"-chipping with \" + formatProfileFact(materialProfile.workHardening) + \" work hardening, so the tap needs a lubrication-aware and conservative release window.\";\n          case \"K\":\n            return materialProfile.code + \" is \" + formatProfileFact(materialProfile.chipForm) + \"-chipping and \" + formatProfileFact(materialProfile.abrasiveness) + \" abrasive, so chip-flow logic must follow the material instead of a universal through-hole rule.\";\n          case \"N\":\n            return materialProfile.code + \" combines \" + formatProfileFact(materialProfile.chipForm) + \" chips with \" + formatProfileFact(materialProfile.buildUpEdgeTendency) + \" built-up-edge tendency, so burr and adhesion control matter from the first hole.\";\n          case \"S\":\n            return materialProfile.code + \" runs with \" + formatProfileFact(materialProfile.abrasiveness) + \" abrasiveness and low machinability, so the recommendation favors process robustness over raw output.\";\n          case \"H\":\n            return materialProfile.code + \" is very abrasive and near a practical thread-cutting boundary, so the recommendation stays deliberately conservative.\";\n          case \"P\":\n          default:\n            return metrics && metrics.geometrySuitability >= 0.8\n              ? materialProfile.code + \" is a manageable steel case and the selected geometry still supports forward chip flow cleanly.\"\n              : materialProfile.code + \" remains workable, but the current steel setup still needs a conservative release window.\";\n        }\n      }\n      switch (materialGroup) {\n        case \"M\":\n          return \"M-group stainless needs lubrication-aware geometry and a conservative tapping window against adhesion and work hardening.\";\n        case \"K\":\n          return \"K-group cast materials are short-chipping, so the recommendation follows material-led chip-flow logic rather than a generic through-hole rule.\";\n        case \"N\":\n          return \"N-group non-ferrous materials need burr- and built-up-edge-aware threading logic instead of a universal long-chamfer assumption.\";\n        case \"S\":\n          return \"S-group heat-resistant materials run in a narrow load window, so the recommendation favors process robustness over output.\";\n        case \"H\":\n          return \"H-group sits near the practical limit for thread cutting, so the recommendation stays deliberately conservative.\";\n        case \"P\":\n        default:\n          return metrics && metrics.geometrySuitability >= 0.8\n            ? \"P-group steel is a standard through-tapping case and the selected geometry supports forward chip flow cleanly.\"\n            : \"P-group steel remains a workable through-tapping case, but the selected setup still needs a conservative release window.\";\n      }\n    }\n    \n    function getMaterialHowLine(materialGroup, metrics, materialProfile) {\n      var preferredCoolant = formatProfileCoolant(materialProfile);\n      if (materialProfile) {\n        switch (materialGroup) {\n          case \"M\":\n            return \"Keep \" + String(preferredCoolant || \"lubrication\") + \" stable and avoid dwell or re-entry at the DOC line.\";\n          case \"K\":\n            return \"Stay consistent with \" + String(preferredCoolant || \"dry running\") + \" and avoid coolant shock or overly sharp edges in cast material.\";\n          case \"N\":\n            return \"Keep \" + String(preferredCoolant || \"lubrication\") + \" clean, leave chip space open and do not run too cold if burrs or adhesion rise.\";\n          case \"S\":\n            return \"Use \" + String(preferredCoolant || \"stable emulsion support\") + \" with a short-overhang setup and qualify the first holes before opening the band.\";\n          case \"H\":\n            return \"Keep the setup very rigid with minimal overhang and avoid coolant shock from the first qualification hole.\";\n          case \"P\":\n          default:\n            return metrics && metrics.materialCondition === \"heat_treated\"\n              ? \"Because the material state is stronger than general stock, qualify the first holes before raising speed.\"\n              : \"Use \" + String(preferredCoolant || \"stable emulsion support\") + \" and only raise output after torque, sound and chip flow stay stable.\";\n        }\n      }\n      switch (materialGroup) {\n        case \"M\":\n          return \"Keep lubrication stable and avoid any dwell at breakthrough so the tap does not rub and work-harden the flanks.\";\n        case \"K\":\n          return \"Keep entry and exit clean and do not force a long-chamfer behavior that the short-chipping material does not need.\";\n        case \"N\":\n          return \"Watch exit burrs early and keep lubrication clean before increasing output in non-ferrous material.\";\n        case \"S\":\n          return \"Qualify the first holes conservatively and only open the band once spindle load and chip release stay stable.\";\n        case \"H\":\n          return \"Treat the first hole as a strict qualification hole and keep the release plan conservative from the start.\";\n        case \"P\":\n        default:\n          return metrics && metrics.materialCondition === \"heat_treated\"\n            ? \"Because the material state is stronger than general stock, qualify the first holes before raising speed.\"\n            : \"Start with the suggested band and only raise output after torque, sound and chip flow stay stable.\";\n      }\n    }\n    \n    function getMaterialWatchLine(materialGroup, metrics, materialProfile) {\n      if (materialProfile) {\n        switch (materialGroup) {\n          case \"M\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"adhesion and notch wear\").toLowerCase() + \"; if lubrication or synchronization drift, work-hardening rises quickly.\";\n          case \"K\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"abrasive wear\").toLowerCase() + \"; coolant shock can damage the edge quickly.\";\n          case \"N\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"burrs and adhesion\").toLowerCase() + \"; do not force a universal long-chamfer rule.\";\n          case \"S\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"crater wear and edge damage\").toLowerCase() + \"; if load or exit quality stay marginal, thread milling is the safer fallback.\";\n          case \"H\":\n            return \"Typical failure in \" + materialProfile.code + \" is \" + String(materialProfile.typicalFailure || \"chipping\").toLowerCase() + \"; treat thread milling as the preferred fallback if process security dominates.\";\n          case \"P\":\n          default:\n            return metrics && metrics.loadClass === \"high\"\n              ? \"Typical steel failure mode here is \" + String(materialProfile.typicalFailure || \"flank wear\").toLowerCase() + \", so watch torque and breakthrough quality closely on the first holes.\"\n              : \"Typical steel failure mode here is \" + String(materialProfile.typicalFailure || \"flank wear\").toLowerCase() + \"; breakthrough quality and chip release still decide whether the case stays stable.\";\n        }\n      }\n      switch (materialGroup) {\n        case \"M\":\n          return \"Watch for built-up edge, flank rubbing and work-hardening if lubrication or synchronization drift.\";\n        case \"K\":\n          return \"Do not assume a universal B-chamfer rule in cast iron; chip behavior stays material-led even in through holes.\";\n        case \"N\":\n          return \"A universal long-chamfer rule is risky in aluminium and other non-ferrous materials because burr and smearing can rise quickly.\";\n        case \"S\":\n          return \"If load, stability or exit quality stay marginal, thread milling is the safer fallback for this setup.\";\n        case \"H\":\n          return \"Treat thread milling as the preferred fallback if process security dominates, because the material is near a thread-cutting boundary.\";\n        case \"P\":\n        default:\n          return metrics && metrics.loadClass === \"high\"\n            ? \"Higher-load steel still needs close attention to torque and breakthrough quality on the first holes.\"\n            : \"Even in steel, breakthrough quality and chip release decide whether the nominal through-hole case stays stable.\";\n      }\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = item == null ? \"\" : String(item).trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item.score.eligible;\n      }).map(function mapAlternative(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative threading option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRecipeValues(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n        { key: \"feed_per_rev\", label: \"Feed per rev\", min: top.recipe && top.recipe.fn.min, typ: top.recipe && top.recipe.fn.typ, max: top.recipe && top.recipe.fn.max, unit: \"mm/rev\" },\n        { key: \"rpm\", label: \"RPM\", min: metrics.rpmMin, typ: metrics.rpmTyp, max: metrics.rpmMax, unit: \"rpm\" },\n        { key: \"feed_speed\", label: \"Feed speed\", min: metrics.feedMinMmMin, typ: metrics.feedTypMmMin, max: metrics.feedMaxMmMin, unit: \"mm/min\" },\n      ].filter(function keep(item) {\n        return item.min != null || item.typ != null || item.max != null;\n      });\n    }\n    \n    function buildRiskItems(ctx, top) {\n      var metrics = top.metrics || {};\n      var items = [];\n    \n      if (metrics.exitRiskClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Exit condition\",\n          message: \"The selected exit condition behaves like a technical edge case although the process is nominally through-hole.\",\n        });\n      }\n      if (metrics.loadClass === \"high\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Tapping load\",\n          message: \"The derived load window is high for this material and geometry. Keep chip flow and synchronization conservative.\",\n        });\n      }\n      if (metrics.predrillActualMm == null && getAnswer(ctx, \"core_hole_status\") === \"fixed_unknown\") {\n        items.push({\n          severity: \"info\",\n          title: \"Pre-drill status\",\n          message: \"The core hole exists, but the actual drill diameter is unknown. The recommendation assumes the candidate pre-drill diameter.\",\n        });\n      }\n      if (metrics.predrillDeltaMm != null && Math.abs(metrics.predrillDeltaMm) > 0.08) {\n        items.push({\n          severity: \"warning\",\n          title: \"Pre-drill delta\",\n          message: \"Actual pre-drill differs from the candidate recommendation by \" + formatMaybeNumber(metrics.predrillDeltaMm, \"mm\", 3) + \". Expect load or gauge risk.\",\n        });\n      }\n      if (metrics.coolantMode === \"Dry\" || metrics.coolantMode === \"Unknown coolant mode\") {\n        items.push({\n          severity: \"warning\",\n          title: \"Lubrication\",\n          message: \"Coolant or lubrication support is weak for a tapping process and narrows the safe window.\",\n        });\n      }\n      if (metrics.problemHistory && metrics.problemHistory !== \"none\") {\n        items.push({\n          severity: \"info\",\n          title: \"Known issue\",\n          message: \"Previous issue flagged: \" + String(metrics.problemHistory).replace(/_/g, \" \") + \". Review the guidance before release.\",\n        });\n      }\n      if (metrics.alternativeProcessFlag) {\n        items.push({\n          severity: \"info\",\n          title: \"Alternative process\",\n          message: \"For this setup, thread milling may be the more robust fallback if process security remains critical.\",\n        });\n      }\n      return items;\n    }\n    \n    function buildMachineChecks(ctx, top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"sync_mode\",\n          label: \"Tapping mode\",\n          result: getAnswer(ctx, \"sync_tapping_capability\") === \"rigid\" || getAnswer(ctx, \"sync_tapping_capability\") === \"synchro_chuck\" ? \"pass\" : \"limited\",\n          note: metrics.machineMode || \"n/a\",\n        },\n        {\n          key: \"holder\",\n          label: \"Holder\",\n          result: getAnswer(ctx, \"holder_type\") === \"synchro_chuck\" ? \"pass\" : getAnswer(ctx, \"holder_type\") ? \"limited\" : \"unknown\",\n          note: getAnswer(ctx, \"holder_type\") ? String(getAnswer(ctx, \"holder_type\")).replace(/_/g, \" \") : \"Not specified\",\n        },\n        {\n          key: \"coolant\",\n          label: \"Coolant / lubrication\",\n          result: (metrics.coolantFit || 0) >= 0.8 ? \"pass\" : (metrics.coolantFit || 0) >= 0.5 ? \"limited\" : \"fail\",\n          note: metrics.coolantMode || \"n/a\",\n        },\n      ];\n    }\n    \n    function buildRecipeSourceUi(top) {\n      switch (top && top.score && top.score.recipeConfidence) {\n        case \"exact\":\n          return {\n            tone: \"exact\",\n            chip: \"Exact cutting data\",\n            title: \"Cutting-data basis\",\n            value: \"Exact recipe row match\",\n            note: \"Start values come from a threading row that matches the current process, material and setup keys.\",\n          };\n        case \"near\":\n          return {\n            tone: \"near\",\n            chip: \"Nearest valid cutting data\",\n            title: \"Cutting-data basis\",\n            value: \"Nearest recipe row used\",\n            note: \"Start values use the closest valid threading row because one setup key does not match exactly.\",\n          };\n        case \"estimated\":\n          return {\n            tone: \"default\",\n            chip: \"Conservative thread estimate\",\n            title: \"Thread-data basis\",\n            value: \"Estimated from conservative defaults\",\n            note: \"No exact threading row matched all keys, so the start values stay conservative.\",\n          };\n        default:\n          return {\n            tone: \"default\",\n            chip: \"Awaiting valid cutting data\",\n            title: \"Thread-data basis\",\n            value: \"No valid threading row yet\",\n            note: \"Complete one more setup detail to tighten the starting window.\",\n          };\n      }\n    }\n    \n    function buildMachineUi(machineChecks) {\n      var fail = (machineChecks || []).some(function hasFail(item) { return item.result === \"fail\"; });\n      var limited = (machineChecks || []).some(function hasLimited(item) { return item.result === \"limited\"; });\n      var notes = [];\n    \n      (machineChecks || []).forEach(function eachCheck(item) {\n        if (!item || !item.note) return;\n        if (item.result === \"pass\") {\n          notes.push(item.label + \": \" + item.note + \".\");\n        } else if (item.result === \"limited\") {\n          notes.push(item.label + \" still narrows the release window.\");\n        }\n      });\n    \n      if (fail) {\n        return {\n          tone: \"tight\",\n          value: \"Tight\",\n          note: \"Machine-side limits narrow the safe tapping window.\",\n          items: dedupeTextItems(notes).slice(0, 2),\n        };\n      }\n      if (limited) {\n        return {\n          tone: \"limited\",\n          value: \"Limited\",\n          note: \"One or more machine-side inputs still narrow the recommended band.\",\n          items: dedupeTextItems(notes).slice(0, 2),\n        };\n      }\n      return {\n        tone: \"good\",\n        value: \"Checked\",\n        note: \"No major machine limits were used in the recommendation.\",\n        items: dedupeTextItems(notes).slice(0, 2),\n      };\n    }\n    \n    function buildRiskUi(top, riskItems) {\n      var metrics = top.metrics || {};\n      var warnings = (riskItems || []).filter(function keep(item) { return item.severity === \"warning\"; }).length;\n    \n      if (metrics.exitRiskClass === \"high\" || metrics.loadClass === \"high\" || warnings >= 2) {\n        return {\n          tone: \"high\",\n          value: \"High\",\n          note: \"Run conservatively and watch exit quality, chip flow and torque on the first holes.\",\n        };\n      }\n      if ((riskItems || []).length > 0 || (metrics.coolantFit || 0) < 0.75 || (metrics.machineFit || 0) < 0.75 || (metrics.predrillFit || 0) < 0.75) {\n        return {\n          tone: \"medium\",\n          value: \"Medium\",\n          note: \"A few setup factors still need attention, but the recommendation remains workable.\",\n        };\n      }\n      return {\n        tone: \"low\",\n        value: \"Low\",\n        note: \"No major qualification risks detected from the current inputs.\",\n      };\n    }\n    \n    function buildConfidenceUi(top, recipeUi, machineUi, riskUi) {\n      var confidence = top && top.score ? top.score.confidence : 0;\n      if (recipeUi.tone === \"exact\" && confidence >= 0.82 && machineUi.tone === \"good\" && riskUi.tone === \"low\") {\n        return { tone: \"high\", label: \"High\" };\n      }\n      if (confidence >= 0.76 && riskUi.tone !== \"high\" && machineUi.tone !== \"tight\") {\n        return { tone: \"medium\", label: \"Medium\" };\n      }\n      return { tone: \"low\", label: \"Low\" };\n    }\n    \n    function buildSummaryLine(ctx, top) {\n      var metrics = top.metrics || {};\n      var threadLengthMm = getThreadLengthMm(metrics);\n      var depthRatio = getDepthRatio(metrics);\n      var bits = [];\n      var materialLabel = getMaterialDisplayName(ctx);\n      if (metrics.requestedThreadSize) bits.push(metrics.requestedThreadSize);\n      if (threadLengthMm != null) bits.push(formatDisplayNumber(threadLengthMm, 1) + \" mm thread length\");\n      if (depthRatio != null) bits.push(formatDisplayNumber(depthRatio, 2) + \" xD\");\n      if (metrics.requestedTolerance || metrics.candidateTolerance) bits.push(\"class \" + String(metrics.requestedTolerance || metrics.candidateTolerance));\n      if (metrics.machineMode) bits.push(metrics.machineMode);\n      return \"Best fit for \" + (bits.length ? bits.join(\" - \") + \" - \" : \"\") + \"Tapping Through Hole in \" + materialLabel + \".\";\n    }\n    \n    function buildHeaderPills(confidenceUi, recipeUi, machineUi, riskUi) {\n      return [\n        { tone: \"fit\", text: \"Best fit\" },\n        { tone: \"conf-\" + confidenceUi.tone, text: \"Confidence: \" + confidenceUi.label },\n        { tone: \"source-\" + recipeUi.tone, text: recipeUi.chip },\n        { tone: \"machine-\" + machineUi.tone, text: \"Machine: \" + machineUi.value },\n        { tone: \"risk-\" + riskUi.tone, text: \"Risk: \" + riskUi.value },\n      ];\n    }\n    \n    function buildStartCardData(top, recipeUi) {\n      var metrics = top.metrics || {};\n      var threadLengthMm = getThreadLengthMm(metrics);\n      var depthRatio = getDepthRatio(metrics);\n      var threadTimeSec = threadLengthMm != null && metrics.feedTypMmMin ? (threadLengthMm / metrics.feedTypMmMin) * 60 : null;\n      var rowBackedValues = [\n        { key: \"operation\", label: \"Operation\", value: getRecipeOperationLabel(metrics), unit: null, tone: \"text\" },\n        { key: \"predrill\", label: \"Pre-drill\", value: getValueOrNa(metrics.predrillRecommendedMm, 2), unit: metrics.predrillRecommendedMm != null ? \"mm\" : null },\n        { key: \"coolant\", label: \"Coolant\", value: getRecipeCoolantLabel(metrics.rowCoolantMode), unit: null, tone: \"text\" },\n        { key: \"vc_min\", label: \"vc min\", value: getValueOrNa(top.recipe && top.recipe.vc && top.recipe.vc.min, 1), unit: top.recipe && top.recipe.vc && top.recipe.vc.min != null ? \"m/min\" : null },\n        { key: \"vc_typ\", label: \"vc typ\", value: getValueOrNa(top.recipe && top.recipe.vc && top.recipe.vc.typ, 1), unit: top.recipe && top.recipe.vc && top.recipe.vc.typ != null ? \"m/min\" : null },\n        { key: \"vc_max\", label: \"vc max\", value: getValueOrNa(top.recipe && top.recipe.vc && top.recipe.vc.max, 1), unit: top.recipe && top.recipe.vc && top.recipe.vc.max != null ? \"m/min\" : null },\n      ];\n      var machineValues = [\n        { key: \"n\", label: \"N\", value: getValueOrNa(metrics.rpmTyp, 0), unit: metrics.rpmTyp != null ? \"rpm\" : null },\n        { key: \"vf\", label: \"VF\", value: getValueOrNa(metrics.feedTypMmMin, 0), unit: metrics.feedTypMmMin != null ? \"mm/min\" : null },\n        { key: \"time\", label: \"T/HOLE\", value: getValueOrNa(threadTimeSec, 1), unit: threadTimeSec != null ? \"s\" : null },\n      ];\n    \n      return {\n        title: \"Start here\",\n        description: recipeUi.tone === \"exact\"\n          ? \"Use the matched threading row for operation, coolant and cutting-speed band. Spindle speed, feed and time are derived from pitch and nominal diameter.\"\n          : recipeUi.tone === \"near\"\n            ? \"Use the nearest valid threading row for operation, coolant and cutting-speed band. Qualify the first hole before release because one setup key is still approximate.\"\n            : \"Use the best available threading row conservatively. Qualify the first hole before raising output because the current band is still estimated.\",\n        rowBackedValues: rowBackedValues,\n        machineValues: machineValues,\n        primaryValues: rowBackedValues,\n        secondaryValues: machineValues,\n        depthRatio: depthRatio,\n      };\n    }\n    \n    function buildHolePreparationCard(top) {\n      var metrics = top.metrics || {};\n      var delta = metrics.predrillDeltaMm != null ? Math.abs(metrics.predrillDeltaMm) : null;\n      var route = metrics.predrillValidationRoute || null;\n      var tone = \"default\";\n      var badge = \"Review\";\n      var value = \"Core-hole confirmation still influences the final release window.\";\n      var note = getPredrillRouteLabel(route);\n    \n      if (metrics.predrillActualMm != null && delta != null) {\n        if (delta <= 0.03) {\n          tone = \"good\";\n          badge = \"Confirmed\";\n          value = \"Actual core hole aligns closely with the candidate recommendation.\";\n          note = \"Predrill delta stays inside a very stable release window.\";\n        } else if (delta <= 0.08) {\n          tone = \"limited\";\n          badge = \"Review\";\n          value = \"Actual core hole is close, but still worth qualifying on the first hole.\";\n          note = \"Predrill delta is workable, but it can still shift load and gauge behavior.\";\n        } else {\n          tone = \"high\";\n          badge = \"Risk\";\n          value = \"Actual core hole deviates noticeably from the candidate recommendation.\";\n          note = \"Expect a higher risk for load, flank quality or gauge deviation until the hole size is corrected.\";\n        }\n      } else if (route === \"recommend\") {\n        tone = \"limited\";\n        badge = \"Recommendation\";\n        value = \"The finder is still driving the core-hole recommendation for this tap.\";\n        note = \"Use the recommended drill diameter before releasing the process band.\";\n      } else if (route === \"fixed_unknown\") {\n        tone = \"limited\";\n        badge = \"Unknown actual\";\n        value = \"The core hole exists, but the actual drill size is still unconfirmed.\";\n        note = \"Confirm the actual drill diameter if you want a tighter threading release window.\";\n      }\n    \n      return {\n        title: \"Hole preparation\",\n        tone: tone,\n        badge: badge,\n        value: value,\n        note: note,\n        items: dedupeTextItems([\n          metrics.predrillRecommendedMm != null ? \"Recommended core hole: \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm.\" : null,\n          metrics.predrillActualMm != null ? \"Actual core hole: \" + formatDisplayNumber(metrics.predrillActualMm, 2) + \" mm.\" : \"Actual core hole not confirmed yet.\",\n          metrics.predrillDeltaMm != null ? \"Predrill delta: \" + formatDisplayNumber(metrics.predrillDeltaMm, 3) + \" mm.\" : null,\n          route ? getPredrillRouteLabel(route) + \".\" : null,\n        ]).slice(0, 3),\n      };\n    }\n    \n    function buildStoryData(ctx, top, recipeUi) {\n      var metrics = top.metrics || {};\n      var materialGroup = getMaterialGroup(metrics, ctx);\n      var materialProfile = getMaterialProfile(ctx);\n      var threadLengthMm = getThreadLengthMm(metrics);\n      var depthRatio = getDepthRatio(metrics);\n      var why = dedupeTextItems([\n        metrics.requestedThreadIdentity ? \"Thread identity matched to \" + metrics.requestedThreadIdentity + (metrics.candidateTolerance ? \" with \" + metrics.candidateTolerance + \" tap tolerance.\" : \".\") : null,\n        threadLengthMm != null ? \"Full thread length aligned to \" + formatDisplayNumber(threadLengthMm, 1) + \" mm with positive tool-length margin.\" : null,\n        depthRatio != null ? (depthRatio > 1.5 ? \"Requested engagement sits at \" + formatDisplayNumber(depthRatio, 2) + \" xD, so the recommendation prioritizes margin and process security.\" : \"Requested engagement sits at \" + formatDisplayNumber(depthRatio, 2) + \" xD, which stays inside a manageable through-tapping window.\") : null,\n        metrics.predrillRecommendedMm != null ? \"Core-hole guidance aligns to \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm for the selected setup.\" : null,\n        materialGroup ? getMaterialWhyLine(materialGroup, metrics, materialProfile) : null,\n      ].concat(top.score.reasons || [])).slice(0, 4);\n    \n      var how = dedupeTextItems([\n        \"Start with the suggested band and qualify the first hole before increasing output.\",\n        materialGroup ? getMaterialHowLine(materialGroup, metrics, materialProfile) : null,\n        materialProfile && materialProfile.avoid ? \"Avoid: \" + ensureSentence(materialProfile.avoid) : null,\n        metrics.coolantMode ? \"Keep \" + humanizeToken(metrics.coolantMode).toLowerCase() + \" stable so pitch and exit stay consistent.\" : null,\n        recipeUi.tone !== \"exact\" ? \"Treat the first hole as a qualification hole because the current start values are not from an exact row match.\" : null,\n        getAnswer(ctx, \"holder_type\") == null ? \"Prefer a synchro chuck or confirm holder alignment before full release.\" : null,\n      ]).slice(0, 4);\n    \n      var watch = dedupeTextItems([\n        \"Through-hole tapping is exit-sensitive: watch burrs, relief space and pitch quality at breakthrough.\",\n        materialGroup ? getMaterialWatchLine(materialGroup, metrics, materialProfile) : null,\n        metrics.loadClass === \"high\" ? \"The derived load window is high for this setup. Start conservatively and watch torque and sound on the first holes.\" : null,\n        metrics.predrillActualMm == null && getAnswer(ctx, \"core_hole_status\") !== \"actual_known\" ? \"Core-hole diameter is not yet confirmed. Verify the actual predrill before increasing output.\" : null,\n        metrics.problemHistory && metrics.problemHistory !== \"none\" ? \"Previous issue flagged: \" + humanizeToken(metrics.problemHistory) + \". Review the first holes against that failure mode.\" : null,\n        metrics.alternativeProcessFlag ? \"If process security remains critical, thread milling is the safer fallback for this setup.\" : null,\n        metrics.coolantMode === \"Dry\" || metrics.coolantMode === \"Unknown coolant mode\" ? \"Weak lubrication narrows the safe tapping window quickly. Do not raise speed until the first holes look stable.\" : null,\n      ]).slice(0, 4);\n    \n      return { why: why, how: how, watch: watch };\n    }\n    \n    function buildStoryPanels(ctx, top, recipeUi, machineUi, riskUi, storyData) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var depthRatio = getDepthRatio(metrics);\n      var materialLabel = getMaterialDisplayName(ctx);\n      var holderAnswer = getAnswer(ctx, \"holder_type\");\n      return {\n        why: {\n          tone: \"fit\",\n          eyebrow: \"Recommendation logic\",\n          title: \"Why it fits\",\n          badge: recipeUi.chip,\n          highlight: metrics.requestedThreadIdentity\n            ? metrics.requestedThreadIdentity + \" is covered cleanly by this tap.\"\n            : \"The requested thread is covered cleanly by this tap.\",\n          summary: top.score.reasons[0] || \"The selected tap matches the requested thread, the material window and a workable through-hole release plan.\",\n          facts: dedupeTextItems([\n            materialLabel ? \"Material: \" + materialLabel : null,\n            depthRatio != null ? \"Engagement: \" + formatDisplayNumber(depthRatio, 2) + \" xD\" : null,\n            metrics.predrillRecommendedMm != null ? \"Core hole: \" + formatDisplayNumber(metrics.predrillRecommendedMm, 2) + \" mm\" : null,\n          ]).slice(0, 3),\n          items: (storyData && storyData.why || []).slice(0, 3),\n        },\n        how: {\n          tone: \"start\",\n          eyebrow: \"First release\",\n          title: \"How to start\",\n          badge: machineUi.tone === \"good\" ? \"Machine checked\" : \"Controlled first hole\",\n          highlight: \"Qualify one hole before opening the band.\",\n          summary: recipeUi.note,\n          facts: dedupeTextItems([\n            metrics.rowCoolantMode ? \"Coolant: \" + getRecipeCoolantLabel(metrics.rowCoolantMode) : null,\n            buildVcBandLabel(metrics) !== \"n/a\" ? \"vc band: \" + buildVcBandLabel(metrics) : null,\n            holderAnswer ? \"Holder: \" + titleCase(holderAnswer) : \"Holder: confirm before full release\",\n          ]).slice(0, 3),\n          items: (storyData && storyData.how || []).slice(0, 3),\n        },\n        watch: {\n          tone: \"watch\",\n          eyebrow: \"Critical signals\",\n          title: \"Watch-outs\",\n          badge: \"Risk: \" + riskUi.value,\n          highlight: metrics.exitRiskClass === \"high\"\n            ? \"Breakthrough quality is the main release limiter in this setup.\"\n            : metrics.loadClass === \"high\"\n              ? \"Torque and sound are the main release limiters in this setup.\"\n              : \"Breakthrough quality still decides whether the case stays stable.\",\n          summary: riskUi.note,\n          facts: dedupeTextItems([\n            metrics.exitRiskClass ? \"Exit risk: \" + titleCase(metrics.exitRiskClass) : null,\n            metrics.loadClass ? \"Load: \" + titleCase(metrics.loadClass) : null,\n            materialProfile && materialProfile.typicalFailure ? \"Typical failure: \" + cleanShortText(materialProfile.typicalFailure) : null,\n          ]).slice(0, 3),\n          items: (storyData && storyData.watch || []).slice(0, 3),\n        },\n      };\n    }\n    \n    function buildRefineData(ctx, top, confidenceUi, recipeUi) {\n      var metrics = top.metrics || {};\n      var items = [];\n      if (!getAnswer(ctx, \"thread_tolerance\")) items.push({ questionId: \"thread_tolerance\", label: \"Confirm thread tolerance\" });\n      if (metrics.predrillActualMm == null && getAnswer(ctx, \"core_hole_status\") !== \"actual_known\") items.push({ questionId: \"actual_predrill_diameter_mm\", label: \"Confirm core hole diameter\" });\n      if (!getAnswer(ctx, \"holder_type\")) items.push({ questionId: \"holder_type\", label: \"Confirm holder type\" });\n      if (!getAnswer(ctx, \"quality_sensitivity\")) items.push({ questionId: \"quality_sensitivity\", label: \"Confirm quality target\" });\n      return {\n        visible: items.length > 0 && (confidenceUi.label !== \"High\" || recipeUi.tone !== \"exact\"),\n        title: \"Improve recommendation confidence\",\n        description: \"Confirm one missing setup detail to tighten the start values and reduce estimation.\",\n        items: items.slice(0, 2),\n      };\n    }\n    \n    function buildTrustCards(top, recipeUi, machineUi, riskUi, machineChecks) {\n      var metrics = top.metrics || {};\n      return {\n        recipe: {\n          title: recipeUi.title,\n          tone: recipeUi.tone,\n          badge: recipeUi.chip,\n          value: recipeUi.value,\n          note: recipeUi.note,\n          items: dedupeTextItems([\n            metrics.apmxMarginMm != null ? \"APMX margin \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm.\" : null,\n            metrics.usableLengthMarginMm != null ? \"Usable-length margin \" + formatDisplayNumber(metrics.usableLengthMarginMm, 2) + \" mm.\" : null,\n            metrics.recommendedChamferClass ? \"Recommended chamfer class: \" + metrics.recommendedChamferClass + \".\" : null,\n          ]).slice(0, 2),\n        },\n        holePrep: buildHolePreparationCard(top),\n        machine: {\n          title: \"Machine fit\",\n          tone: machineUi.tone,\n          badge: machineUi.value,\n          value: machineUi.note,\n          note: riskUi.note,\n          items: dedupeTextItems((machineChecks || []).map(function mapCheck(item) {\n            if (!item) return null;\n            return item.label + \": \" + titleCase(item.result) + (item.note ? \" - \" + item.note + \".\" : \".\");\n          })).slice(0, 2),\n        },\n      };\n    }\n    \n    function formatMachineCheckReleaseNote(item) {\n      if (!item) return null;\n      if (item.result === \"pass\") {\n        return item.label + \": \" + item.note + \".\";\n      }\n      if (item.result === \"limited\") {\n        return item.label + \": \" + item.note + \" still narrows the safe release window.\";\n      }\n      if (item.result === \"unknown\") {\n        return item.label + \": still unconfirmed for full release.\";\n      }\n      return item.label + \": current setup is not ideal for a wider tapping band.\";\n    }\n    \n    function buildDetailPanels(ctx, top, recipeUi, machineUi, riskUi, machineChecks, alternativeItems) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var panels = [];\n    \n      panels.push({\n        type: \"summary\",\n        tone: recipeUi.tone,\n        eyebrow: \"Technical basis\",\n        title: \"Why this starting band is credible\",\n        summary: recipeUi.note,\n        facts: dedupeTextItems([\n          getMaterialDisplayName(ctx) ? \"Material: \" + getMaterialDisplayName(ctx) : null,\n          recipeUi.value ? \"Cutting-data basis: \" + recipeUi.value : null,\n          buildVcBandLabel(metrics) !== \"n/a\" ? \"vc band: \" + buildVcBandLabel(metrics) : null,\n        ]).slice(0, 3),\n        items: dedupeTextItems([\n          \"Geometry uses chamfer form \" + String(metrics.tapChamferForm || \"n/a\") + \" with helix \" + formatMaybeNumber(metrics.tapHelixDeg, \"deg\", 0) + \".\",\n          metrics.recommendedChamferClass ? \"Recommended through-hole chamfer logic is class \" + metrics.recommendedChamferClass + \".\" : null,\n          metrics.apmxMarginMm != null || metrics.usableLengthMarginMm != null\n            ? \"Length reserve stays at APMX \" + formatMaybeNumber(metrics.apmxMarginMm, \"mm\", 2) + \" and usable length \" + formatMaybeNumber(metrics.usableLengthMarginMm, \"mm\", 2) + \".\"\n            : null,\n        ]).slice(0, 3),\n      });\n    \n      panels.push({\n        type: \"summary\",\n        tone: riskUi.tone === \"high\" ? \"watch\" : machineUi.tone,\n        eyebrow: \"Release notes\",\n        title: \"What to verify before full release\",\n        summary: riskUi.note,\n        facts: dedupeTextItems([\n          machineUi.value ? \"Machine status: \" + machineUi.value : null,\n          metrics.exitRiskClass ? \"Exit risk: \" + titleCase(metrics.exitRiskClass) : null,\n          metrics.predrillValidationRoute ? \"Core-hole route: \" + getPredrillRouteLabel(metrics.predrillValidationRoute) : null,\n        ]).slice(0, 3),\n        items: dedupeTextItems([\n          formatMachineCheckReleaseNote(machineChecks[0]),\n          formatMachineCheckReleaseNote(machineChecks[1]),\n          formatMachineCheckReleaseNote(machineChecks[2]),\n          materialProfile && materialProfile.toolHolder ? ensureSentence(materialProfile.toolHolder) : null,\n          metrics.problemHistory && metrics.problemHistory !== \"none\" ? \"Previous issue to re-check: \" + humanizeToken(metrics.problemHistory) + \".\" : null,\n          metrics.alternativeProcessFlag ? \"If process security remains the priority, thread milling is the safer fallback for this setup.\" : null,\n        ]).slice(0, 4),\n      });\n    \n      if (alternativeItems && alternativeItems.length) {\n        panels.push({\n          type: \"alternatives\",\n          tone: \"default\",\n          eyebrow: \"Backup options\",\n          title: \"Alternatives worth checking\",\n          summary: \"If you need a nearby backup for stock, holder strategy or extra process margin, these taps are the closest next options.\",\n          items: alternativeItems.map(function mapAlternative(item, index) {\n            return {\n              badge: index === 0 ? \"Closest backup\" : \"Option \" + String(index + 1),\n              label: item.label,\n              reason: item.reason,\n            };\n          }),\n        });\n      }\n    \n      return panels;\n    }\n    \n    function buildToleranceNotes(ctx, top) {\n      var metrics = top.metrics || {};\n      var notes = [\n        \"Requested thread: \" + String(metrics.requestedThreadIdentity || getAnswer(ctx, \"thread_designation\") || \"not specified\"),\n        \"Requested tolerance: \" + String(metrics.requestedTolerance || \"not specified\"),\n        \"Candidate tolerance: \" + String(metrics.candidateTolerance || \"not specified\"),\n        \"Recommended tap drill diameter: \" + formatMaybeNumber(metrics.predrillRecommendedMm, \"mm\", 3),\n      ];\n      if (metrics.predrillActualMm != null) {\n        notes.push(\"Actual tap drill diameter: \" + formatMaybeNumber(metrics.predrillActualMm, \"mm\", 3));\n      }\n      if (metrics.predrillDeltaMm != null) {\n        notes.push(\"Pre-drill delta: \" + formatMaybeNumber(metrics.predrillDeltaMm, \"mm\", 3));\n      }\n      return notes;\n    }\n    \n    function buildSetupNotes(ctx, top) {\n      var metrics = top.metrics || {};\n      var materialProfile = getMaterialProfile(ctx);\n      var troubleshootingCards = buildTroubleshootingCards(ctx, top);\n      var notes = [\n        { area: \"cutting data\", message: \"Recipe row uses \" + getRecipeOperationLabel(metrics) + \" with \" + getRecipeCoolantLabel(metrics.rowCoolantMode).toLowerCase() + \" coolant and vc \" + buildVcBandLabel(metrics) + \".\" },\n        { area: \"geometry\", message: \"Chamfer form \" + String(metrics.tapChamferForm || \"n/a\") + \" with helix \" + formatMaybeNumber(metrics.tapHelixDeg, \"deg\", 0) + \".\" },\n        { area: \"through-hole logic\", message: \"Recommended chamfer class for this setup: \" + String(metrics.recommendedChamferClass || \"n/a\") + \".\" },\n        { area: \"length window\", message: \"APMX margin \" + formatMaybeNumber(metrics.apmxMarginMm, \"mm\", 2) + \", usable-length margin \" + formatMaybeNumber(metrics.usableLengthMarginMm, \"mm\", 2) + \".\" },\n      ];\n      if (materialProfile) {\n        notes.push({\n          area: \"material\",\n          message: getMaterialDisplayName(ctx) + \": chip form \" + String(formatProfileFact(materialProfile.chipForm) || \"n/a\") + \", work hardening \" + String(formatProfileFact(materialProfile.workHardening) || \"n/a\") + \", machinability \" + String(materialProfile.machinability != null ? materialProfile.machinability + \"/100\" : \"n/a\") + \", preferred coolant \" + String(formatProfileCoolant(materialProfile) || \"n/a\") + \".\",\n        });\n        if (materialProfile.toolHolder) {\n          notes.push({\n            area: \"holder baseline\",\n            message: ensureSentence(materialProfile.toolHolder),\n          });\n        }\n        if (materialProfile.typicalFailure || materialProfile.avoid) {\n          notes.push({\n            area: \"failure mode\",\n            message: (materialProfile.typicalFailure ? \"Typical failure: \" + ensureSentence(materialProfile.typicalFailure) + \" \" : \"\") + (materialProfile.avoid ? \"Avoid: \" + ensureSentence(materialProfile.avoid) : \"\"),\n          });\n        }\n      }\n      if (metrics.series || metrics.substrate || metrics.coating) {\n        notes.push({\n          area: \"program\",\n          message: \"Series \" + String(metrics.series || \"n/a\") + \", substrate \" + String(metrics.substrate || \"n/a\") + \", coating \" + String(metrics.coating || \"n/a\") + \".\",\n        });\n      }\n      if (troubleshootingCards.length) {\n        notes.push({\n          area: \"troubleshooting\",\n          message: \"Focused troubleshooting loaded for \" + troubleshootingCards.map(function mapCard(card) { return card.title; }).join(\" / \") + \".\",\n        });\n      }\n      return notes;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var alternativeItems;\n    \n      if (!top || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"tapping_through\",\n          outcome: \"no_match\",\n          summary: \"No safe through-hole tapping recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current setup is incomplete or incompatible for a safe through-tap recommendation.\"),\n            noMatchGuidance({\n              message: \"Check thread designation, tapping mode, core-hole status and full thread length. If the setup remains critical, consider thread milling as a fallback.\",\n              steps: [\n                \"Confirm the exact thread designation and tolerance.\",\n                \"Verify rigid tapping or a synchro chuck.\",\n                \"Provide the actual or target tap drill diameter.\",\n                \"Review exit condition and coolant availability.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust thread setup\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      alternativeItems = buildAlternativeItems(scored);\n    \n      var recipeUi = buildRecipeSourceUi(top);\n      var riskItems = buildRiskItems(ctx, top);\n      var machineChecks = buildMachineChecks(ctx, top);\n      var machineUi = buildMachineUi(machineChecks);\n      var riskUi = buildRiskUi(top, riskItems);\n      var confidenceUi = buildConfidenceUi(top, recipeUi, machineUi, riskUi);\n      var storyData = buildStoryData(ctx, top, recipeUi);\n      var refineData = buildRefineData(ctx, top, confidenceUi, recipeUi);\n      var troubleshootingCards = buildTroubleshootingCards(ctx, top);\n      var trustCards = buildTrustCards(top, recipeUi, machineUi, riskUi, machineChecks);\n      var storyPanels = buildStoryPanels(ctx, top, recipeUi, machineUi, riskUi, storyData);\n      var detailPanels = buildDetailPanels(ctx, top, recipeUi, machineUi, riskUi, machineChecks, alternativeItems);\n      var heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 4),\n        productUrl: candidate.catalog.url,\n      });\n      var threadBlock = threadIdentity({\n        standard: metrics.requestedThreadForm || getAnswer(ctx, \"thread_standard\"),\n        size: metrics.requestedThreadSize || getAnswer(ctx, \"thread_size\"),\n        pitch: metrics.requestedPitchMm != null ? String(metrics.requestedPitchMm) : getAnswer(ctx, \"pitch\"),\n        tolerance: metrics.requestedTolerance || metrics.candidateTolerance,\n        blindThrough: \"through\",\n      });\n      var kpiBlock = fitKpis([\n        { key: \"thread_identity\", label: \"Thread identity\", value: (top.score.parts.threadIdentity || 0).toFixed(2), status: (top.score.parts.threadIdentity || 0) >= 2.5 ? \"good\" : \"weak\" },\n        { key: \"geometry_fit\", label: \"Chip-flow geometry\", value: formatMaybeNumber(metrics.geometrySuitability, null, 2), status: (metrics.geometrySuitability || 0) >= 0.8 ? \"good\" : \"ok\" },\n        { key: \"predrill_fit\", label: \"Pre-drill fit\", value: formatMaybeNumber(metrics.predrillFit, null, 2), status: (metrics.predrillFit || 0) >= 0.8 ? \"good\" : \"ok\" },\n        { key: \"length_fit\", label: \"Length window\", value: formatMaybeNumber(metrics.lengthFit, null, 2), status: (metrics.lengthFit || 0) >= 0.8 ? \"good\" : \"ok\" },\n        { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.78 ? \"good\" : \"ok\" },\n      ]);\n      var toleranceBlock = toleranceNotes(buildToleranceNotes(ctx, top));\n      var recipeBlock = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: buildRecipeValues(top),\n      });\n      var riskBlock = riskNotes(riskItems);\n      var machineBlock = machineFeasibility(machineChecks);\n      var setupBlock = setupNotes(buildSetupNotes(ctx, top));\n      var alternativesBlock = alternatives(alternativeItems);\n      var commerceBlock = commerceCta({\n        productUrl: candidate.catalog.url,\n        available: candidate.commerce.available,\n        priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n        ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n      });\n    \n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: buildSummaryLine(ctx, top),\n        headerPills: buildHeaderPills(confidenceUi, recipeUi, machineUi, riskUi),\n      };\n      recipeBlock.data.presentation = Object.assign(buildStartCardData(top, recipeUi), {\n        trustCard: trustCards.recipe,\n        holePrepCard: trustCards.holePrep,\n      });\n      riskBlock.data.presentation = riskUi;\n      machineBlock.data.presentation = Object.assign({}, machineUi, {\n        trustCard: trustCards.machine,\n      });\n      setupBlock.data.presentation = {\n        stories: storyData,\n        storyPanels: storyPanels,\n        refine: refineData,\n        troubleshooting: troubleshootingCards,\n        detailPanels: detailPanels,\n      };\n      commerceBlock.data.presentation = {\n        eyebrow: \"Order this tool\",\n        availabilityLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Ready to review\",\n        availabilityNote: candidate.commerce.available === false\n          ? \"This variant is currently not available.\"\n          : \"Open the product page to review live commerce details and place the order.\",\n      };\n    \n      return createResultViewModel({\n        processId: \"tapping_through\",\n        outcome: top.score.total >= 5.25 ? \"match\" : \"limited_match\",\n        summary: \"Best through-hole tapping match based on thread identity, geometry suitability, pre-drill logic and process robustness.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          threadBlock,\n          kpiBlock,\n          toleranceBlock,\n          recipeBlock,\n          riskBlock,\n          machineBlock,\n          setupBlock,\n          alternativesBlock,\n          commerceBlock,\n        ],\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust thread setup\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/tapping-through/questions.js\": function (exports, module, __bundle) {\n    var { createQuestionDef } = __bundle.require(\"core/contracts.js\");\n    var { toNullableDraftNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getQuestionDefinition } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function cloneQuestion(questionId, overrides) {\n      return createQuestionDef(Object.assign({}, getQuestionDefinition(questionId), overrides || {}));\n    }\n    \n    function createTokenQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: config.type || \"chips\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: config.options || [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableString(value);\n        },\n        validate: config.validate || null,\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function createNumberQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: \"number\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: config.unit || null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableDraftNumber(value);\n        },\n        validate: config.validate || function validate(value) {\n          if (value == null) return [];\n          return value > 0\n            ? []\n            : [{ field: config.id, message: \"Please enter a positive value.\", severity: \"error\", code: \"positive_required\" }];\n        },\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"half\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function createTextQuestion(config) {\n      return createQuestionDef({\n        id: config.id,\n        type: \"text\",\n        label: config.label,\n        helpText: config.helpText || null,\n        placeholder: config.placeholder || null,\n        unit: null,\n        group: config.group || \"advanced\",\n        required: config.required !== false,\n        expertOnly: Boolean(config.expertOnly),\n        options: [],\n        defaultValue: null,\n        hiddenValuePolicy: config.hiddenValuePolicy || \"keep\",\n        normalize: function normalize(value) {\n          return toNullableString(value);\n        },\n        validate: config.validate || null,\n        derive: null,\n        visibleWhen: config.visibleWhen || null,\n        viewHint: config.viewHint || { width: \"full\", emphasis: \"normal\" },\n        analytics: { fragmentId: null, source: \"process\" },\n      });\n    }\n    \n    function getThreadStandardFromAnswers(ctx) {\n      var explicit = toNullableString(ctx && ctx.answers && ctx.answers.thread_standard_choice);\n      if (explicit) return explicit.toUpperCase();\n      explicit = toNullableString(ctx && ctx.derived && ctx.derived.thread_standard);\n      return explicit ? explicit.toUpperCase() : null;\n    }\n    \n    function looksLikePipeThread(ctx) {\n      var explicitStandard = getThreadStandardFromAnswers(ctx);\n      var designation = toNullableString(ctx && ctx.answers && ctx.answers.thread_designation_override);\n    \n      if (explicitStandard) {\n        return explicitStandard === \"G\" || explicitStandard === \"NPT\" || explicitStandard === \"R\";\n      }\n      if (!designation) return false;\n      designation = designation.toUpperCase();\n      return designation.indexOf(\"NPT\") >= 0 || designation.indexOf(\"G\") === 0 || designation.indexOf(\"R\") === 0;\n    }\n    \n    function getQuestions() {\n      return [\n        createTokenQuestion({\n          id: \"thread_standard_choice\",\n          label: \"Which thread type do you need?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: the thread type defines the standard family, the automatic pitch rule and the exact tap program that can fit.\",\n          options: [\n            { value: \"M\", label: \"M coarse\" },\n            { value: \"MF\", label: \"MF fine\" },\n            { value: \"UNC\", label: \"UNC\" },\n            { value: \"UNF\", label: \"UNF\" },\n            { value: \"G\", label: \"G / BSPP\" },\n            { value: \"NPT\", label: \"NPT\" },\n            { value: \"EGM\", label: \"EGM\" },\n          ],\n        }),\n        createTextQuestion({\n          id: \"thread_nominal_size\",\n          label: \"What is the nominal thread size?\",\n          placeholder: \"Metric example: 10 | Inch example: 1/4\",\n          group: \"core\",\n          required: true,\n          viewHint: { width: \"half\", emphasis: \"high\" },\n          helpText: \"Why it matters: the nominal size is enough to derive the standard pitch automatically for the supported thread families, so the operator does not need to type a full designation.\",\n          validate: function validate(value) {\n            var text = toNullableString(value);\n            if (!text) {\n              return [{ field: \"thread_nominal_size\", message: \"Enter the nominal thread size.\", severity: \"error\", code: \"required\" }];\n            }\n            return [];\n          },\n        }),\n        cloneQuestion(\"thread_length_mm\", {\n          label: \"Required full thread length\",\n          helpText: \"Why it matters: the requested full thread length drives tapping load, xD ratio, and whether APMX or usable length remain safe.\",\n          group: \"core\",\n          required: true,\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        createTokenQuestion({\n          id: \"sync_tapping_capability\",\n          label: \"Which tapping mode is available on the machine?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"high\" },\n          helpText: \"Why it matters: tapping is highly sensitive to pitch mismatch. Rigid tapping or a synchro chuck directly affects reliability and thread quality.\",\n          options: [\n            { value: \"rigid\", label: \"Rigid tapping\" },\n            { value: \"synchro_chuck\", label: \"Synchro chuck\" },\n            { value: \"unknown\", label: \"Unsure\" },\n            { value: \"no\", label: \"No sync mode\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"coolant_lubrication_mode\",\n          label: \"Which coolant or lubrication is available?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: lubrication changes friction, built-up edge risk, chip flow and the safe cutting window, especially in M, S and difficult P materials.\",\n          options: [\n            { value: \"through_emulsion\", label: \"Through coolant / emulsion\" },\n            { value: \"external_emulsion\", label: \"External emulsion\" },\n            { value: \"oil\", label: \"Cutting oil\" },\n            { value: \"mql\", label: \"MQL / mist\" },\n            { value: \"dry\", label: \"Dry\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"exit_condition\",\n          label: \"How clean is the exit condition behind the thread?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: a nominal through hole is only the easy case when chips can leave freely. Cross-holes, thin walls or angled exits raise burr and breakage risk.\",\n          options: [\n            { value: \"free_exit\", label: \"Free exit\" },\n            { value: \"cross_hole\", label: \"Cross-hole\" },\n            { value: \"interrupted_exit\", label: \"Interrupted exit\" },\n            { value: \"thin_wall\", label: \"Thin wall\" },\n            { value: \"angled_exit\", label: \"Angled exit\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"core_hole_status\",\n          label: \"What is the core-hole or pre-drill status?\",\n          group: \"core\",\n          required: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: pre-drill size is a real load lever. It decides whether the finder should validate an existing hole or recommend the safer tap drill diameter.\",\n          options: [\n            { value: \"actual_known\", label: \"Actual drill diameter is known\" },\n            { value: \"fixed_unknown\", label: \"Prepared, but actual size is unknown\" },\n            { value: \"recommend\", label: \"Need a recommendation\" },\n            { value: \"missing\", label: \"No core hole prepared yet\" },\n          ],\n        }),\n        cloneQuestion(\"thread_tolerance\", {\n          label: \"Target tolerance override\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: false,\n          helpText: \"Why it matters: if the standard default tolerance is not enough, this tightens the tap choice and the final fit-class check.\",\n          placeholder: \"e.g. 6H, 6HX or 2B\",\n          viewHint: { width: \"half\", emphasis: \"normal\" },\n        }),\n        createTextQuestion({\n          id: \"thread_designation_override\",\n          label: \"Custom thread designation override\",\n          placeholder: \"e.g. M10x1.5-6H or 1/4-20UNC-2B\",\n          group: \"advanced\",\n          required: false,\n          expertOnly: true,\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: use this only when the automatic type + size route does not cover the requested thread. The override wins over the simplified entry path.\",\n        }),\n        createTokenQuestion({\n          id: \"priority\",\n          label: \"What matters most?\",\n          group: \"advanced\",\n          required: false,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: when several taps are technically valid, this biases the ranking toward process security, quality, tool life or productivity.\",\n          options: [\n            { value: \"process_security\", label: \"Process security\" },\n            { value: \"thread_quality\", label: \"Thread quality\" },\n            { value: \"tool_life\", label: \"Tool life\" },\n            { value: \"productivity\", label: \"Productivity\" },\n          ],\n        }),\n        createNumberQuestion({\n          id: \"actual_predrill_diameter_mm\",\n          label: \"Actual pre-drill diameter\",\n          unit: \"mm\",\n          group: \"core\",\n          required: true,\n          expertOnly: false,\n          visibleWhen: function visibleWhen(ctx) {\n            return toNullableString(ctx && ctx.answers && ctx.answers.core_hole_status) === \"actual_known\";\n          },\n          helpText: \"Why it matters: when the actual drill diameter is known, the module can compare it against the tap recommendation and estimate load or gauge risk much more reliably.\",\n          viewHint: { width: \"half\", emphasis: \"high\" },\n        }),\n        createTokenQuestion({\n          id: \"holder_type\",\n          label: \"Which holder is used?\",\n          group: \"machine\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: holder behavior changes how well the setup tolerates small pitch errors and affects flank friction during tapping.\",\n          options: [\n            { value: \"rigid_holder\", label: \"Rigid holder\" },\n            { value: \"synchro_chuck\", label: \"Synchro chuck\" },\n            { value: \"length_comp\", label: \"Length compensation\" },\n            { value: \"unknown\", label: \"Unsure\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"quality_sensitivity\",\n          label: \"Is the thread quality target especially critical?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: gauge-critical, low-burr or surface-critical threads justify a more conservative tap and more explicit warnings.\",\n          options: [\n            { value: \"general\", label: \"General quality\" },\n            { value: \"gauge_critical\", label: \"Gauge critical\" },\n            { value: \"low_burr\", label: \"Low burr priority\" },\n            { value: \"surface_critical\", label: \"Surface or sealing critical\" },\n          ],\n        }),\n        createTokenQuestion({\n          id: \"problem_history\",\n          label: \"What has gone wrong before, if anything?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          type: \"chips\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n          helpText: \"Why it matters: previous tap breakage, built-up edge, burrs or gauge failures are strong indicators for a safer geometry and more explicit result guidance.\",\n          options: [\n            { value: \"none\", label: \"No recurring issue\" },\n            { value: \"tap_breakage\", label: \"Tap breakage\" },\n            { value: \"built_up_edge\", label: \"Built-up edge\" },\n            { value: \"burrs\", label: \"Burrs or breakout\" },\n            { value: \"gauge_failure\", label: \"Gauge failure\" },\n            { value: \"high_torque\", label: \"High torque\" },\n          ],\n        }),\n        cloneQuestion(\"sealing_relevant\", {\n          label: \"Is sealing or pipe-thread function relevant?\",\n          group: \"safety\",\n          required: false,\n          expertOnly: true,\n          visibleWhen: function visibleWhen(ctx) {\n            return looksLikePipeThread(ctx);\n          },\n          helpText: \"Why it matters: sealing function changes how strictly the thread standard and tolerance need to be respected, especially for pipe-thread styles.\",\n          viewHint: { width: \"full\", emphasis: \"normal\" },\n        }),\n      ];\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/tapping-through/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, createRecipe, toNullableNumber, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var { getAnswer, prefilterByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var KIENZLE_BY_GROUP = Object.freeze({\n      P: 1659,\n      M: 1397,\n      K: 1125,\n      N: 700,\n      S: 1450,\n      H: 2400,\n    });\n    \n    var AUTO_THREAD_LIBRARY = Object.freeze({\n      M: Object.freeze({\n        \"3\": \"0.5\",\n        \"4\": \"0.7\",\n        \"5\": \"0.8\",\n        \"6\": \"1\",\n        \"8\": \"1.25\",\n        \"10\": \"1.5\",\n        \"12\": \"1.75\",\n        \"14\": \"2\",\n        \"16\": \"2\",\n        \"18\": \"2.5\",\n        \"20\": \"2.5\",\n        \"22\": \"2.5\",\n        \"24\": \"3\",\n        \"27\": \"3\",\n        \"30\": \"3.5\",\n      }),\n      MF: Object.freeze({\n        \"8\": \"1\",\n        \"10\": \"1.25\",\n        \"12\": \"1.5\",\n        \"14\": \"1.5\",\n        \"16\": \"1.5\",\n        \"18\": \"1.5\",\n        \"20\": \"1.5\",\n        \"24\": \"2\",\n        \"27\": \"2\",\n        \"30\": \"2\",\n      }),\n      EGM: Object.freeze({\n        \"6\": \"1\",\n        \"8\": \"1.25\",\n        \"10\": \"1.5\",\n        \"12\": \"1.75\",\n        \"14\": \"2\",\n        \"16\": \"2\",\n        \"18\": \"2.5\",\n        \"20\": \"2.5\",\n      }),\n      UNC: Object.freeze({\n        \"1/4\": \"20\",\n        \"5/16\": \"18\",\n        \"3/8\": \"16\",\n        \"7/16\": \"14\",\n        \"1/2\": \"13\",\n        \"5/8\": \"11\",\n        \"3/4\": \"10\",\n        \"1\": \"8\",\n      }),\n      UNF: Object.freeze({\n        \"1/4\": \"28\",\n        \"5/16\": \"24\",\n        \"3/8\": \"24\",\n        \"7/16\": \"20\",\n        \"1/2\": \"20\",\n        \"5/8\": \"18\",\n        \"3/4\": \"16\",\n        \"1\": \"12\",\n      }),\n      G: Object.freeze({\n        \"1/8\": \"28\",\n        \"1/4\": \"19\",\n        \"3/8\": \"19\",\n        \"1/2\": \"14\",\n        \"3/4\": \"14\",\n        \"1\": \"11\",\n      }),\n      NPT: Object.freeze({\n        \"1/8\": \"27\",\n        \"1/4\": \"18\",\n        \"3/8\": \"18\",\n        \"1/2\": \"14\",\n        \"3/4\": \"14\",\n        \"1\": \"11.5\",\n      }),\n    });\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function clamp01(value) {\n      if (value == null || !Number.isFinite(value)) return 0;\n      if (value <= 0) return 0;\n      if (value >= 1) return 1;\n      return value;\n    }\n    \n    function roundValue(value, digits) {\n      var factor = Math.pow(10, digits == null ? 2 : digits);\n      if (value == null || !Number.isFinite(value)) return null;\n      return Math.round(value * factor) / factor;\n    }\n    \n    function firstNonNull(values) {\n      for (var index = 0; index < values.length; index += 1) {\n        if (values[index] != null) return values[index];\n      }\n      return null;\n    }\n    \n    function parseFractionToken(value) {\n      var text = toNullableString(value);\n      var parts;\n      var whole;\n      if (!text) return null;\n      if (text.indexOf(\"-\") >= 0) {\n        parts = text.split(\"-\");\n        if (parts.length === 2) {\n          whole = Number(parts[0]);\n          if (!Number.isFinite(whole)) return null;\n          return whole + (parseFractionToken(parts[1]) || 0);\n        }\n      }\n      if (text.indexOf(\"/\") >= 0) {\n        parts = text.split(\"/\");\n        if (parts.length !== 2 || !Number(parts[1])) return null;\n        return Number(parts[0]) / Number(parts[1]);\n      }\n      return toNullableNumber(text);\n    }\n    \n    function normalizeThreadForm(value) {\n      var text = toNullableString(value);\n      if (!text) return null;\n      text = text.toUpperCase();\n      if (text.indexOf(\"UNF\") >= 0) return \"UNF\";\n      if (text.indexOf(\"UNC\") >= 0) return \"UNC\";\n      if (text.indexOf(\"NPT\") >= 0) return \"NPT\";\n      if (text.indexOf(\"MF\") === 0) return \"MF\";\n      if (text.indexOf(\"EGM\") === 0) return \"EGM\";\n      if (text.indexOf(\"M\") === 0) return \"M\";\n      if (text.indexOf(\"G\") === 0) return \"G\";\n      if (text.indexOf(\"R\") === 0) return \"R\";\n      return text;\n    }\n    \n    function normalizeNominalSizeInput(threadStandard, value) {\n      var text = toNullableString(value);\n      var numeric;\n      if (!text) return null;\n      text = text.trim().toUpperCase().replace(/\\s+/g, \"\");\n      if (threadStandard === \"M\" || threadStandard === \"MF\" || threadStandard === \"EGM\") {\n        text = text.replace(/^(M|MF|EGM)/, \"\");\n        numeric = toNullableNumber(text);\n        return numeric == null ? null : String(numeric).replace(/\\.0+$/, \"\");\n      }\n      return text.replace(/^(UNC|UNF|NPT|G)/, \"\");\n    }\n    \n    function buildAutoThreadDesignation(threadStandard, nominalSize, tolerance) {\n      var standard = normalizeThreadForm(threadStandard);\n      var sizeKey = normalizeNominalSizeInput(standard, nominalSize);\n      var pitchToken;\n      if (!standard || !sizeKey) {\n        return { designation: null, supported: false, standard: standard, nominalSize: sizeKey, pitchToken: null };\n      }\n      pitchToken = AUTO_THREAD_LIBRARY[standard] && AUTO_THREAD_LIBRARY[standard][sizeKey];\n      if (!pitchToken) {\n        return { designation: null, supported: false, standard: standard, nominalSize: sizeKey, pitchToken: null };\n      }\n      if (standard === \"M\" || standard === \"MF\" || standard === \"EGM\") {\n        return {\n          designation: standard + sizeKey + \"x\" + pitchToken + (tolerance ? \"-\" + tolerance : \"\"),\n          supported: true,\n          standard: standard,\n          nominalSize: sizeKey,\n          pitchToken: pitchToken,\n        };\n      }\n      if (standard === \"UNC\" || standard === \"UNF\" || standard === \"NPT\") {\n        return {\n          designation: sizeKey + \"-\" + pitchToken + standard + (tolerance ? \"-\" + tolerance : \"\"),\n          supported: true,\n          standard: standard,\n          nominalSize: sizeKey,\n          pitchToken: pitchToken,\n        };\n      }\n      if (standard === \"G\") {\n        return {\n          designation: \"G\" + sizeKey + (tolerance ? \"-\" + tolerance : \"\"),\n          supported: true,\n          standard: standard,\n          nominalSize: sizeKey,\n          pitchToken: pitchToken,\n        };\n      }\n      return { designation: null, supported: false, standard: standard, nominalSize: sizeKey, pitchToken: pitchToken };\n    }\n    \n    function buildManualThreadDesignation(threadStandard, nominalSize) {\n      var standard = normalizeThreadForm(threadStandard);\n      var text = toNullableString(nominalSize);\n      var compact;\n      if (!standard || !text) return null;\n      compact = text.trim().toUpperCase().replace(/\\s+/g, \"\");\n      if (!compact) return null;\n      if (/^[A-Z]/.test(compact)) return compact;\n      if (standard === \"M\" || standard === \"MF\" || standard === \"EGM\") return standard + compact;\n      if (standard === \"G\" || standard === \"R\") return standard + compact;\n      if (standard === \"UNC\" || standard === \"UNF\" || standard === \"NPT\") {\n        return compact.indexOf(\"-\") >= 0 ? compact + standard : compact;\n      }\n      return compact;\n    }\n    \n    function parseThreadIdentity(value, explicitTolerance, explicitForm) {\n      var text = toNullableString(value);\n      var compact;\n      var match;\n      var form;\n      var size;\n      var pitchToken;\n      var tpi;\n      var tolerance = toNullableString(explicitTolerance);\n      var forcedForm = normalizeThreadForm(explicitForm);\n      var nominalMm = null;\n      var pitchMm = null;\n      if (!text) {\n        return {\n          standard: null,\n          size: null,\n          pitch: null,\n          pitchMm: null,\n          tolerance: tolerance,\n          pipeFlag: false,\n          nominalDiameterMm: null,\n          canonicalLabel: null,\n          valid: false,\n        };\n      }\n    \n      compact = text.replace(/\\s+/g, \"\").toUpperCase();\n    \n      match = compact.match(/^([A-Z]+)([0-9]+(?:[.,][0-9]+)?)(?:X([0-9]+(?:[.,][0-9]+)?))?(?:-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = forcedForm || normalizeThreadForm(match[1]);\n        size = form + match[2] + (match[3] ? \"x\" + match[3].replace(\",\", \".\") : \"\");\n        pitchToken = match[3] ? match[3].replace(\",\", \".\") : null;\n        pitchMm = toNullableNumber(pitchToken);\n        nominalMm = toNullableNumber(match[2]);\n        tolerance = tolerance || toNullableString(match[4]);\n        return {\n          standard: form,\n          size: size,\n          pitch: pitchToken,\n          pitchMm: pitchMm,\n          tolerance: tolerance,\n          pipeFlag: form === \"G\" || form === \"R\" || form === \"NPT\",\n          nominalDiameterMm: nominalMm,\n          canonicalLabel: size + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n    \n      match = compact.match(/^([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)\\-([0-9]+)(UNC|UNF)(?:\\-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = forcedForm || normalizeThreadForm(match[3]);\n        tpi = toNullableNumber(match[2]);\n        pitchMm = tpi ? 25.4 / tpi : null;\n        nominalMm = parseFractionToken(match[1]);\n        nominalMm = nominalMm != null ? nominalMm * 25.4 : null;\n        tolerance = tolerance || toNullableString(match[4]);\n        size = match[1] + \"-\" + match[2] + form;\n        return {\n          standard: form,\n          size: size,\n          pitch: match[2],\n          pitchMm: pitchMm,\n          tolerance: tolerance,\n          pipeFlag: false,\n          nominalDiameterMm: nominalMm,\n          canonicalLabel: size + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n    \n      match = compact.match(/^([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)\\-([0-9]+)(NPT)(?:\\-([A-Z0-9+.]+))?$/);\n      if (match) {\n        form = forcedForm || \"NPT\";\n        tpi = toNullableNumber(match[2]);\n        pitchMm = tpi ? 25.4 / tpi : null;\n        nominalMm = parseFractionToken(match[1]);\n        nominalMm = nominalMm != null ? nominalMm * 25.4 : null;\n        tolerance = tolerance || toNullableString(match[4]);\n        size = match[1] + \"-\" + match[2] + form;\n        return {\n          standard: form,\n          size: size,\n          pitch: match[2],\n          pitchMm: pitchMm,\n          tolerance: tolerance,\n          pipeFlag: true,\n          nominalDiameterMm: nominalMm,\n          canonicalLabel: size + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n    \n      match = compact.match(/^([GR])([0-9]+(?:\\/[0-9]+)?(?:-[0-9]+\\/[0-9]+)?)$/);\n      if (match) {\n        form = forcedForm || match[1];\n        nominalMm = parseFractionToken(match[2]);\n        nominalMm = nominalMm != null ? nominalMm * 25.4 : null;\n        size = form + match[2];\n        return {\n          standard: form,\n          size: size,\n          pitch: null,\n          pitchMm: null,\n          tolerance: tolerance,\n          pipeFlag: true,\n          nominalDiameterMm: nominalMm,\n          canonicalLabel: size + (tolerance ? \"-\" + tolerance : \"\"),\n          valid: true,\n        };\n      }\n    \n      return {\n        standard: forcedForm || normalizeThreadForm(compact),\n        size: compact,\n        pitch: null,\n        pitchMm: null,\n        tolerance: tolerance,\n        pipeFlag: compact.indexOf(\"NPT\") >= 0 || compact.indexOf(\"G\") === 0 || compact.indexOf(\"R\") === 0,\n        nominalDiameterMm: null,\n        canonicalLabel: compact + (tolerance ? \"-\" + tolerance : \"\"),\n        valid: false,\n      };\n    }\n    \n    function getMaterialGroup(materialCode) {\n      var text = toNullableString(materialCode);\n      if (!text) return null;\n      return text.toUpperCase().charAt(0);\n    }\n    \n    function mapSyncMode(syncMode) {\n      switch (toNullableString(syncMode)) {\n        case \"rigid\":\n          return { label: \"Rigid tapping\", score: 1, stable: true };\n        case \"synchro_chuck\":\n          return { label: \"Synchro chuck\", score: 0.92, stable: true };\n        case \"unknown\":\n          return { label: \"Unknown tapping mode\", score: 0.55, stable: false };\n        case \"no\":\n          return { label: \"No sync mode\", score: 0, stable: false };\n        default:\n          return { label: \"Unspecified tapping mode\", score: 0.45, stable: false };\n      }\n    }\n    \n    function mapExitRisk(exitCondition) {\n      switch (toNullableString(exitCondition)) {\n        case \"free_exit\":\n          return { code: \"low\", weight: 0.1, label: \"Free exit\" };\n        case \"cross_hole\":\n          return { code: \"high\", weight: 0.8, label: \"Cross-hole exit\" };\n        case \"interrupted_exit\":\n          return { code: \"high\", weight: 0.75, label: \"Interrupted exit\" };\n        case \"thin_wall\":\n          return { code: \"high\", weight: 0.85, label: \"Thin wall exit\" };\n        case \"angled_exit\":\n          return { code: \"medium\", weight: 0.55, label: \"Angled exit\" };\n        case \"unknown\":\n          return { code: \"medium\", weight: 0.45, label: \"Unknown exit condition\" };\n        default:\n          return { code: \"medium\", weight: 0.45, label: \"Unspecified exit condition\" };\n      }\n    }\n    \n    function mapCoolantModeAnswer(value) {\n      switch (toNullableString(value)) {\n        case \"through_emulsion\":\n          return { normalized: \"through\", label: \"Through coolant / emulsion\", quality: 1 };\n        case \"external_emulsion\":\n          return { normalized: \"external\", label: \"External emulsion\", quality: 0.78 };\n        case \"oil\":\n          return { normalized: \"external\", label: \"Cutting oil\", quality: 0.95 };\n        case \"mql\":\n          return { normalized: \"mist\", label: \"MQL / mist\", quality: 0.62 };\n        case \"dry\":\n          return { normalized: \"dry\", label: \"Dry\", quality: 0.2 };\n        case \"unknown\":\n          return { normalized: \"unknown\", label: \"Unknown coolant mode\", quality: 0.45 };\n        default:\n          return { normalized: \"unknown\", label: \"Unspecified coolant mode\", quality: 0.45 };\n      }\n    }\n    \n    function normalizeTolerance(value) {\n      var text = toNullableString(value);\n      return text ? text.toUpperCase() : null;\n    }\n    \n    function normalizeCoreHoleRoute(value) {\n      switch (toNullableString(value)) {\n        case \"actual_known\":\n        case \"fixed_unknown\":\n        case \"recommend\":\n        case \"missing\":\n          return value;\n        default:\n          return null;\n      }\n    }\n    \n    function deriveRecommendedChamfer(materialGroup, exitRiskCode, threadDepthRatio) {\n      if (materialGroup === \"K\" || materialGroup === \"N\") return \"E\";\n      if (materialGroup === \"M\") return \"C\";\n      if (materialGroup === \"S\") return exitRiskCode === \"low\" ? \"C\" : \"B\";\n      if (materialGroup === \"H\") return \"B\";\n      if (threadDepthRatio != null && threadDepthRatio > 1.5) return \"C\";\n      return \"B\";\n    }\n    \n    function computeGeometrySuitability(candidate, derived) {\n      var materialGroup = derived.materialGroup;\n      var chamfer = normalizeTolerance(candidate.threading.tapChamferForm);\n      var helix = toNullableNumber(candidate.threading.tapHelixDeg);\n      var exitRisk = derived.exitRisk;\n      var score = 0.45;\n    \n      if (materialGroup === \"P\") {\n        if (chamfer === \"C\" && helix != null && helix >= 35) score = 1;\n        else if (chamfer === \"B\") score = 0.92;\n        else if (chamfer === \"E\" && (helix == null || helix <= 5)) score = 0.58;\n      } else if (materialGroup === \"M\") {\n        if (chamfer === \"C\" && helix != null && helix >= 35) score = 1;\n        else if (chamfer === \"B\") score = 0.68;\n        else if (chamfer === \"E\") score = 0.35;\n      } else if (materialGroup === \"K\") {\n        if (chamfer === \"E\" && (helix == null || helix <= 5)) score = 1;\n        else if (chamfer === \"B\") score = 0.7;\n        else if (chamfer === \"C\" && helix != null && helix >= 35) score = 0.42;\n      } else if (materialGroup === \"N\") {\n        if (chamfer === \"E\" && (helix == null || helix <= 5)) score = 0.96;\n        else if (chamfer === \"B\") score = 0.76;\n        else if (chamfer === \"C\") score = 0.5;\n      } else if (materialGroup === \"S\") {\n        if (chamfer === \"C\" && helix != null && helix >= 35) score = 0.84;\n        else if (chamfer === \"B\") score = 0.62;\n        else if (chamfer === \"E\") score = 0.36;\n      } else if (materialGroup === \"H\") {\n        if (chamfer === \"B\") score = 0.42;\n        else if (chamfer === \"C\") score = 0.36;\n        else score = 0.22;\n      }\n    \n      if (exitRisk.code === \"high\") score -= 0.15;\n      else if (exitRisk.code === \"medium\") score -= 0.08;\n    \n      return clamp01(score);\n    }\n    \n    function computeProgramFit(candidate, materialGroup) {\n      var attachments = candidate.attachments || {};\n      var catalog = attachments.catalogContext || {};\n      var materialContext = attachments.materialContext || {};\n      var series = toNullableString(catalog.series);\n      var isoGroups = (materialContext.isoGroups && materialContext.isoGroups.codes) || [];\n      var seriesUpper = series ? series.toUpperCase() : null;\n    \n      if (isoGroups.length > 0 && isoGroups.indexOf(materialGroup) >= 0) return 1;\n      if (seriesUpper) {\n        if (seriesUpper.indexOf(\"INOX\") >= 0 && (materialGroup === \"M\" || materialGroup === \"S\")) return 0.95;\n        if (seriesUpper.indexOf(\"UNI\") >= 0) return 0.8;\n        if (seriesUpper.indexOf(\"TYPE G\") >= 0 && (materialGroup === \"K\" || materialGroup === \"N\")) return 0.95;\n        if (seriesUpper.indexOf(\"THROUGH\") >= 0) return 0.75;\n      }\n      return isoGroups.length > 0 ? 0.45 : 0.55;\n    }\n    \n    function computeToleranceMatch(candidate, requestedTolerance) {\n      var candidateTolerance = normalizeTolerance(candidate.threading.tapTolerance);\n      var request = normalizeTolerance(requestedTolerance);\n      if (!request && candidateTolerance) return 0.72;\n      if (!request || !candidateTolerance) return 0.45;\n      if (request === candidateTolerance) return 1;\n      if (request.replace(/\\+/g, \"\") === candidateTolerance.replace(/\\+/g, \"\")) return 0.8;\n      return 0.18;\n    }\n    \n    function computeLengthMetrics(candidate, requiredLengthMm) {\n      var apmx = toNullableNumber(candidate.common.apmxMm);\n      var usable = toNullableNumber(candidate.common.usableLengthMm);\n      var apmxMargin = apmx != null && requiredLengthMm != null ? apmx - requiredLengthMm : null;\n      var usableMargin = usable != null && requiredLengthMm != null ? usable - requiredLengthMm : null;\n      var minMargin = firstNonNull([usableMargin, apmxMargin]);\n      var fitScore = 0.55;\n    \n      if (requiredLengthMm == null) {\n        fitScore = 0.4;\n      } else if (usableMargin != null || apmxMargin != null) {\n        if ((usableMargin != null && usableMargin < 0) || (apmxMargin != null && apmxMargin < 0)) {\n          fitScore = 0;\n        } else if (minMargin != null && minMargin >= requiredLengthMm * 0.3) {\n          fitScore = 1;\n        } else if (minMargin != null && minMargin >= requiredLengthMm * 0.1) {\n          fitScore = 0.84;\n        } else if (minMargin != null && minMargin >= 0) {\n          fitScore = 0.66;\n        }\n      }\n    \n      return {\n        apmxMm: apmx,\n        usableLengthMm: usable,\n        apmxMarginMm: apmxMargin,\n        usableMarginMm: usableMargin,\n        fitScore: fitScore,\n      };\n    }\n    \n    function computePredrillMetrics(candidate, derived) {\n      var recommended = toNullableNumber(candidate.drilling.preDrillDiameterMm);\n      var actual = derived.actualPredrillMm;\n      var delta = actual != null && recommended != null ? actual - recommended : null;\n      var status = derived.coreHoleRoute;\n      var fitScore = 0.42;\n    \n      if (status === \"recommend\") {\n        fitScore = recommended != null ? 0.9 : 0.35;\n      } else if (status === \"fixed_unknown\") {\n        fitScore = recommended != null ? 0.7 : 0.3;\n      } else if (status === \"actual_known\") {\n        if (recommended == null || actual == null) {\n          fitScore = 0.2;\n        } else if (Math.abs(delta) <= 0.03) {\n          fitScore = 1;\n        } else if (Math.abs(delta) <= 0.08) {\n          fitScore = 0.8;\n        } else if (Math.abs(delta) <= 0.15) {\n          fitScore = 0.5;\n        } else {\n          fitScore = 0.1;\n        }\n      } else if (status === \"missing\") {\n        fitScore = 0;\n      }\n    \n      return {\n        recommendedMm: recommended,\n        actualMm: actual,\n        deltaMm: delta,\n        fitScore: fitScore,\n      };\n    }\n    \n    function computeCoolantFit(candidate, derived, rowCoolantMode) {\n      var mode = derived.coolant;\n      var score = mode.quality;\n      if (mode.normalized === \"through\" && candidate.common.coolantTsc === true) score += 0.12;\n      if (mode.normalized === \"through\" && candidate.common.coolantTsc === false) score -= 0.18;\n      if (mode.normalized === \"dry\" && (derived.materialGroup === \"M\" || derived.materialGroup === \"S\" || derived.materialGroup === \"H\")) score -= 0.18;\n      if (rowCoolantMode && mode.normalized && rowCoolantMode === mode.normalized) score += 0.08;\n      return clamp01(score);\n    }\n    \n    function computePriorityBias(priority, metrics) {\n      switch (toNullableString(priority)) {\n        case \"process_security\":\n          return clamp01((metrics.geometrySuitability + metrics.machineFit + metrics.lengthFit) / 3);\n        case \"thread_quality\":\n          return clamp01((metrics.toleranceFit + metrics.predrillFit + metrics.machineFit) / 3);\n        case \"tool_life\":\n          return clamp01((metrics.coolantFit + (1 - metrics.loadRiskWeight) + metrics.geometrySuitability) / 3);\n        case \"productivity\":\n          return metrics.recipeSource === \"none\" ? 0.45 : 0.72;\n        default:\n          return 0.55;\n      }\n    }\n    \n    function computeLoadProfile(derived, candidate, predrillMetrics, geometrySuitability) {\n      var kc = KIENZLE_BY_GROUP[derived.materialGroup] || 1300;\n      var diameter = derived.nominalDiameterMm || toNullableNumber(candidate.common.diameterMm);\n      var pitchMm = derived.pitchMm;\n      var predrill = predrillMetrics.recommendedMm;\n      var spanSection = null;\n      var loadIndex = null;\n      var loadClass = \"medium\";\n      if (diameter != null && pitchMm != null && predrill != null) {\n        spanSection = ((diameter - predrill) / 4) * pitchMm;\n        loadIndex = kc * Math.max(spanSection, 0.01);\n        if (derived.threadDepthRatio != null) loadIndex = loadIndex * (1 + Math.max(0, derived.threadDepthRatio - 1) * 0.25);\n        loadIndex = loadIndex * (1 + derived.exitRisk.weight * 0.15);\n        loadIndex = loadIndex * (1 + (1 - geometrySuitability) * 0.25);\n        if (loadIndex >= 1200) loadClass = \"high\";\n        else if (loadIndex <= 700) loadClass = \"low\";\n      } else {\n        loadClass = derived.materialGroup === \"N\" ? \"low\" : (derived.materialGroup === \"H\" || derived.materialGroup === \"S\" ? \"high\" : \"medium\");\n      }\n      return {\n        kienzleKc: kc,\n        spanSection: spanSection,\n        loadIndex: loadIndex != null ? roundValue(loadIndex, 0) : null,\n        loadClass: loadClass,\n        loadRiskWeight: loadClass === \"high\" ? 0.85 : loadClass === \"medium\" ? 0.45 : 0.18,\n      };\n    }\n    \n    function computeRpmWindow(recipe, nominalDiameterMm) {\n      function rpmFromVc(vc) {\n        if (vc == null || nominalDiameterMm == null || nominalDiameterMm <= 0) return null;\n        return (1000 * vc) / (Math.PI * nominalDiameterMm);\n      }\n      return {\n        min: roundValue(rpmFromVc(recipe && recipe.vc && recipe.vc.min), 0),\n        typ: roundValue(rpmFromVc(recipe && recipe.vc && recipe.vc.typ), 0),\n        max: roundValue(rpmFromVc(recipe && recipe.vc && recipe.vc.max), 0),\n      };\n    }\n    \n    function computeFeedWindow(rpmWindow, pitchMm) {\n      function feedFromRpm(rpm) {\n        return rpm != null && pitchMm != null ? rpm * pitchMm : null;\n      }\n      return {\n        min: roundValue(feedFromRpm(rpmWindow.min), 0),\n        typ: roundValue(feedFromRpm(rpmWindow.typ), 0),\n        max: roundValue(feedFromRpm(rpmWindow.max), 0),\n      };\n    }\n    \n    function buildDerived(ctx) {\n      var toleranceOverride = normalizeTolerance(getAnswer(ctx, \"thread_tolerance\"));\n      var simpleThread = buildAutoThreadDesignation(\n        getAnswer(ctx, \"thread_standard_choice\"),\n        getAnswer(ctx, \"thread_nominal_size\"),\n        toleranceOverride\n      );\n      var designationOverride = toNullableString(getAnswer(ctx, \"thread_designation_override\"));\n      var fallbackDesignation = toNullableString(getAnswer(ctx, \"thread_designation\"));\n      var canonicalDesignation = designationOverride || simpleThread.designation || fallbackDesignation;\n      var parsed = parseThreadIdentity(\n        canonicalDesignation,\n        toleranceOverride,\n        designationOverride ? null : (simpleThread.standard || getAnswer(ctx, \"thread_standard_choice\"))\n      );\n      var threadLengthMm = toNullableNumber(getAnswer(ctx, \"thread_length_mm\"));\n      var actualPredrillMm = toNullableNumber(getAnswer(ctx, \"actual_predrill_diameter_mm\"));\n      var materialCode = ctx.material && ctx.material.subgroupCode;\n      var materialGroup = getMaterialGroup(materialCode);\n      var exitRisk = mapExitRisk(getAnswer(ctx, \"exit_condition\"));\n      var coolant = mapCoolantModeAnswer(getAnswer(ctx, \"coolant_lubrication_mode\"));\n      var machineMode = mapSyncMode(getAnswer(ctx, \"sync_tapping_capability\"));\n      var coreHoleRoute = normalizeCoreHoleRoute(getAnswer(ctx, \"core_hole_status\"));\n      var nominalDiameterMm = parsed.nominalDiameterMm;\n      var threadDepthRatio = nominalDiameterMm && threadLengthMm ? threadLengthMm / nominalDiameterMm : null;\n      return {\n        parsed: parsed,\n        canonicalDesignation: canonicalDesignation,\n        simpleThread: simpleThread,\n        materialCode: materialCode,\n        materialGroup: materialGroup,\n        threadLengthMm: threadLengthMm,\n        nominalDiameterMm: nominalDiameterMm,\n        pitchMm: parsed.pitchMm,\n        pitchLabel: parsed.pitch || (parsed.pitchMm != null ? String(parsed.pitchMm) : null),\n        threadTolerance: toleranceOverride || parsed.tolerance,\n        exitRisk: exitRisk,\n        coolant: coolant,\n        machineMode: machineMode,\n        coreHoleRoute: coreHoleRoute,\n        actualPredrillMm: actualPredrillMm,\n        threadDepthRatio: threadDepthRatio,\n        recommendedChamferClass: deriveRecommendedChamfer(materialGroup, exitRisk.code, threadDepthRatio),\n        holderType: toNullableString(getAnswer(ctx, \"holder_type\")),\n        materialCondition: toNullableString(getAnswer(ctx, \"material_condition\")),\n        qualitySensitivity: toNullableString(getAnswer(ctx, \"quality_sensitivity\")),\n        problemHistory: toNullableString(getAnswer(ctx, \"problem_history\")),\n        priority: toNullableString(getAnswer(ctx, \"priority\")),\n        sealingRelevant: toNullableString(getAnswer(ctx, \"sealing_relevant\")) === \"yes\",\n      };\n    }\n    \n    function buildReasons(metrics, scoreParts) {\n      var reasons = [];\n      if (scoreParts.threadIdentity >= 2.5) reasons.push(\"Thread form and size match exactly.\");\n      if (metrics.geometrySuitability >= 0.85) reasons.push(\"Tap geometry suits the material and through-hole chip flow.\");\n      if (metrics.predrillFit >= 0.8) reasons.push(\"Pre-drill guidance aligns well with the requested setup.\");\n      if (metrics.lengthFit >= 0.8) reasons.push(\"Length window covers the required full thread safely.\");\n      if (metrics.coolantFit >= 0.8) reasons.push(\"Coolant or lubrication supports the tapping window.\");\n      if (metrics.machineFit >= 0.85) reasons.push(\"Machine synchronization supports stable tapping.\");\n      if (metrics.programFit >= 0.85) reasons.push(\"Series and material program fit the selected ISO subgroup.\");\n      if (metrics.loadClass === \"high\") reasons.push(\"Expect a higher tapping load window for this setup.\");\n      return reasons.slice(0, 5);\n    }\n    \n    function derive(ctx) {\n      var derived = buildDerived(ctx);\n      return {\n        thread_designation: derived.canonicalDesignation,\n        thread_standard: derived.parsed.standard,\n        thread_size: derived.parsed.size,\n        pitch: derived.parsed.pitch,\n        pitch_mm: derived.parsed.pitchMm,\n        pipe_flag: derived.parsed.pipeFlag,\n        thread_tolerance_target: derived.threadTolerance,\n        requested_thread_nominal_mm: derived.nominalDiameterMm,\n        required_full_thread_length_mm: derived.threadLengthMm,\n        required_depth_ratio: derived.threadDepthRatio != null ? roundValue(derived.threadDepthRatio, 2) : null,\n        machine_mode_class: derived.machineMode.label,\n        coolant_mode_normalized: derived.coolant.normalized,\n        exit_risk_class: derived.exitRisk.code,\n        predrill_validation_route: derived.coreHoleRoute,\n        recommended_chamfer_class: derived.recommendedChamferClass,\n      };\n    }\n    \n    function validate(ctx) {\n      var issues = [];\n      var derived = buildDerived(ctx);\n      var selectedStandard = toNullableString(getAnswer(ctx, \"thread_standard_choice\"));\n      var selectedSize = toNullableString(getAnswer(ctx, \"thread_nominal_size\"));\n    \n      if (selectedStandard && selectedSize && !derived.simpleThread.supported && !toNullableString(getAnswer(ctx, \"thread_designation_override\"))) {\n        issues.push({\n          field: \"thread_nominal_size\",\n          message: \"This nominal size is not yet available for automatic pitch derivation. Use the custom designation override for this thread.\",\n          severity: \"error\",\n          code: \"thread_size_not_supported\",\n        });\n      } else if (!derived.parsed.valid) {\n        issues.push({\n          field: selectedStandard ? \"thread_nominal_size\" : \"thread_designation_override\",\n          message: \"Enter a supported thread type and nominal size, or use a parseable custom designation such as M10x1.5-6H or 1/4-20UNC-2B.\",\n          severity: \"error\",\n          code: \"thread_designation_invalid\",\n        });\n      }\n      if (derived.machineMode.score <= 0) {\n        issues.push({\n          field: \"sync_tapping_capability\",\n          message: \"Through-hole tapping requires rigid tapping or a synchro chuck.\",\n          severity: \"error\",\n          code: \"sync_required\",\n        });\n      } else if (toNullableString(getAnswer(ctx, \"sync_tapping_capability\")) === \"unknown\") {\n        issues.push({\n          field: \"sync_tapping_capability\",\n          message: \"Machine synchronization is unclear. Verify rigid tapping or a synchro chuck before release.\",\n          severity: \"warning\",\n          code: \"sync_unknown\",\n        });\n      }\n      if (derived.coreHoleRoute === \"missing\") {\n        issues.push({\n          field: \"core_hole_status\",\n          message: \"Prepare the core hole first or switch to a recommendation route before tapping through.\",\n          severity: \"error\",\n          code: \"core_hole_missing\",\n        });\n      }\n      if (derived.threadDepthRatio != null && derived.threadDepthRatio > 1.5) {\n        issues.push({\n          field: \"thread_length_mm\",\n          message: \"Required full thread length is above 1.5 x D. Expect a tighter tapping window and stronger length checks.\",\n          severity: \"warning\",\n          code: \"thread_depth_ratio_high\",\n        });\n      }\n      if (derived.coolant.normalized === \"dry\" && (derived.materialGroup === \"M\" || derived.materialGroup === \"S\" || derived.materialGroup === \"H\")) {\n        issues.push({\n          field: \"coolant_lubrication_mode\",\n          message: \"Dry tapping is a high-risk setup for this ISO subgroup. Re-check coolant or lubrication support.\",\n          severity: \"warning\",\n          code: \"coolant_risk_high\",\n        });\n      }\n      if (derived.exitRisk.code === \"high\") {\n        issues.push({\n          field: \"exit_condition\",\n          message: \"The exit condition is technically critical although the process is nominally through-hole.\",\n          severity: \"warning\",\n          code: \"exit_condition_critical\",\n        });\n      }\n      if (derived.sealingRelevant && !derived.parsed.pipeFlag) {\n        issues.push({\n          field: \"sealing_relevant\",\n          message: \"Sealing relevance is set, but the current designation is not a pipe-thread style.\",\n          severity: \"warning\",\n          code: \"sealing_non_pipe\",\n        });\n      }\n      if (derived.materialGroup === \"H\") {\n        issues.push({\n          field: null,\n          message: \"No normal H-group through-tap inventory is expected in the current shop data. Expect conservative results or an alternative-process hint.\",\n          severity: \"warning\",\n          code: \"hard_material_boundary\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"tapping_through\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var threadingTools = toolkits.threading;\n      var derived = buildDerived(ctx);\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var rows = threadingTools.resolveRows(candidate, ctx);\n        var recipeResult = threadingTools.resolveRecipe(candidate, ctx);\n        var recipeRow = recipeResult.row || null;\n        var candidateThread = parseThreadIdentity(candidate.threading.threadSize, candidate.threading.tapTolerance, candidate.threading.threadForm);\n        var requestedSize = derived.parsed.size;\n        var requestedForm = normalizeThreadForm(derived.parsed.standard);\n        var candidateSize = candidateThread.size;\n        var candidateForm = normalizeThreadForm(candidate.threading.threadForm || candidateThread.standard);\n        var rowCoolantMode = recipeRow && recipeRow.constraints ? recipeRow.constraints.coolantMode : null;\n        var rowProcessId = recipeRow && recipeRow.constraints && recipeRow.constraints.processIds && recipeRow.constraints.processIds[0]\n          ? recipeRow.constraints.processIds[0]\n          : null;\n        var rowProcessHandle = recipeRow && recipeRow.trace ? recipeRow.trace.sourceProcessHandleRaw : null;\n        var lengthMetrics = computeLengthMetrics(candidate, derived.threadLengthMm);\n        var predrillMetrics = computePredrillMetrics(candidate, derived);\n        var geometrySuitability = computeGeometrySuitability(candidate, derived);\n        var toleranceFit = computeToleranceMatch(candidate, derived.threadTolerance);\n        var programFit = computeProgramFit(candidate, derived.materialGroup);\n        var coolantFit = computeCoolantFit(candidate, derived, rowCoolantMode);\n        var loadProfile = computeLoadProfile(derived, candidate, predrillMetrics, geometrySuitability);\n        var holderBoost = toNullableString(derived.holderType) === \"synchro_chuck\" ? 1 : derived.machineMode.score;\n        var machineFit = clamp01((derived.machineMode.score + holderBoost) / 2);\n        var recipe = recipeResult.recipe;\n        var hardRejectReason = null;\n        var threadIdentityFit;\n        var priorityBias;\n        var riskPenalty;\n        var parts;\n        var total;\n        var confidence;\n        var rpmWindow;\n        var feedWindow;\n        var metrics;\n    \n        if (requestedSize && candidateSize && requestedSize !== candidateSize) {\n          hardRejectReason = \"Candidate thread size does not match the requested thread designation.\";\n        }\n        if (!hardRejectReason && requestedForm && candidateForm && requestedForm !== candidateForm) {\n          hardRejectReason = \"Candidate thread form does not match the requested thread standard.\";\n        }\n        if (!hardRejectReason && derived.machineMode.score <= 0) {\n          hardRejectReason = \"Through-hole tapping requires rigid tapping or a synchro chuck.\";\n        }\n        if (!hardRejectReason && derived.coreHoleRoute === \"missing\") {\n          hardRejectReason = \"A prepared core hole is required before tapping through.\";\n        }\n        if (!hardRejectReason && derived.threadLengthMm != null) {\n          if (lengthMetrics.apmxMarginMm != null && lengthMetrics.apmxMarginMm < 0) {\n            hardRejectReason = \"APMX is below the required full thread length.\";\n          } else if (lengthMetrics.usableMarginMm != null && lengthMetrics.usableMarginMm < 0) {\n            hardRejectReason = \"Usable thread length is below the required full thread length.\";\n          }\n        }\n        if (!hardRejectReason && derived.materialCode && candidate.classification.materialSubgroupCodes.length > 0 && kernel.materialFit(candidate, ctx) <= 0) {\n          hardRejectReason = \"Candidate material subgroup fit does not cover the selected ISO subgroup.\";\n        }\n    \n        threadIdentityFit = requestedSize && candidateSize && requestedSize === candidateSize ? 2.6 : 0.4;\n        if (!requestedSize || !candidateSize) threadIdentityFit = 1.1;\n    \n        priorityBias = computePriorityBias(derived.priority, {\n          geometrySuitability: geometrySuitability,\n          machineFit: machineFit,\n          lengthFit: lengthMetrics.fitScore,\n          toleranceFit: toleranceFit,\n          predrillFit: predrillMetrics.fitScore,\n          coolantFit: coolantFit,\n          loadRiskWeight: loadProfile.loadRiskWeight,\n          recipeSource: recipeResult.source,\n        });\n    \n        riskPenalty = clamp01(\n          (kernel.risk(candidate, ctx) || 0) +\n          derived.exitRisk.weight * 0.45 +\n          loadProfile.loadRiskWeight * 0.35 +\n          (derived.machineMode.stable ? 0 : 0.2) +\n          (predrillMetrics.fitScore < 0.3 ? 0.12 : 0) +\n          (derived.materialGroup === \"H\" ? 0.25 : 0)\n        );\n    \n        if (recipeResult.source !== \"none\" && derived.pitchMm != null) {\n          recipe = createRecipe({\n            vc: recipeResult.recipe && recipeResult.recipe.vc,\n            fn: { min: derived.pitchMm, typ: derived.pitchMm, max: derived.pitchMm },\n          });\n        }\n    \n        rpmWindow = computeRpmWindow(recipe, derived.nominalDiameterMm);\n        feedWindow = computeFeedWindow(rpmWindow, derived.pitchMm);\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.25,\n          process: kernel.processFit(candidate, ctx),\n          threadIdentity: threadIdentityFit,\n          toleranceFit: toleranceFit * 0.95,\n          geometryFit: geometrySuitability * 1.35,\n          lengthWindow: lengthMetrics.fitScore * 1.1,\n          predrillFit: predrillMetrics.fitScore * 1.15,\n          coolantFit: coolantFit * 0.95,\n          machineFit: machineFit * 1.05,\n          programFit: programFit * 0.7,\n          rowMatch: recipeRow || rows.length > 0 ? 0.45 : 0.15,\n          priorityBias: priorityBias * 0.35,\n          riskPenalty: -riskPenalty,\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.95 : recipeResult.source === \"near\" ? 0.86 : 0.72;\n        if (predrillMetrics.recommendedMm == null) confidence -= 0.08;\n        if (lengthMetrics.apmxMm == null && lengthMetrics.usableLengthMm == null) confidence -= 0.08;\n        if (derived.materialGroup === \"H\") confidence -= 0.1;\n        if (hardRejectReason) confidence = 0;\n        confidence = clamp01(confidence);\n    \n        metrics = Object.assign({}, threadingTools.getSharedMetrics(candidate, ctx), {\n          requestedThreadIdentity: derived.parsed.canonicalLabel,\n          requestedThreadSize: requestedSize,\n          requestedThreadForm: requestedForm,\n          requestedPitchMm: derived.pitchMm,\n          materialGroup: derived.materialGroup,\n          threadLengthMm: derived.threadLengthMm,\n          threadDepthRatio: derived.threadDepthRatio != null ? roundValue(derived.threadDepthRatio, 2) : null,\n          predrillValidationRoute: derived.coreHoleRoute,\n          requestedTolerance: derived.threadTolerance,\n          nominalThreadDiameterMm: derived.nominalDiameterMm,\n          requiredFullThreadLengthMm: derived.threadLengthMm,\n          requiredDepthRatio: derived.threadDepthRatio != null ? roundValue(derived.threadDepthRatio, 2) : null,\n          recommendedChamferClass: derived.recommendedChamferClass,\n          exitRiskClass: derived.exitRisk.code,\n          exitRiskLabel: derived.exitRisk.label,\n          machineMode: derived.machineMode.label,\n          coolantMode: derived.coolant.label,\n          materialCondition: derived.materialCondition,\n          qualitySensitivity: derived.qualitySensitivity,\n          problemHistory: derived.problemHistory,\n          holderType: derived.holderType,\n          candidateThreadForm: candidateForm,\n          candidateThreadSize: candidateSize,\n          candidateTolerance: normalizeTolerance(candidate.threading.tapTolerance),\n          tapChamferForm: normalizeTolerance(candidate.threading.tapChamferForm),\n          tapHelixDeg: toNullableNumber(candidate.threading.tapHelixDeg),\n          predrillRecommendedMm: predrillMetrics.recommendedMm,\n          predrillActualMm: predrillMetrics.actualMm,\n          predrillDeltaMm: predrillMetrics.deltaMm != null ? roundValue(predrillMetrics.deltaMm, 3) : null,\n          apmxMm: lengthMetrics.apmxMm,\n          usableLengthMm: lengthMetrics.usableLengthMm,\n          apmxMarginMm: lengthMetrics.apmxMarginMm != null ? roundValue(lengthMetrics.apmxMarginMm, 2) : null,\n          usableLengthMarginMm: lengthMetrics.usableMarginMm != null ? roundValue(lengthMetrics.usableMarginMm, 2) : null,\n          geometrySuitability: geometrySuitability,\n          coolantFit: coolantFit,\n          machineFit: machineFit,\n          lengthFit: lengthMetrics.fitScore,\n          predrillFit: predrillMetrics.fitScore,\n          toleranceFit: toleranceFit,\n          programFit: programFit,\n          kienzleKc: loadProfile.kienzleKc,\n          loadIndex: loadProfile.loadIndex,\n          loadClass: loadProfile.loadClass,\n          recipeSource: recipeResult.source,\n          recipeRowId: recipeRow && recipeRow.rowId || null,\n          recipeOperationId: rowProcessId,\n          recipeOperationHandle: rowProcessHandle,\n          rowCoolantMode: rowCoolantMode,\n          recipeVcMin: recipe && recipe.vc ? recipe.vc.min : null,\n          recipeVcTyp: recipe && recipe.vc ? recipe.vc.typ : null,\n          recipeVcMax: recipe && recipe.vc ? recipe.vc.max : null,\n          rpmMin: rpmWindow.min,\n          rpmTyp: rpmWindow.typ,\n          rpmMax: rpmWindow.max,\n          feedMinMmMin: feedWindow.min,\n          feedTypMmMin: feedWindow.typ,\n          feedMaxMmMin: feedWindow.max,\n          alternativeProcessFlag:\n            derived.materialGroup === \"H\" ||\n            (derived.materialGroup === \"S\" && loadProfile.loadClass === \"high\") ||\n            derived.exitRisk.code === \"high\" ||\n            (derived.machineMode.stable === false && derived.materialGroup !== \"P\"),\n          series: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.series),\n          substrate: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.substrate),\n          coating: toNullableString(candidate.attachments && candidate.attachments.catalogContext && candidate.attachments.catalogContext.coating),\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: buildReasons(metrics, parts),\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/thread-milling/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/thread-milling/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/thread-milling/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/thread-milling/presenter.js\");\n    exports.default = createStubProcessModule(\"thread_milling\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/thread-milling/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, fitKpis, geometryFit, heroRecommendation, machineFeasibility, recipeStartValues, riskNotes, threadIdentity, toleranceNotes } = __bundle.require(\"core/result-blocks.js\");\n    var { getAnswer } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function geometryStatus(score) {\n      if (score >= 0.8) return \"fit\";\n      if (score >= 0.55) return \"near\";\n      return \"mismatch\";\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate = top.candidate;\n      var riskItems = [];\n      var machineChecks = [];\n      var parsedPitch = getAnswer(ctx, \"pitch\");\n      var toleranceLevel = getAnswer(ctx, \"tolerance_level\");\n      var camCapability = getAnswer(ctx, \"cam_capability\");\n      var interpolationCapability = getAnswer(ctx, \"interpolation_capability\");\n      var blindThrough = getAnswer(ctx, \"blind_through\");\n      var entryStrategy = getAnswer(ctx, \"entry_strategy\");\n    \n      if (blindThrough === \"blind\" && entryStrategy === \"direct\") {\n        riskItems.push({ severity: \"warning\", title: \"Entry strategy\", message: \"Direct entry tightens the process window for blind thread milling.\" });\n      }\n      if ((toleranceLevel === \"tight\" || toleranceLevel === \"high_precision\") && camCapability === \"basic\") {\n        riskItems.push({ severity: \"warning\", title: \"CAM precision\", message: \"Basic CAM may limit path quality for the requested tolerance level.\" });\n      }\n      if (getAnswer(ctx, \"reason_for_thread_milling\") === \"tap_failure_recovery\") {\n        riskItems.push({ severity: \"info\", title: \"Recovery mode\", message: \"Thread milling is being used as a controlled recovery path after tapping issues.\" });\n      }\n    \n      machineChecks.push({\n        key: \"interpolation\",\n        label: \"Interpolation capability\",\n        result: interpolationCapability === \"yes\" ? \"pass\" : \"fail\",\n        note: interpolationCapability === \"yes\" ? null : \"Interpolation is required.\",\n      });\n      machineChecks.push({\n        key: \"cam\",\n        label: \"CAM capability\",\n        result: camCapability === \"advanced\" ? \"pass\" : camCapability === \"basic\" ? \"limited\" : \"fail\",\n        note: camCapability === \"basic\" ? \"Basic CAM limits path quality for tighter threads.\" : null,\n      });\n    \n      return createResultViewModel({\n        processId: \"thread_milling\",\n        outcome: top.score.total >= 4 ? \"match\" : \"limited_match\",\n        summary: \"Best thread-milling match based on thread identity, path readiness and reach.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroRecommendation({\n            variantId: candidate.ids.variantId,\n            productTitle: candidate.catalog.productTitle,\n            variantTitle: candidate.catalog.variantTitle,\n            sku: candidate.ids.sku,\n            imageUrl: candidate.catalog.imageUrl,\n            fitScore: top.score.total,\n            confidence: top.score.confidence,\n            reasons: top.score.reasons.slice(0, 3),\n          }),\n          threadIdentity({\n            standard: getAnswer(ctx, \"thread_standard\"),\n            size: getAnswer(ctx, \"thread_size\"),\n            pitch: parsedPitch ? String(parsedPitch) : null,\n            tolerance: getAnswer(ctx, \"tolerance_level\"),\n            blindThrough: blindThrough,\n          }),\n          geometryFit([\n            {\n              key: \"tool_diameter\",\n              label: \"Tool diameter\",\n              actual: top.metrics.toolDiameterMm != null ? String(top.metrics.toolDiameterMm) + \" mm\" : null,\n              target: top.metrics.nominalMajorDiameterMm != null ? \"< \" + String(top.metrics.nominalMajorDiameterMm) + \" mm\" : null,\n              result: geometryStatus((top.score.parts.accuracy || 0) / 2.5),\n            },\n            {\n              key: \"reach\",\n              label: \"Reach\",\n              actual: candidate.common.usableLengthMm != null ? String(candidate.common.usableLengthMm) + \" mm\" : null,\n              target: top.metrics.threadDepthMm != null ? String(top.metrics.threadDepthMm) + \" mm\" : null,\n              result: geometryStatus(top.metrics.reachFit || 0),\n            },\n            {\n              key: \"entry_strategy\",\n              label: \"Entry strategy\",\n              actual: entryStrategy,\n              target: blindThrough === \"blind\" ? \"helical or pre_drilled\" : \"helical or pre_drilled\",\n              result: geometryStatus(top.score.parts.blindThroughFit || 0),\n            },\n          ]),\n          fitKpis([\n            { key: \"accuracy\", label: \"Accuracy bias\", value: (top.score.parts.accuracy || 0).toFixed(2), status: (top.score.parts.accuracy || 0) >= 1.8 ? \"good\" : \"ok\" },\n            { key: \"cam\", label: \"Path readiness\", value: (top.score.parts.camReadiness || 0).toFixed(2), status: (top.score.parts.camReadiness || 0) >= 0.8 ? \"good\" : \"weak\" },\n            { key: \"reach\", label: \"Reach\", value: (top.score.parts.reach || 0).toFixed(2), status: (top.score.parts.reach || 0) >= 0.8 ? \"good\" : \"weak\" },\n            { key: \"confidence\", label: \"Confidence\", value: top.score.confidence.toFixed(2), status: top.score.confidence >= 0.75 ? \"good\" : \"ok\" },\n          ]),\n          toleranceNotes([\n            \"Tolerance level: \" + String(toleranceLevel || \"not specified\"),\n            \"Path mode: \" + String(getAnswer(ctx, \"thread_path_mode\") || \"not specified\"),\n          ]),\n          recipeStartValues({\n            source: top.score.recipeConfidence,\n            values: [\n              { key: \"vc\", label: \"vc\", min: top.recipe && top.recipe.vc.min, typ: top.recipe && top.recipe.vc.typ, max: top.recipe && top.recipe.vc.max, unit: \"m/min\" },\n              { key: \"ap\", label: \"ap\", min: top.recipe && top.recipe.ap.min, typ: top.recipe && top.recipe.ap.typ, max: top.recipe && top.recipe.ap.max, unit: \"mm\" },\n              { key: \"aePct\", label: \"ae%\", min: top.recipe && top.recipe.aePct.min, typ: top.recipe && top.recipe.aePct.typ, max: top.recipe && top.recipe.aePct.max, unit: \"%\" },\n            ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n          }),\n          riskNotes(riskItems),\n          machineFeasibility(machineChecks),\n          alternatives(scored.slice(1, 4).map(function mapAlternative(item) {\n            return {\n              variantId: item.candidate.ids.variantId,\n              label: item.candidate.catalog.productTitle,\n              score: item.score.total,\n              reason: item.score.reasons[0] || \"Alternative thread mill\",\n              suitable: item.score.eligible === true,\n              productTitle: item.candidate.catalog.productTitle,\n              systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n                ? item.candidate.attachments.systemContext.bodyVariantId\n                : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n              imageUrl: item.candidate.catalog.imageUrl,\n              productUrl: item.candidate.catalog.url,\n              available: item.candidate.commerce.available,\n              priceLabel: item.candidate.commerce.priceCents != null ? String(item.candidate.commerce.priceCents / 100) : null,\n              ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n            };\n          })),\n          commerceCta({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: candidate.commerce.priceCents != null ? String(candidate.commerce.priceCents / 100) : null,\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }),\n        ],\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust thread-milling data\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/thread-milling/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"thread_milling\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/thread-milling/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, createRecipe, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { parseThreadDesignation } = __bundle.require(\"family-toolkits/threading-tools.js\");\n    function tokenScore(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function parseMajorDiameter(parsed) {\n      var match = parsed && parsed.threadSize && String(parsed.threadSize).match(/([0-9]+(?:[.,][0-9]+)?)/);\n      return match ? toNullableNumber(match[1]) : null;\n    }\n    \n    function getBlindThroughFit(blindThrough, entryStrategy) {\n      if (blindThrough === \"blind\") {\n        return tokenScore(entryStrategy, { helical: 1, pre_drilled: 0.85, ramp: 0.7, direct: 0.35 }, 0.5);\n      }\n      return tokenScore(entryStrategy, { helical: 1, pre_drilled: 1, ramp: 0.8, direct: 0.65 }, 0.5);\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"thread_milling\", ctx, toolkits));\n      var parsed = parseThreadDesignation(getAnswer(ctx, \"thread_designation\"));\n      var blindThrough = getAnswer(ctx, \"blind_through\");\n      var entryStrategy = getAnswer(ctx, \"entry_strategy\");\n      var nominalMajor = parseMajorDiameter(parsed);\n      var threadDepth = toNullableNumber(getAnswer(ctx, \"thread_depth_mm\"));\n    \n      derived.thread_path_mode = blindThrough === \"blind\"\n        ? (entryStrategy === \"helical\" ? \"helical_blind\" : entryStrategy === \"pre_drilled\" ? \"pre_drilled_blind\" : \"blind_restricted\")\n        : (entryStrategy === \"pre_drilled\" ? \"pre_drilled_through\" : entryStrategy === \"helical\" ? \"helical_through\" : \"through_standard\");\n      derived.interpolation_ready = getAnswer(ctx, \"interpolation_capability\") === \"yes\" && getAnswer(ctx, \"cam_capability\") !== \"none\";\n      if (nominalMajor != null && threadDepth != null && nominalMajor > 0) {\n        derived.thread_depth_ratio = threadDepth / nominalMajor;\n      }\n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"thread_milling\", ctx);\n      var blindThrough = getAnswer(ctx, \"blind_through\");\n      var entryStrategy = getAnswer(ctx, \"entry_strategy\");\n      var camCapability = getAnswer(ctx, \"cam_capability\");\n      var toleranceLevel = getAnswer(ctx, \"tolerance_level\");\n    \n      if (getAnswer(ctx, \"core_hole_status\") === \"missing\") {\n        issues.push({\n          field: \"core_hole_status\",\n          message: \"A prepared core hole is required before thread milling.\",\n          severity: \"error\",\n          code: \"thread_milling_core_hole_missing\",\n        });\n      }\n      if (getAnswer(ctx, \"interpolation_capability\") !== \"yes\") {\n        issues.push({\n          field: \"interpolation_capability\",\n          message: \"Thread milling requires interpolation capability.\",\n          severity: \"error\",\n          code: \"thread_milling_interpolation_required\",\n        });\n      }\n      if (camCapability === \"none\") {\n        issues.push({\n          field: \"cam_capability\",\n          message: \"Thread milling requires CAM support for the path.\",\n          severity: \"error\",\n          code: \"thread_milling_cam_required\",\n        });\n      }\n      if (blindThrough === \"blind\" && entryStrategy === \"direct\") {\n        issues.push({\n          field: \"entry_strategy\",\n          message: \"Direct entry is risky for blind thread milling.\",\n          severity: \"warning\",\n          code: \"thread_milling_blind_direct_entry\",\n        });\n      }\n      if ((toleranceLevel === \"tight\" || toleranceLevel === \"high_precision\") && camCapability === \"basic\") {\n        issues.push({\n          field: \"cam_capability\",\n          message: \"Basic CAM narrows the quality window for tight thread-milling tolerances.\",\n          severity: \"warning\",\n          code: \"thread_milling_cam_tolerance_limit\",\n        });\n      }\n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"thread_milling\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var threadingTools = toolkits.threading;\n      var millingTools = toolkits.milling;\n      var parsed = parseThreadDesignation(getAnswer(ctx, \"thread_designation\"));\n      var nominalMajor = parseMajorDiameter(parsed);\n      var blindThrough = getAnswer(ctx, \"blind_through\");\n      var threadDepth = toNullableNumber(getAnswer(ctx, \"thread_depth_mm\"));\n      var coreHoleStatus = getAnswer(ctx, \"core_hole_status\");\n      var interpolationCapability = getAnswer(ctx, \"interpolation_capability\");\n      var camCapability = getAnswer(ctx, \"cam_capability\");\n      var reasonForThreadMilling = getAnswer(ctx, \"reason_for_thread_milling\");\n      var toleranceLevel = getAnswer(ctx, \"tolerance_level\");\n      var entryStrategy = getAnswer(ctx, \"entry_strategy\");\n    \n      return (pool || []).map(function scoreCandidate(candidate) {\n        var threadRows = threadingTools.resolveRows(candidate, ctx);\n        var millingRows = millingTools.resolveRows(candidate, ctx);\n        var threadingRecipeResult = threadingTools.resolveRecipe(candidate, ctx);\n        var millingRecipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var threadFormMatch = candidate.threading.threadForm && parsed.threadStandard && candidate.threading.threadForm === parsed.threadStandard ? 1 : 0.4;\n        var exactThreadMatch = candidate.threading.threadSize && parsed.threadSize && candidate.threading.threadSize === parsed.threadSize ? 1 : 0;\n        var reachFit = threadDepth != null ? kernel.reachFit(candidate, threadDepth) : 0;\n        var camReadiness = tokenScore(camCapability, { advanced: 1, basic: 0.65, none: 0.1 }, 0.5);\n        var blindThroughFit = getBlindThroughFit(blindThrough, entryStrategy);\n        var flexibility = tokenScore(reasonForThreadMilling, { flexibility: 1, tap_failure_recovery: 1, quality: 0.8 }, 0.75);\n        var toleranceScore = tokenScore(toleranceLevel, {\n          general: 0.8,\n          tight: camCapability === \"advanced\" ? 0.95 : 0.65,\n          high_precision: camCapability === \"advanced\" ? 1 : 0.55,\n        }, 0.7);\n        var toolDiameterFit = nominalMajor != null && candidate.common.diameterMm != null\n          ? (candidate.common.diameterMm < nominalMajor ? Math.min(1, ((nominalMajor - candidate.common.diameterMm) / nominalMajor) + 0.35) : 0)\n          : 0.45;\n        var hardRejectReason = null;\n        var recipeResult = threadingRecipeResult.source !== \"none\" ? threadingRecipeResult : millingRecipeResult;\n        var recipe = recipeResult.recipe;\n        var parts;\n        var total;\n        var confidence;\n        var metrics;\n    \n        if (parsed.threadSize && candidate.threading.threadSize && candidate.threading.threadSize !== parsed.threadSize) {\n          hardRejectReason = \"Candidate thread size does not match the requested milled thread.\";\n        }\n        if (!hardRejectReason && parsed.threadStandard && candidate.threading.threadForm && candidate.threading.threadForm !== parsed.threadStandard) {\n          hardRejectReason = \"Candidate thread form does not match the requested thread standard.\";\n        }\n        if (!hardRejectReason && coreHoleStatus === \"missing\") {\n          hardRejectReason = \"A prepared core hole is required for thread milling.\";\n        }\n        if (!hardRejectReason && interpolationCapability !== \"yes\") {\n          hardRejectReason = \"Interpolation capability is required for thread milling.\";\n        }\n        if (!hardRejectReason && camCapability === \"none\") {\n          hardRejectReason = \"CAM support is required for thread milling.\";\n        }\n        if (!hardRejectReason && nominalMajor != null && candidate.common.diameterMm != null && candidate.common.diameterMm >= nominalMajor) {\n          hardRejectReason = \"Tool diameter is too large for the requested internal thread geometry.\";\n        }\n        if (!hardRejectReason && threadDepth != null && reachFit < 0.6) {\n          hardRejectReason = \"Usable length is too short for the requested thread depth.\";\n        }\n    \n        if (recipeResult.source !== \"none\") {\n          recipe = createRecipe({\n            vc: threadingRecipeResult.recipe && threadingRecipeResult.recipe.vc || millingRecipeResult.recipe && millingRecipeResult.recipe.vc,\n            ap: millingRecipeResult.recipe && millingRecipeResult.recipe.ap,\n            aePct: millingRecipeResult.recipe && millingRecipeResult.recipe.aePct,\n          });\n        }\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx),\n          process: kernel.processFit(candidate, ctx),\n          accuracy: (exactThreadMatch * 1.5) + (threadFormMatch * 0.5) + (toolDiameterFit * 0.5),\n          camReadiness: camReadiness,\n          blindThroughFit: blindThroughFit,\n          flexibility: flexibility,\n          tolerance: toleranceScore,\n          reach: reachFit,\n          rowMatch: (threadRows.length > 0 ? 0.35 : 0) + (millingRows.length > 0 ? 0.35 : 0),\n          machine: kernel.machineWindow(candidate, ctx),\n          riskPenalty: -kernel.risk(candidate, ctx),\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"near\" ? 0.8 : recipeResult.source === \"exact\" ? 0.9 : 0.6;\n        if (hardRejectReason) confidence = 0;\n    \n        metrics = Object.assign({}, threadingTools.getSharedMetrics(candidate, ctx), millingTools.getSharedMetrics(candidate, ctx), {\n          requestedThreadSize: parsed.threadSize,\n          requestedThreadStandard: parsed.threadStandard,\n          nominalMajorDiameterMm: nominalMajor,\n          toolDiameterMm: candidate.common.diameterMm,\n          threadDepthMm: threadDepth,\n          reachFit: reachFit,\n          threadRowCount: threadRows.length,\n          millingRowCount: millingRows.length,\n          threadPathMode: getAnswer(ctx, \"thread_path_mode\"),\n          entryStrategy: entryStrategy,\n        });\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            exactThreadMatch ? \"Thread size matches the requested designation.\" : \"Threading family matches the requested designation closely.\",\n            camReadiness >= 0.8 ? \"CAM and interpolation support the thread path.\" : \"CAM capability is the main limit for this thread-milling path.\",\n            blindThroughFit >= 0.8 ? \"Entry strategy fits the requested blind/through condition.\" : \"Entry strategy narrows the thread-milling window.\",\n          ].slice(0, 5),\n        }, recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"processes/trochoidal-milling/module.js\": function (exports, module, __bundle) {\n    var { createStubProcessModule } = __bundle.require(\"processes/_shared/stub-process.js\");\n    var { getQuestions } = __bundle.require(\"processes/trochoidal-milling/questions.js\");\n    var { derive, prefilter, score, validate } = __bundle.require(\"processes/trochoidal-milling/scoring.js\");\n    var { buildResultView } = __bundle.require(\"processes/trochoidal-milling/presenter.js\");\n    exports.default = createStubProcessModule(\"trochoidal_milling\", {\n      getQuestions: getQuestions,\n      derive: derive,\n      validate: validate,\n      prefilter: prefilter,\n      score: score,\n      buildResultView: buildResultView,\n    });\n  },\n  \"processes/trochoidal-milling/presenter.js\": function (exports, module, __bundle) {\n    var { createResultViewModel } = __bundle.require(\"core/contracts.js\");\n    var { alternatives, commerceCta, featureSummary, fitKpis, geometryFit, heroRecommendation, machineFeasibility, noMatchGuidance, recipeStartValues, riskNotes, setupNotes, warning } = __bundle.require(\"core/result-blocks.js\");\n    var { buildMillingBundleRecommendation, buildMillingCompositeCommerceData } = __bundle.require(\"processes/_shared/milling-composite-presenter.js\");\n    function toNullableNumber(value) {\n      if (value == null || value === \"\") return null;\n      value = Number(String(value).replace(\",\", \".\"));\n      return Number.isFinite(value) ? value : null;\n    }\n    \n    function titleCase(value) {\n      var text = String(value == null ? \"\" : value).replace(/_/g, \" \").trim();\n      return text ? text.charAt(0).toUpperCase() + text.slice(1) : \"\";\n    }\n    \n    function formatDisplayNumber(value, digits) {\n      var number = toNullableNumber(value);\n      if (number == null) return null;\n      return number.toFixed(digits == null ? 2 : digits).replace(/\\.0+$/, \"\").replace(/(\\.\\d*[1-9])0+$/, \"$1\");\n    }\n    \n    function formatPriceLabel(priceCents) {\n      return priceCents == null ? null : \"EUR \" + (priceCents / 100).toFixed(2);\n    }\n    \n    function dedupeTextItems(items) {\n      var seen = Object.create(null);\n      return (items || []).filter(function keep(item) {\n        var text = String(item || \"\").replace(/\\s+/g, \" \").trim();\n        if (!text || seen[text]) return false;\n        seen[text] = true;\n        return true;\n      });\n    }\n    \n    function buildAlternativeItems(scored) {\n      return scored.slice(1, 4).filter(function keep(item) {\n        return item && item.score && item.score.eligible;\n      }).map(function mapItem(item) {\n        return {\n          variantId: item.candidate.ids.variantId,\n          label: item.candidate.catalog.productTitle + (item.candidate.catalog.variantTitle ? \" / \" + item.candidate.catalog.variantTitle : \"\"),\n          score: item.score.total,\n          reason: item.score.reasons[0] || \"Alternative trochoidal option\",\n          suitable: item.score.eligible === true,\n          productTitle: item.candidate.catalog.productTitle,\n          systemKey: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.bodyVariantId\n            ? item.candidate.attachments.systemContext.bodyVariantId\n            : (item.candidate.ids.productId || item.candidate.catalog.url || item.candidate.catalog.productTitle),\n          imageUrl: item.candidate.catalog.imageUrl,\n          productUrl: item.candidate.catalog.url,\n          available: item.candidate.commerce.available,\n          priceItems: item.candidate.attachments && item.candidate.attachments.systemContext && item.candidate.attachments.systemContext.toolRole === \"composite\" ? [\n            { label: \"Body\", value: formatPriceLabel(item.candidate.attachments.systemContext.bodyPriceCents) },\n            { label: \"Insert\", value: formatPriceLabel(item.candidate.attachments.systemContext.selectedInsert && item.candidate.attachments.systemContext.selectedInsert.priceCents) },\n          ].filter(function keepPriceItem(priceItem) { return priceItem.value; }) : null,\n          priceLabel: formatPriceLabel(item.candidate.commerce.priceCents),\n          ctaLabel: item.candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n        };\n      });\n    }\n    \n    function buildRiskItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        metrics.dynamicCapabilityClass !== \"confirmed\" ? {\n          severity: \"warning\",\n          title: \"Dynamic capability\",\n          message: \"Trochoidal milling depends strongly on real constant-load CAM/control support.\",\n        } : null,\n        metrics.widthRatioFitClass === \"poor\" || metrics.widthRatioFitClass === \"conditional\" ? {\n          severity: \"warning\",\n          title: \"Width ratio\",\n          message: \"The cutter is getting close to the opening limit for a clean trochoidal path.\",\n        } : null,\n        metrics.chipEvacuationSeverityClass === \"high\" || metrics.chipEvacuationSeverityClass === \"critical\" ? {\n          severity: \"warning\",\n          title: \"Chip evacuation\",\n          message: \"Chip evacuation is a main limiter in this feature. Keep the radial burden calm and review coolant support.\",\n        } : null,\n        metrics.roughingFitClass === \"final_geometry_not_credible\" ? {\n          severity: \"warning\",\n          title: \"Finish split\",\n          message: \"Trochoidal milling should stay a roughing route here, followed by a finish pass for the final wall.\",\n        } : null,\n      ].filter(Boolean).slice(0, 4);\n    }\n    \n    function buildMachineChecks(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"dynamic\",\n          label: \"Dynamic capability\",\n          result: metrics.dynamicCapabilityClass === \"confirmed\" ? \"pass\" : metrics.dynamicCapabilityClass === \"likely\" ? \"limited\" : \"fail\",\n          note: \"State: \" + (metrics.dynamicCapabilityLabel || \"Review\") + \".\",\n        },\n        {\n          key: \"chip\",\n          label: \"Chip evacuation\",\n          result: metrics.chipEvacuationSeverityClass === \"low\" ? \"pass\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"limited\" : \"fail\",\n          note: \"Severity: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") + \".\",\n        },\n        {\n          key: \"load\",\n          label: \"Machine load\",\n          result: metrics.machineLoadClass === \"light\" || metrics.machineLoadClass === \"normal\" ? \"pass\" : metrics.machineLoadClass === \"high\" ? \"limited\" : \"fail\",\n          note: \"Load: \" + titleCase(metrics.machineLoadClass || \"review\") + \".\",\n        },\n      ];\n    }\n    \n    function buildFeatureItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"feature\", label: \"Feature type\", value: metrics.requestedFeatureTypeLabel || \"Review\" },\n        { key: \"width\", label: \"Opening width\", value: metrics.requestedFeatureWidthMm != null ? formatDisplayNumber(metrics.requestedFeatureWidthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"depth\", label: \"Axial depth\", value: metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm\" : \"n/a\" },\n        { key: \"start\", label: \"Start condition\", value: metrics.requestedStartConditionLabel || \"Review\" },\n        { key: \"finish\", label: \"Finish strategy\", value: metrics.requestedFinishStrategyLabel || \"Review\" },\n        { key: \"dynamic\", label: \"Dynamic capability\", value: metrics.dynamicCapabilityLabel || \"Review\" },\n      ];\n    }\n    \n    function buildGeometryItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        {\n          key: \"tool_width\",\n          label: \"Tool diameter vs opening\",\n          actual: metrics.candidateDiameterMm != null ? formatDisplayNumber(metrics.candidateDiameterMm, 2) + \" mm\" : null,\n          target: metrics.requestedFeatureWidthMm != null ? formatDisplayNumber(metrics.requestedFeatureWidthMm, 2) + \" mm\" : null,\n          result: metrics.widthRatioFitClass === \"good\" ? \"fit\" : metrics.widthRatioFitClass === \"conditional\" ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"ae_pct\",\n          label: \"Estimated ae %\",\n          actual: metrics.estimatedAePctReq != null ? formatDisplayNumber(metrics.estimatedAePctReq, 1) + \" %\" : null,\n          target: metrics.recipeAePctMax != null ? \"<= \" + formatDisplayNumber(metrics.recipeAePctMax, 1) + \" %\" : null,\n          result: metrics.recipeAeFitClass === \"good\" || metrics.recipeAeFitClass === \"light\" ? \"fit\" : metrics.recipeAeFitClass === \"conditional\" ? \"near\" : \"mismatch\",\n        },\n        {\n          key: \"reach\",\n          label: \"Usable length vs depth\",\n          actual: metrics.candidateUsableLengthMm != null ? formatDisplayNumber(metrics.candidateUsableLengthMm, 2) + \" mm\" : null,\n          target: metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm\" : null,\n          result: metrics.reachMarginMm != null && metrics.reachMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n        {\n          key: \"apmx\",\n          label: \"APMX vs depth\",\n          actual: metrics.candidateApmxMm != null ? formatDisplayNumber(metrics.candidateApmxMm, 2) + \" mm\" : null,\n          target: metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm\" : null,\n          result: metrics.apmxMarginMm != null && metrics.apmxMarginMm >= 0 ? \"fit\" : \"mismatch\",\n        },\n      ];\n    }\n    \n    function buildFitItems(top) {\n      var metrics = top.metrics || {};\n      return [\n        { key: \"eligibility\", label: \"Trochoidal case\", value: metrics.trochoidalEligibilityLabel || \"Review\", status: metrics.trochoidalEligibilityFlag === \"strong_case\" ? \"good\" : metrics.trochoidalEligibilityFlag === \"valid_case\" ? \"ok\" : \"weak\" },\n        { key: \"width\", label: \"Width ratio fit\", value: titleCase(metrics.widthRatioFitClass || \"review\"), status: metrics.widthRatioFitClass === \"good\" ? \"good\" : metrics.widthRatioFitClass === \"conditional\" ? \"ok\" : \"weak\" },\n        { key: \"ap\", label: \"Recipe ap fit\", value: titleCase(metrics.recipeApFitClass || \"review\"), status: metrics.recipeApFitClass === \"good\" ? \"good\" : metrics.recipeApFitClass === \"conditional\" ? \"ok\" : \"weak\" },\n        { key: \"confidence\", label: \"Confidence\", value: formatDisplayNumber(top.score.confidence, 2) || \"n/a\", status: top.score.confidence >= 0.82 ? \"good\" : top.score.confidence >= 0.65 ? \"ok\" : \"weak\" },\n      ];\n    }\n    \n    function buildRecipeBlock(top) {\n      var metrics = top.metrics || {};\n      var block = recipeStartValues({\n        source: top.score.recipeConfidence,\n        values: [\n          { key: \"vc\", label: \"vc\", min: metrics.recipeVcMin, typ: metrics.recipeVcTyp, max: metrics.recipeVcMax, unit: \"m/min\" },\n          { key: \"fz\", label: \"fz\", min: metrics.recipeFzMin, typ: metrics.recipeFzTyp, max: metrics.recipeFzMax, unit: \"mm/tooth\" },\n          { key: \"ap\", label: \"ap\", min: metrics.recipeApMin, typ: metrics.recipeApTyp, max: metrics.recipeApMax, unit: \"mm\" },\n          { key: \"aePct\", label: \"ae %\", min: metrics.recipeAePctMin, typ: metrics.recipeAePctTyp, max: metrics.recipeAePctMax, unit: \"%\" },\n        ].filter(function keep(item) { return item.min != null || item.typ != null || item.max != null; }),\n      });\n    \n      block.data.presentation = {\n        title: \"Start here\",\n        description: \"Trochoidal start values are row-backed starting points. Table feed remains a start approximation because the real path stays CAM-controlled.\",\n        rowBackedValues: [\n          { label: \"Feature\", value: metrics.requestedFeatureTypeLabel || \"Review\", tone: \"text\" },\n          { label: \"Topology\", value: metrics.requestedTopologyLabel || \"Review\", tone: \"text\" },\n          { label: \"ap fit\", value: titleCase(metrics.recipeApFitClass || \"review\"), tone: \"text\" },\n          { label: \"ae fit\", value: titleCase(metrics.recipeAeFitClass || \"review\"), tone: \"text\" },\n          { label: \"vc typ\", value: formatDisplayNumber(metrics.recipeVcTyp, 0) || \"n/a\", unit: \"m/min\" },\n          { label: \"fz typ\", value: formatDisplayNumber(metrics.recipeFzTyp, 3) || \"n/a\", unit: \"mm/tooth\" },\n          { label: \"ae req\", value: formatDisplayNumber(metrics.estimatedAePctReq, 1) || \"n/a\", unit: \"%\" },\n        ],\n        machineValues: [\n          { label: \"n\", value: formatDisplayNumber(metrics.rpmTyp, 0) || \"n/a\", unit: \"rpm\" },\n          { label: \"vf\", value: formatDisplayNumber(metrics.feedTypMmMin, 0) || \"n/a\", unit: \"mm/min\" },\n          { label: \"MRR\", value: formatDisplayNumber(metrics.mrrTyp, 1) || \"n/a\", unit: \"cm3/min\" },\n          { label: \"Z\", value: formatDisplayNumber(metrics.candidateFluteCount, 0) || \"n/a\", tone: \"text\" },\n        ],\n        trustCard: {\n          title: \"Process credibility\",\n          tone: metrics.trochoidalEligibilityFlag === \"strong_case\" ? \"good\" : metrics.trochoidalEligibilityFlag === \"valid_case\" ? \"default\" : \"watch\",\n          badge: metrics.trochoidalEligibilityLabel || \"Review\",\n          value: \"Dynamic capability: \" + (metrics.dynamicCapabilityLabel || \"Review\"),\n          note: \"Use these values as a process start. Final feed still depends on the CAM toolpath and actual radial pitch.\",\n          items: dedupeTextItems([\n            metrics.requestedOpeningMethodLabel ? \"Opening method: \" + metrics.requestedOpeningMethodLabel + \".\" : null,\n            metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            metrics.requestedFinishStrategyLabel ? \"Finish route: \" + metrics.requestedFinishStrategyLabel + \".\" : null,\n          ]),\n        },\n      };\n      return block;\n    }\n    \n    function buildSetupBlock(top, riskItems) {\n      var metrics = top.metrics || {};\n      var block = setupNotes([\n        { area: \"strategy\", message: \"Opening strategy: \" + (metrics.openingStrategyLabel || \"Review\") },\n        { area: \"coolant\", message: \"Coolant support: \" + (metrics.requestedCoolantSupportLabel || \"Review\") },\n        { area: \"concept\", message: \"Preferred concept: \" + (metrics.toolConceptDesiredLabel || \"Review\") },\n      ]);\n    \n      block.data.presentation = {\n        storyPanels: {\n          why: {\n            title: \"Why it fits\",\n            tone: \"good\",\n            badge: \"Fit\",\n            highlight: \"This recommendation is driven mainly by opening ratio, low radial engagement, reach reserve and whether trochoidal roughing is technically credible at all.\",\n            items: dedupeTextItems([\n              metrics.trochoidalEligibilityFlag === \"strong_case\" || metrics.trochoidalEligibilityFlag === \"valid_case\" ? \"The use case still looks technically credible for trochoidal roughing.\" : null,\n              metrics.widthRatioFitClass === \"good\" ? \"The cutter stays comfortably below the opening width.\" : null,\n              metrics.recipeApFitClass === \"good\" ? \"Axial depth still fits the available recipe window.\" : null,\n            ]).slice(0, 3),\n          },\n          how: {\n            title: \"How to start\",\n            tone: \"default\",\n            badge: metrics.openingStrategyLabel || \"Strategy\",\n            highlight: \"Keep radial engagement calm, let axial depth do the work, and let the CAM path carry the constant-load behavior.\",\n            items: dedupeTextItems([\n              metrics.estimatedAePctReq != null ? \"Start around \" + formatDisplayNumber(metrics.estimatedAePctReq, 1) + \"% radial engagement unless the CAM path needs less.\" : null,\n              metrics.requestedOpeningMethodLabel ? \"Preferred opening route: \" + metrics.requestedOpeningMethodLabel + \".\" : null,\n              metrics.roughingFitClass === \"roughing_plus_finish_needed\" || metrics.roughingFitClass === \"final_geometry_not_credible\" ? \"Plan a follow-up finish pass for the wall.\" : null,\n            ]).slice(0, 3),\n          },\n          watch: {\n            title: \"Watch-outs\",\n            tone: riskItems.length > 1 ? \"watch\" : \"default\",\n            badge: \"Risk\",\n            highlight: \"Trochoidal milling stops being convincing once CAM support, chip evacuation and opening ratio drift out of control together.\",\n            items: dedupeTextItems(riskItems.map(function mapRisk(item) { return item.title + \": \" + item.message; })).slice(0, 3),\n          },\n        },\n        detailPanels: [\n          {\n            title: \"Strategy basis\",\n            tone: metrics.toolConceptFitClass === \"strong\" ? \"good\" : \"default\",\n            badge: metrics.toolConceptDesiredLabel || \"Concept\",\n            value: \"The current case reads as \" + (metrics.requestedTopologyLabel || \"Review\") + \" with \" + (metrics.requestedStartConditionLabel || \"Review\") + \".\",\n            note: metrics.dynamicCapabilityLabel ? \"Dynamic capability: \" + metrics.dynamicCapabilityLabel + \".\" : null,\n            items: dedupeTextItems([\n              metrics.requestedFeatureTypeLabel ? \"Feature type: \" + metrics.requestedFeatureTypeLabel + \".\" : null,\n              metrics.requestedFinishStrategyLabel ? \"Finish strategy: \" + metrics.requestedFinishStrategyLabel + \".\" : null,\n              metrics.toolConceptDesiredLabel ? \"Preferred concept: \" + metrics.toolConceptDesiredLabel + \".\" : null,\n            ]),\n          },\n          {\n            title: \"Process risk\",\n            tone: metrics.chipEvacuationSeverityClass === \"low\" ? \"good\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"default\" : \"watch\",\n            badge: titleCase(metrics.chipEvacuationSeverityClass || \"review\"),\n            value: \"Chip evacuation, chatter sensitivity and machine load together decide whether the dynamic path stays credible.\",\n            note: dedupeTextItems([\n              metrics.reachMarginMm != null ? \"Usable-length margin \" + formatDisplayNumber(metrics.reachMarginMm, 2) + \" mm\" : null,\n              metrics.apmxMarginMm != null ? \"APMX margin \" + formatDisplayNumber(metrics.apmxMarginMm, 2) + \" mm\" : null,\n            ]).join(\" / \"),\n            items: dedupeTextItems([\n              metrics.requestedCoolantSupportLabel ? \"Coolant support: \" + metrics.requestedCoolantSupportLabel + \".\" : null,\n              metrics.requestedStabilityLabel ? \"Stability class: \" + metrics.requestedStabilityLabel + \".\" : null,\n              metrics.machineLoadClass ? \"Machine load: \" + titleCase(metrics.machineLoadClass) + \".\" : null,\n            ]),\n          },\n        ],\n        troubleshooting: [\n          {\n            title: \"Chip evacuation\",\n            tone: metrics.chipEvacuationSeverityClass === \"critical\" ? \"high\" : metrics.chipEvacuationSeverityClass === \"high\" ? \"watch\" : \"default\",\n            category: \"Chip control\",\n            cause: \"If chips stay in the feature, temperature and path stability collapse quickly in trochoidal roughing.\",\n            actions: dedupeTextItems([\n              \"Reduce radial burden if chips begin to pack.\",\n              \"Upgrade coolant or air support before pushing feed.\",\n              metrics.roughingFitClass !== \"roughing_native\" ? \"Split roughing and finishing instead of trusting one route for everything.\" : null,\n            ]),\n          },\n          {\n            title: \"Path stability\",\n            tone: metrics.chatterRiskClass === \"high\" ? \"watch\" : \"default\",\n            category: \"Stability\",\n            cause: \"Long reach, thin walls and uncertain machine dynamics can make the constant-load path drift into chatter.\",\n            actions: dedupeTextItems([\n              \"Keep gauge length short and release the first pass conservatively.\",\n              \"Prefer solid or exchangeable-head logic when the path is narrow and confined.\",\n              \"Do not overpromise table feed until the real CAM path is proven stable.\",\n            ]),\n          },\n        ],\n      };\n      return block;\n    }\n    \n    function buildResultView(scored, ctx) {\n      var top = scored[0];\n      var candidate;\n      var metrics;\n      var riskItems;\n      var heroBlock;\n      var recipeBlock;\n      var machineBlock;\n    \n      if (!top || !top.score || !top.score.eligible) {\n        return createResultViewModel({\n          processId: \"trochoidal_milling\",\n          outcome: \"no_match\",\n          summary: \"No credible trochoidal-milling recommendation could be released for the current setup.\",\n          heroVariantId: null,\n          blocks: [\n            warning(\"warning\", top && top.score && top.score.hardRejectReason ? top.score.hardRejectReason : \"The current trochoidal-milling inputs do not support a credible recommendation.\"),\n            noMatchGuidance({\n              message: \"Check the smallest opening width, axial depth, start condition, CAM/control support and whether the application should stay roughing-only or split into roughing plus finish.\",\n              steps: [\n                \"Confirm the smallest usable opening width and the full axial depth.\",\n                \"Clarify whether you start from solid, a start hole or an existing opening.\",\n                \"Check if the CAM and control can really run constant-load trochoidal paths.\",\n                \"Review chip evacuation and stability for deep or confined features.\",\n                \"Split trochoidal roughing and finishing when the final wall is critical.\",\n              ],\n            }),\n          ],\n          actions: [\n            { type: \"back_to_step3\", label: \"Adjust trochoidal inputs\", targetId: null },\n          ],\n        });\n      }\n    \n      candidate = top.candidate;\n      metrics = top.metrics || {};\n      riskItems = buildRiskItems(top);\n      heroBlock = heroRecommendation({\n        variantId: candidate.ids.variantId,\n        productTitle: candidate.catalog.productTitle,\n        variantTitle: candidate.catalog.variantTitle,\n        sku: candidate.ids.sku,\n        imageUrl: candidate.catalog.imageUrl,\n        productUrl: candidate.catalog.url,\n        fitScore: top.score.total,\n        confidence: top.score.confidence,\n        reasons: top.score.reasons.slice(0, 3),\n      });\n      heroBlock.data.presentation = {\n        kicker: \"Recommended tool\",\n        summaryLine: \"Best trochoidal-milling fit for \" + (metrics.requestedFeatureDepthMm != null ? formatDisplayNumber(metrics.requestedFeatureDepthMm, 2) + \" mm ap\" : \"the stated depth\") + \" and \" + (metrics.requestedFeatureWidthMm != null ? formatDisplayNumber(metrics.requestedFeatureWidthMm, 2) + \" mm opening\" : \"the stated opening\") + \".\",\n        headerPills: [\n          { tone: \"good\", text: metrics.trochoidalEligibilityLabel || \"Best fit\" },\n          { tone: metrics.dynamicCapabilityClass === \"confirmed\" ? \"good\" : metrics.dynamicCapabilityClass === \"likely\" ? \"default\" : \"watch\", text: \"Dynamic: \" + (metrics.dynamicCapabilityLabel || \"Review\") },\n          { tone: metrics.chipEvacuationSeverityClass === \"low\" ? \"good\" : metrics.chipEvacuationSeverityClass === \"medium\" ? \"default\" : \"watch\", text: \"Chip: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\") },\n          { tone: metrics.roughingFitClass === \"roughing_native\" ? \"good\" : \"watch\", text: metrics.roughingFitClass === \"roughing_native\" ? \"Route: Roughing-native\" : \"Route: Finish split\" },\n        ],\n      };\n    \n      recipeBlock = buildRecipeBlock(top);\n      machineBlock = machineFeasibility(buildMachineChecks(top));\n      machineBlock.data.presentation = {\n        trustCard: {\n          title: \"Machine fit\",\n          tone: metrics.dynamicCapabilityClass === \"confirmed\" ? \"good\" : metrics.dynamicCapabilityClass === \"likely\" ? \"default\" : \"watch\",\n          badge: metrics.dynamicCapabilityLabel || \"Review\",\n          value: \"Chip severity: \" + titleCase(metrics.chipEvacuationSeverityClass || \"review\"),\n          note: \"Trochoidal milling needs dynamic path support more than a conventional slot or pocket route.\",\n          items: dedupeTextItems([\n            metrics.machineLoadClass ? \"Machine load: \" + titleCase(metrics.machineLoadClass) + \".\" : null,\n            metrics.openingStrategyLabel ? \"Opening strategy: \" + metrics.openingStrategyLabel + \".\" : null,\n            metrics.requestedCoolantSupportLabel ? \"Coolant support: \" + metrics.requestedCoolantSupportLabel + \".\" : null,\n          ]),\n        },\n      };\n    \n      return createResultViewModel({\n        processId: \"trochoidal_milling\",\n        outcome: top.score.total >= 8 ? \"match\" : \"limited_match\",\n        summary: \"Best trochoidal-milling result based on strategy credibility, opening ratio, axial depth fit and dynamic prerequisites.\",\n        heroVariantId: candidate.ids.variantId,\n        blocks: [\n          heroBlock,\n          buildMillingBundleRecommendation(candidate),\n          featureSummary(buildFeatureItems(top)),\n          geometryFit(buildGeometryItems(top)),\n          fitKpis(buildFitItems(top)),\n          recipeBlock,\n          machineBlock,\n          buildSetupBlock(top, riskItems),\n          riskNotes(riskItems),\n          alternatives(buildAlternativeItems(scored)),\n          commerceCta(Object.assign({\n            productUrl: candidate.catalog.url,\n            available: candidate.commerce.available,\n            priceLabel: formatPriceLabel(candidate.commerce.priceCents),\n            ctaLabel: candidate.commerce.available === false ? \"Unavailable\" : \"Open product\",\n          }, buildMillingCompositeCommerceData(candidate) || {})),\n        ].filter(Boolean),\n        actions: [\n          { type: \"open_product\", label: \"Open product\", targetId: candidate.catalog.url || candidate.ids.variantId },\n          { type: \"back_to_step3\", label: \"Adjust trochoidal inputs\", targetId: null },\n        ],\n      });\n    }\n    \n    exports.buildResultView = buildResultView;\n  },\n  \"processes/trochoidal-milling/questions.js\": function (exports, module, __bundle) {\n    var { buildProcessQuestions } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function getQuestions() {\n      return buildProcessQuestions(\"trochoidal_milling\");\n    }\n    \n    exports.getQuestions = getQuestions;\n  },\n  \"processes/trochoidal-milling/scoring.js\": function (exports, module, __bundle) {\n    var { createScoredCandidate, getCandidateFluteCount, toNullableNumber } = __bundle.require(\"catalog/contracts.js\");\n    var { deriveByProcessSpec, getAnswer, prefilterByProcessSpec, validateByProcessSpec } = __bundle.require(\"processes/_shared/stub-process.js\");\n    function clamp(value, min, max) {\n      return Math.max(min, Math.min(max, value));\n    }\n    \n    function average(values) {\n      var filtered = (values || []).filter(function keep(value) {\n        return value != null && Number.isFinite(value);\n      });\n      if (!filtered.length) return 0;\n      return filtered.reduce(function sum(total, value) {\n        return total + value;\n      }, 0) / filtered.length;\n    }\n    \n    function sumParts(parts) {\n      return Object.keys(parts || {}).reduce(function sum(total, key) {\n        return total + (Number(parts[key]) || 0);\n      }, 0);\n    }\n    \n    function scoreToken(value, map, fallback) {\n      return Object.prototype.hasOwnProperty.call(map, value) ? map[value] : (fallback == null ? 0.5 : fallback);\n    }\n    \n    function normalizeConceptPreference(value) {\n      if (value === \"solid_carbide_only\") return \"solid_carbide\";\n      if (value === \"exchangeable_head_only\") return \"exchangeable_head\";\n      if (value === \"solid_or_exchangeable\") return \"solid_or_exchangeable\";\n      if (value === \"indexable_only\") return \"indexable\";\n      return \"either\";\n    }\n    \n    function getFeatureTypeLabel(value) {\n      return {\n        slot_groove: \"Slot / groove\",\n        pocket: \"Pocket\",\n        confined_cavity: \"Confined cavity\",\n        inner_contour: \"Tight inner contour\",\n      }[value] || \"Trochoidal feature\";\n    }\n    \n    function getStartConditionLabel(value) {\n      return {\n        from_solid: \"From solid\",\n        existing_opening: \"Existing opening\",\n        start_hole: \"Start hole\",\n        pre_machined: \"Pre-machined area\",\n      }[value] || \"Start condition\";\n    }\n    \n    function getFinishStrategyLabel(value) {\n      return {\n        roughing_only: \"Roughing only\",\n        rough_plus_finish: \"Rough + finish\",\n        final_geometry_critical: \"Final wall critical\",\n      }[value] || \"Finish strategy\";\n    }\n    \n    function getDynamicCapabilityLabel(value) {\n      return {\n        confirmed: \"Confirmed\",\n        likely: \"Likely\",\n        absent: \"Absent\",\n        unknown: \"Unknown\",\n      }[value] || \"Review\";\n    }\n    \n    function getCoolantSupportLabel(value) {\n      return {\n        internal: \"Internal\",\n        external: \"External\",\n        air: \"Air\",\n        dry: \"Dry\",\n        unknown: \"Unknown\",\n      }[value] || \"Review\";\n    }\n    \n    function getStabilityLabel(value) {\n      return {\n        stable: \"Stable\",\n        normal: \"Normal\",\n        thin_wall: \"Thin-wall\",\n        chatter_sensitive: \"Chatter-sensitive\",\n      }[value] || \"Review\";\n    }\n    \n    function getConceptLabel(value) {\n      return {\n        solid_carbide: \"Solid carbide\",\n        exchangeable_head: \"Exchangeable head\",\n        solid_or_exchangeable: \"Solid / exchangeable\",\n        indexable: \"Indexable\",\n        either: \"Either\",\n      }[value] || \"Review\";\n    }\n    \n    function getOpeningMethodLabel(value) {\n      return {\n        any: \"Any\",\n        start_hole_plus_ramp: \"Start hole + ramp\",\n        linear_ramp: \"Linear ramp\",\n        circular_ramp: \"Circular ramp\",\n        plunge: \"Plunge\",\n        existing_opening: \"Existing opening\",\n        unclear: \"Review\",\n      }[value] || \"Review\";\n    }\n    \n    function getEligibilityLabel(value) {\n      return {\n        strong_case: \"Strong case\",\n        valid_case: \"Valid case\",\n        weak_case: \"Weak case\",\n        not_credible: \"Not credible\",\n      }[value] || \"Review\";\n    }\n    \n    function deriveTopologyClass(featureType, startCondition) {\n      if (featureType === \"slot_groove\" && startCondition === \"from_solid\") return \"slot_from_solid\";\n      if (featureType === \"slot_groove\") return \"slot_existing\";\n      if (featureType === \"confined_cavity\" && startCondition === \"from_solid\") return \"confined_from_solid\";\n      if (featureType === \"confined_cavity\") return \"confined_existing\";\n      if (featureType === \"inner_contour\") return \"inner_contour\";\n      return \"pocket_like\";\n    }\n    \n    function getTopologyLabel(value) {\n      return {\n        slot_from_solid: \"Slot from solid\",\n        slot_existing: \"Slot / groove with opening\",\n        confined_from_solid: \"Confined cavity from solid\",\n        confined_existing: \"Confined cavity with opening\",\n        inner_contour: \"Tight inner contour\",\n        pocket_like: \"Pocket-like roughing area\",\n      }[value] || \"Trochoidal topology\";\n    }\n    \n    function deriveRequestedConditionStage() {\n      return \"roughing\";\n    }\n    \n    function inferCandidateConcept(candidate) {\n      var diameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n      var helixAngle = toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg);\n      var neckDiameter = toNullableNumber(candidate.milling && candidate.milling.neckDiameterMm);\n      var productText = [candidate.catalog && candidate.catalog.productTitle, candidate.catalog && candidate.catalog.variantTitle].join(\" \").toLowerCase();\n    \n      if (productText.indexOf(\"head\") >= 0 || productText.indexOf(\"multi-master\") >= 0 || productText.indexOf(\"multimaster\") >= 0) return \"exchangeable_head\";\n      if (productText.indexOf(\"body\") >= 0 || productText.indexOf(\"index\") >= 0 || productText.indexOf(\"cutter\") >= 0) return \"indexable\";\n      if (diameter != null && diameter >= 25) return \"indexable\";\n      if (diameter != null && diameter <= 16 && helixAngle != null && helixAngle >= 30) return \"solid_carbide\";\n      if (neckDiameter != null && diameter != null && neckDiameter < diameter) return \"solid_carbide\";\n      if (diameter != null && diameter <= 20) return \"solid_or_exchangeable\";\n      return \"either\";\n    }\n    \n    function deriveSuggestedConcept(inputs) {\n      var solidBias = 0;\n      var exchangeableBias = 0;\n      var indexableBias = 0;\n    \n      if (inputs.featureType === \"slot_groove\" || inputs.featureType === \"confined_cavity\" || inputs.featureType === \"inner_contour\") {\n        solidBias += 2;\n        exchangeableBias += 1;\n      }\n      if (inputs.startCondition === \"from_solid\" || inputs.startCondition === \"start_hole\") {\n        solidBias += 1;\n        exchangeableBias += 1;\n      }\n      if (inputs.materialSeverityScore >= 0.55) {\n        solidBias += 2;\n        exchangeableBias += 1;\n      }\n      if (inputs.stabilityClass === \"thin_wall\" || inputs.stabilityClass === \"chatter_sensitive\") {\n        solidBias += 2;\n        exchangeableBias += 1;\n      }\n      if (inputs.toolToWidthRatio != null && inputs.toolToWidthRatio <= 0.7) {\n        solidBias += 2;\n        exchangeableBias += 1;\n      }\n      if (inputs.featureType === \"pocket\" && inputs.toolToWidthRatio != null && inputs.toolToWidthRatio <= 0.85) {\n        indexableBias += 1;\n      }\n      if (inputs.featureType === \"pocket\" && inputs.machineTorque === \"high\" && inputs.stabilityClass === \"stable\") {\n        indexableBias += 2;\n      }\n      if (inputs.priority === \"productivity\" && inputs.featureType === \"pocket\") {\n        indexableBias += 2;\n      }\n      if (inputs.finishStrategy === \"final_geometry_critical\") {\n        solidBias += 2;\n      }\n    \n      if (solidBias >= indexableBias + 2 && solidBias >= exchangeableBias + 1) {\n        return solidBias >= exchangeableBias + 2 ? \"solid_carbide\" : \"solid_or_exchangeable\";\n      }\n      if (exchangeableBias >= solidBias + 1 && exchangeableBias >= indexableBias + 1) return \"exchangeable_head\";\n      if (indexableBias >= solidBias + 2 && indexableBias >= exchangeableBias + 2) return \"indexable\";\n      return \"solid_or_exchangeable\";\n    }\n    \n    function evaluateConceptFit(candidateConcept, desiredConcept, explicitConcept) {\n      var score = 0.76;\n      var explicitDesired = explicitConcept !== \"either\" ? explicitConcept : desiredConcept;\n    \n      if (explicitDesired === \"either\" || candidateConcept === \"either\") score = 0.82;\n      else if (explicitDesired === \"solid_or_exchangeable\" && (candidateConcept === \"solid_carbide\" || candidateConcept === \"exchangeable_head\" || candidateConcept === \"solid_or_exchangeable\")) score = 0.95;\n      else if (candidateConcept === explicitDesired) score = explicitConcept === \"either\" ? 0.92 : 1;\n      else if ((candidateConcept === \"solid_or_exchangeable\" && (explicitDesired === \"solid_carbide\" || explicitDesired === \"exchangeable_head\"))\n        || (explicitDesired === \"solid_or_exchangeable\" && candidateConcept === \"either\")) {\n        score = explicitConcept === \"either\" ? 0.8 : 0.68;\n      } else {\n        score = explicitConcept === \"either\" ? 0.5 : 0.24;\n      }\n    \n      return {\n        score: score,\n        className: score >= 0.9 ? \"strong\" : score >= 0.7 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\",\n      };\n    }\n    \n    function evaluateWidthRatio(toolToWidthRatio, featureType) {\n      var preferredLimit = featureType === \"slot_groove\" ? 0.7 : featureType === \"inner_contour\" ? 0.75 : 0.85;\n      var hardLimit = 1;\n      var score;\n    \n      if (toolToWidthRatio == null) {\n        return { score: 0.5, className: \"unknown\", hardFail: false, preferredLimit: preferredLimit };\n      }\n      if (toolToWidthRatio > hardLimit) {\n        return { score: 0, className: \"over\", hardFail: true, preferredLimit: preferredLimit };\n      }\n      if (toolToWidthRatio <= preferredLimit) {\n        score = toolToWidthRatio <= preferredLimit * 0.82 ? 1 : 0.92;\n        return { score: score, className: \"good\", hardFail: false, preferredLimit: preferredLimit };\n      }\n      score = clamp(0.84 - ((toolToWidthRatio - preferredLimit) / Math.max(hardLimit - preferredLimit, 0.01)) * 0.54, 0.22, 0.84);\n      return {\n        score: score,\n        className: toolToWidthRatio <= preferredLimit + 0.1 ? \"conditional\" : \"poor\",\n        hardFail: false,\n        preferredLimit: preferredLimit,\n      };\n    }\n    \n    function estimateTrochoidalAePct(toolToWidthRatio, featureType, startCondition) {\n      var base = scoreToken(featureType, {\n        slot_groove: 14,\n        confined_cavity: 16,\n        inner_contour: 15,\n        pocket: 18,\n      }, 16);\n      var tightnessPenalty = toolToWidthRatio == null ? 0 : clamp((toolToWidthRatio - 0.55) / 0.45, 0, 1) * 12;\n      var startPenalty = startCondition === \"from_solid\" ? 2 : startCondition === \"start_hole\" ? 1 : 0;\n      return clamp(base + tightnessPenalty + startPenalty, 8, 38);\n    }\n    \n    function evaluateBandFit(requestedValue, band, options) {\n      var min = toNullableNumber(band && band.min);\n      var typ = toNullableNumber(band && band.typ);\n      var max = toNullableNumber(band && band.max);\n      var upper = max != null ? max : (typ != null ? typ : min);\n      var tolerance = options && options.overflowTolerance != null ? options.overflowTolerance : 0.35;\n      var overflowRatio;\n      var score;\n    \n      if (requestedValue == null) return { score: 0.5, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (upper == null) return { score: 0.58, className: \"unknown\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      if (requestedValue > upper) {\n        overflowRatio = upper > 0 ? (requestedValue - upper) / upper : 1;\n        score = clamp(0.62 - overflowRatio * 0.8, 0.15, 0.62);\n        return {\n          score: score,\n          className: overflowRatio <= tolerance ? \"conditional\" : \"over\",\n          hardFail: overflowRatio > tolerance,\n          min: min,\n          typ: typ,\n          max: max,\n          upper: upper,\n        };\n      }\n      if (typ != null && requestedValue > typ) {\n        score = clamp(1 - ((requestedValue - typ) / Math.max((upper - typ) || typ || 1, 1)) * 0.24, 0.8, 1);\n        return { score: score, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      }\n      if (min != null && requestedValue < min) return { score: 0.84, className: \"light\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n      return { score: 0.94, className: \"good\", hardFail: false, min: min, typ: typ, max: max, upper: upper };\n    }\n    \n    function marginScore(margin) {\n      if (margin == null) return 0.45;\n      if (margin >= 5) return 1;\n      if (margin >= 2) return 0.88;\n      if (margin >= 0.5) return 0.74;\n      if (margin >= 0) return 0.58;\n      if (margin >= -1) return 0.18;\n      return 0;\n    }\n    \n    function classifyDynamicCapability(value) {\n      var score = scoreToken(value, {\n        confirmed: 1,\n        likely: 0.76,\n        unknown: 0.54,\n        absent: 0,\n      }, 0.54);\n      return {\n        score: score,\n        className: value || \"unknown\",\n        label: getDynamicCapabilityLabel(value),\n      };\n    }\n    \n    function classifyMaterialSeverity(ctx, materialCondition) {\n      var materialCode = String(ctx && ctx.materialCode || \"\").toUpperCase();\n      var base = scoreToken(materialCode.charAt(0), {\n        P: 0.28,\n        M: 0.56,\n        K: 0.22,\n        N: 0.26,\n        S: 0.76,\n        H: 0.72,\n      }, 0.34);\n      var score = clamp(base + scoreToken(materialCondition, {\n        standard: 0,\n        tough_long_chipping: 0.1,\n        sticky_bue: 0.14,\n        work_hardening: 0.2,\n        hard_abrasive: 0.18,\n        unknown: 0.08,\n      }, 0.08), 0, 1);\n    \n      return {\n        score: score,\n        className: score >= 0.72 ? \"critical\" : score >= 0.52 ? \"high\" : score >= 0.3 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyCoolantSupport(inputs, candidate) {\n      var candidateHasTsc = candidate.common && candidate.common.coolantTsc === true;\n      var answer = inputs.coolantSupport;\n      if (!answer || answer === \"unknown\") return { score: 0.56, className: \"unknown\" };\n      if (answer === \"internal\") return { score: candidateHasTsc ? 1 : 0.72, className: candidateHasTsc ? \"strong\" : \"conditional\" };\n      if (answer === \"external\") return { score: 0.74, className: \"acceptable\" };\n      if (answer === \"air\") return { score: 0.62, className: \"limited\" };\n      if (answer === \"dry\") return { score: 0.44, className: \"weak\" };\n      return { score: 0.56, className: \"unknown\" };\n    }\n    \n    function classifyChipEvacuationSeverity(inputs) {\n      var score = 0;\n      score += inputs.materialSeverityScore * 0.38;\n      score += scoreToken(inputs.featureType, {\n        slot_groove: 0.18,\n        confined_cavity: 0.24,\n        inner_contour: 0.2,\n        pocket: 0.1,\n      }, 0.14);\n      score += scoreToken(inputs.startCondition, {\n        from_solid: 0.14,\n        start_hole: 0.08,\n        existing_opening: 0.02,\n        pre_machined: 0.02,\n      }, 0.06);\n      score += clamp((inputs.depthRatio || 0) / 4.5, 0, 1) * 0.18;\n      score += (1 - inputs.coolantSupportScore) * 0.22;\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.74 ? \"critical\" : score >= 0.54 ? \"high\" : score >= 0.3 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyChatterRisk(inputs) {\n      var score = 0;\n      score += scoreToken(inputs.stabilityClass, {\n        stable: 0.04,\n        normal: 0.14,\n        thin_wall: 0.38,\n        chatter_sensitive: 0.52,\n      }, 0.16);\n      score += scoreToken(inputs.featureType, {\n        slot_groove: 0.12,\n        confined_cavity: 0.18,\n        inner_contour: 0.2,\n        pocket: 0.06,\n      }, 0.08);\n      score += clamp((inputs.apRatio || 0) / 2.8, 0, 1) * 0.16;\n      score += inputs.materialSeverityScore * 0.14;\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.58 ? \"high\" : score >= 0.3 ? \"medium\" : \"low\",\n      };\n    }\n    \n    function classifyMachineLoad(inputs) {\n      var score = 0;\n      score += clamp((inputs.apRatio || 0) / 2.4, 0, 1) * 0.36;\n      score += clamp((inputs.estimatedAePct || 0) / 25, 0, 1) * 0.18;\n      score += inputs.materialSeverityScore * 0.18;\n      score += scoreToken(inputs.machineTorque, {\n        high: 0,\n        medium: 0.08,\n        low: 0.18,\n        unknown: 0.05,\n      }, 0.05);\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.68 ? \"critical\" : score >= 0.48 ? \"high\" : score >= 0.24 ? \"normal\" : \"light\",\n      };\n    }\n    \n    function deriveOpeningStrategy(startCondition, openingMethod) {\n      if (startCondition === \"existing_opening\" || startCondition === \"pre_machined\") return \"existing_opening\";\n      if (openingMethod && openingMethod !== \"any\") return openingMethod;\n      if (startCondition === \"start_hole\") return \"start_hole_plus_ramp\";\n      if (startCondition === \"from_solid\") return \"circular_ramp\";\n      return \"unclear\";\n    }\n    \n    function evaluateOpeningFit(strategyClass, dynamicCapability, candidateConcept) {\n      var score = 0.76;\n      if (strategyClass === \"existing_opening\") score = 1;\n      else if (dynamicCapability === \"absent\") score = 0.1;\n      else if (strategyClass === \"circular_ramp\" || strategyClass === \"linear_ramp\" || strategyClass === \"start_hole_plus_ramp\") score = dynamicCapability === \"confirmed\" ? 0.92 : dynamicCapability === \"likely\" ? 0.76 : 0.58;\n      else if (strategyClass === \"plunge\") score = candidateConcept === \"indexable\" ? 0.72 : 0.6;\n      else score = 0.54;\n    \n      return {\n        score: score,\n        className: score >= 0.9 ? \"strong\" : score >= 0.7 ? \"usable\" : score >= 0.45 ? \"conditional\" : \"poor\",\n      };\n    }\n    \n    function evaluateRoughingFit(finishStrategy) {\n      if (finishStrategy === \"roughing_only\") return { score: 1, className: \"roughing_native\" };\n      if (finishStrategy === \"rough_plus_finish\") return { score: 0.9, className: \"roughing_plus_finish_needed\" };\n      return { score: 0.46, className: \"final_geometry_not_credible\" };\n    }\n    \n    function computeTrochoidalEligibility(inputs) {\n      var score = 0.3;\n      if (inputs.dynamicCapability === \"absent\") {\n        return { score: 0, className: \"not_credible\", label: getEligibilityLabel(\"not_credible\") };\n      }\n      score += inputs.widthFitScore * 0.28;\n      score += inputs.dynamicScore * 0.2;\n      score += inputs.materialSeverityScore * 0.12;\n      score += inputs.chipSeverityScore * 0.06;\n      score += inputs.chatterRiskScore * 0.06;\n      score += inputs.featureType === \"slot_groove\" || inputs.featureType === \"confined_cavity\" ? 0.08 : 0;\n      score += inputs.startCondition === \"from_solid\" ? 0.05 : 0;\n      score -= inputs.finishStrategy === \"final_geometry_critical\" ? 0.18 : 0;\n      score = clamp(score, 0, 1);\n      return {\n        score: score,\n        className: score >= 0.78 ? \"strong_case\" : score >= 0.58 ? \"valid_case\" : score >= 0.38 ? \"weak_case\" : \"not_credible\",\n        label: getEligibilityLabel(score >= 0.78 ? \"strong_case\" : score >= 0.58 ? \"valid_case\" : score >= 0.38 ? \"weak_case\" : \"not_credible\"),\n      };\n    }\n    \n    function scoreStageFit(requestedStage, row) {\n      var rowStage = row && row.constraints ? row.constraints.conditionStage : null;\n      if (!requestedStage || !rowStage) return 0.76;\n      if (requestedStage === rowStage) return 1;\n      if (rowStage === \"semi-finishing\") return 0.82;\n      return 0.62;\n    }\n    \n    function computeRpm(vc, diameter) {\n      if (vc == null || diameter == null || diameter <= 0) return null;\n      return (1000 * vc) / (Math.PI * diameter);\n    }\n    \n    function computeFeed(fz, rpm, fluteCount) {\n      if (fz == null || rpm == null || fluteCount == null || fluteCount <= 0) return null;\n      return fz * rpm * fluteCount;\n    }\n    \n    function computeMrr(ap, ae, feed) {\n      if (ap == null || ae == null || feed == null) return null;\n      return (ap * ae * feed) / 1000;\n    }\n    \n    function derive(ctx, toolkits) {\n      var derived = Object.assign({}, deriveByProcessSpec(\"trochoidal_milling\", ctx, toolkits));\n      var featureType = getAnswer(ctx, \"trochoidal_feature_type\");\n      var startCondition = getAnswer(ctx, \"trochoidal_start_condition\");\n      var finishStrategy = getAnswer(ctx, \"trochoidal_finish_strategy\");\n      var topologyClass = deriveTopologyClass(featureType, startCondition);\n      var width = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n    \n      derived.feature_topology_class = topologyClass;\n      derived.feature_topology_label = getTopologyLabel(topologyClass);\n      derived.trochoidal_feature_type_label = getFeatureTypeLabel(featureType);\n      derived.trochoidal_start_condition_label = getStartConditionLabel(startCondition);\n      derived.trochoidal_finish_strategy_label = getFinishStrategyLabel(finishStrategy);\n      derived.dynamic_capability_class = getAnswer(ctx, \"trochoidal_dynamic_capability\") || \"unknown\";\n      derived.entry_strategy_class = deriveOpeningStrategy(startCondition, getAnswer(ctx, \"trochoidal_opening_method\"));\n      derived.condition_stage = deriveRequestedConditionStage(finishStrategy);\n      derived.finish_split_required = finishStrategy === \"rough_plus_finish\" || finishStrategy === \"final_geometry_critical\";\n      if (width != null && depth != null && width > 0) derived.trochoidal_depth_ratio = depth / width;\n    \n      return derived;\n    }\n    \n    function validate(ctx) {\n      var issues = validateByProcessSpec(\"trochoidal_milling\", ctx);\n      var width = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var depth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var depthRatio = width != null && depth != null && width > 0 ? depth / width : null;\n      var featureType = getAnswer(ctx, \"trochoidal_feature_type\");\n      var startCondition = getAnswer(ctx, \"trochoidal_start_condition\");\n      var dynamicCapability = getAnswer(ctx, \"trochoidal_dynamic_capability\");\n      var finishStrategy = getAnswer(ctx, \"trochoidal_finish_strategy\");\n      var coolantSupport = getAnswer(ctx, \"trochoidal_coolant_support\");\n      var conceptPreference = normalizeConceptPreference(getAnswer(ctx, \"trochoidal_tool_concept_preference\"));\n    \n      if (finishStrategy === \"final_geometry_critical\") {\n        issues.push({\n          field: \"trochoidal_finish_strategy\",\n          message: \"Trochoidal milling is primarily a roughing strategy. A finish split should stay visible when the final wall is critical.\",\n          severity: \"warning\",\n          code: \"trochoidal_finish_split\",\n        });\n      }\n      if (dynamicCapability === \"absent\") {\n        issues.push({\n          field: \"trochoidal_dynamic_capability\",\n          message: \"Without real trochoidal CAM/control support, this process is not technically credible.\",\n          severity: \"warning\",\n          code: \"trochoidal_dynamic_absent\",\n        });\n      }\n      if (depthRatio != null && depthRatio > 4) {\n        issues.push({\n          field: \"feature_depth_mm\",\n          message: \"This depth-to-width ratio is demanding. Reach, chip evacuation and stability need extra care.\",\n          severity: \"warning\",\n          code: \"trochoidal_depth_ratio_high\",\n        });\n      }\n      if ((featureType === \"slot_groove\" || featureType === \"confined_cavity\") && startCondition === \"from_solid\" && (coolantSupport === \"dry\" || coolantSupport === \"unknown\")) {\n        issues.push({\n          field: \"trochoidal_coolant_support\",\n          message: \"From-solid trochoidal roughing in a confined feature gets risky quickly without reliable chip evacuation support.\",\n          severity: \"warning\",\n          code: \"trochoidal_chip_control_risk\",\n        });\n      }\n      if ((featureType === \"confined_cavity\" || featureType === \"inner_contour\") && conceptPreference === \"indexable\") {\n        issues.push({\n          field: \"trochoidal_tool_concept_preference\",\n          message: \"Indexable-only is usually a poor fit for narrow confined trochoidal paths. Solid or exchangeable-head logic is more credible.\",\n          severity: \"warning\",\n          code: \"trochoidal_indexable_conflict\",\n        });\n      }\n    \n      return issues;\n    }\n    \n    function prefilter(pool) {\n      return prefilterByProcessSpec(\"trochoidal_milling\", pool);\n    }\n    \n    function score(pool, ctx, kernel, toolkits) {\n      var millingTools = toolkits.milling;\n      var featureType = getAnswer(ctx, \"trochoidal_feature_type\");\n      var featureWidth = toNullableNumber(getAnswer(ctx, \"feature_width_mm\"));\n      var featureDepth = toNullableNumber(getAnswer(ctx, \"feature_depth_mm\"));\n      var startCondition = getAnswer(ctx, \"trochoidal_start_condition\");\n      var dynamicCapability = getAnswer(ctx, \"trochoidal_dynamic_capability\") || \"unknown\";\n      var materialCondition = getAnswer(ctx, \"material_condition_class\") || \"standard\";\n      var stabilityClass = getAnswer(ctx, \"trochoidal_stability_class\") || \"normal\";\n      var finishStrategy = getAnswer(ctx, \"trochoidal_finish_strategy\") || \"roughing_only\";\n      var coolantSupport = getAnswer(ctx, \"trochoidal_coolant_support\") || \"unknown\";\n      var maxToolDiameter = toNullableNumber(getAnswer(ctx, \"max_tool_diameter_mm\"));\n      var reachRequirement = toNullableNumber(getAnswer(ctx, \"trochoidal_reach_mm\")) || featureDepth;\n      var explicitConcept = normalizeConceptPreference(getAnswer(ctx, \"trochoidal_tool_concept_preference\"));\n      var openingMethod = getAnswer(ctx, \"trochoidal_opening_method\") || \"any\";\n      var machineTorque = getAnswer(ctx, \"trochoidal_machine_torque_class\") || \"unknown\";\n      var priority = getAnswer(ctx, \"priority\") || \"balanced\";\n      var topologyClass = deriveTopologyClass(featureType, startCondition);\n      var dynamic = classifyDynamicCapability(dynamicCapability);\n      var materialSeverity = classifyMaterialSeverity(ctx, materialCondition);\n    \n      return (pool || []).map(function mapCandidate(candidate) {\n        var rows = millingTools.resolveRows(candidate, ctx);\n        var recipeResult = millingTools.resolveRecipe(candidate, ctx);\n        var row = recipeResult.row || rows[0] || null;\n        var recipe = recipeResult.recipe || {};\n        var candidateDiameter = toNullableNumber(candidate.common && candidate.common.diameterMm);\n        var candidateUsableLength = toNullableNumber(candidate.common && candidate.common.usableLengthMm);\n        var candidateApmx = toNullableNumber(candidate.common && candidate.common.apmxMm);\n        var candidateFluteCount = getCandidateFluteCount(candidate);\n        var candidateConcept = inferCandidateConcept(candidate);\n        var toolToWidthRatio = featureWidth != null && candidateDiameter != null && featureWidth > 0 ? candidateDiameter / featureWidth : null;\n        var widthToToolRatio = featureWidth != null && candidateDiameter != null && candidateDiameter > 0 ? featureWidth / candidateDiameter : null;\n        var widthFit = evaluateWidthRatio(toolToWidthRatio, featureType);\n        var estimatedAePct = estimateTrochoidalAePct(toolToWidthRatio, featureType, startCondition);\n        var estimatedAeMm = candidateDiameter != null ? (candidateDiameter * estimatedAePct) / 100 : null;\n        var apRatio = featureDepth != null && candidateDiameter != null && candidateDiameter > 0 ? featureDepth / candidateDiameter : null;\n        var depthRatio = featureWidth != null && featureDepth != null && featureWidth > 0 ? featureDepth / featureWidth : null;\n        var axialDepthFit = evaluateBandFit(featureDepth, recipe.ap, { overflowTolerance: 0.8 });\n        var radialFit = evaluateBandFit(estimatedAePct, recipe.aePct, { overflowTolerance: 0.5 });\n        var reachMargin = candidateUsableLength != null && featureDepth != null ? candidateUsableLength - featureDepth : null;\n        var apmxMargin = candidateApmx != null && featureDepth != null ? candidateApmx - featureDepth : null;\n        var reachReserveScore = average([marginScore(reachMargin), marginScore(apmxMargin)]);\n        var desiredConcept = explicitConcept === \"either\"\n          ? deriveSuggestedConcept({\n              featureType: featureType,\n              startCondition: startCondition,\n              finishStrategy: finishStrategy,\n              stabilityClass: stabilityClass,\n              materialSeverityScore: materialSeverity.score,\n              toolToWidthRatio: toolToWidthRatio,\n              machineTorque: machineTorque,\n              priority: priority,\n            })\n          : explicitConcept;\n        var conceptFit = evaluateConceptFit(candidateConcept, desiredConcept, explicitConcept);\n        var coolantFit = classifyCoolantSupport({ coolantSupport: coolantSupport }, candidate);\n        var chipSeverity = classifyChipEvacuationSeverity({\n          materialSeverityScore: materialSeverity.score,\n          featureType: featureType,\n          startCondition: startCondition,\n          depthRatio: depthRatio,\n          coolantSupportScore: coolantFit.score,\n        });\n        var chatterRisk = classifyChatterRisk({\n          stabilityClass: stabilityClass,\n          featureType: featureType,\n          apRatio: apRatio,\n          materialSeverityScore: materialSeverity.score,\n        });\n        var machineLoad = classifyMachineLoad({\n          apRatio: apRatio,\n          estimatedAePct: estimatedAePct,\n          materialSeverityScore: materialSeverity.score,\n          machineTorque: machineTorque,\n        });\n        var openingStrategyClass = deriveOpeningStrategy(startCondition, openingMethod);\n        var openingFit = evaluateOpeningFit(openingStrategyClass, dynamicCapability, candidateConcept);\n        var roughingFit = evaluateRoughingFit(finishStrategy);\n        var stageFitScore = scoreStageFit(getAnswer(ctx, \"condition_stage\") || \"roughing\", row);\n        var trochoidalEligibility = computeTrochoidalEligibility({\n          dynamicCapability: dynamicCapability,\n          dynamicScore: dynamic.score,\n          widthFitScore: widthFit.score,\n          materialSeverityScore: materialSeverity.score,\n          chipSeverityScore: chipSeverity.score,\n          chatterRiskScore: chatterRisk.score,\n          featureType: featureType,\n          startCondition: startCondition,\n          finishStrategy: finishStrategy,\n        });\n        var hardRejectReason = null;\n        var rpmTyp = computeRpm(toNullableNumber(recipe.vc && recipe.vc.typ), candidateDiameter);\n        var feedTyp = computeFeed(toNullableNumber(recipe.fz && recipe.fz.typ), rpmTyp, candidateFluteCount);\n        var mrrTyp = computeMrr(featureDepth, estimatedAeMm, feedTyp);\n        var metrics;\n        var parts;\n        var total;\n        var confidence;\n        var riskPenalty;\n    \n        if (!rows.length) hardRejectReason = \"No valid trochoidal milling row is available for this material and process context.\";\n        if (!hardRejectReason && dynamicCapability === \"absent\") hardRejectReason = \"Trochoidal milling needs real CAM/control support for constant-load toolpaths.\";\n        if (!hardRejectReason && maxToolDiameter != null && candidateDiameter != null && candidateDiameter > maxToolDiameter) hardRejectReason = \"Tool diameter exceeds the stated clearance limit.\";\n        if (!hardRejectReason && widthFit.hardFail) hardRejectReason = \"Tool diameter exceeds the available feature opening.\";\n        if (!hardRejectReason && axialDepthFit.hardFail) hardRejectReason = \"Requested axial depth exceeds the current trochoidal recipe window.\";\n        if (!hardRejectReason && reachMargin != null && reachMargin < 0) hardRejectReason = \"Usable length is shorter than the requested axial depth.\";\n        if (!hardRejectReason && apmxMargin != null && apmxMargin < 0) hardRejectReason = \"APMX is shorter than the requested axial depth.\";\n    \n        metrics = {\n          requestedFeatureType: featureType,\n          requestedFeatureTypeLabel: getFeatureTypeLabel(featureType),\n          requestedFeatureWidthMm: featureWidth,\n          requestedFeatureDepthMm: featureDepth,\n          requestedStartCondition: startCondition,\n          requestedStartConditionLabel: getStartConditionLabel(startCondition),\n          requestedFinishStrategy: finishStrategy,\n          requestedFinishStrategyLabel: getFinishStrategyLabel(finishStrategy),\n          requestedMaterialCondition: materialCondition,\n          requestedStabilityClass: stabilityClass,\n          requestedStabilityLabel: getStabilityLabel(stabilityClass),\n          requestedCoolantSupport: coolantSupport,\n          requestedCoolantSupportLabel: getCoolantSupportLabel(coolantSupport),\n          requestedOpeningMethod: openingMethod,\n          requestedOpeningMethodLabel: getOpeningMethodLabel(openingMethod),\n          requestedTopologyClass: topologyClass,\n          requestedTopologyLabel: getTopologyLabel(topologyClass),\n          dynamicCapabilityClass: dynamic.className,\n          dynamicCapabilityLabel: dynamic.label,\n          dynamicCapabilityScore: dynamic.score,\n          materialSeverityClass: materialSeverity.className,\n          materialSeverityScore: materialSeverity.score,\n          candidateDiameterMm: candidateDiameter,\n          candidateUsableLengthMm: candidateUsableLength,\n          candidateApmxMm: candidateApmx,\n          candidateFluteCount: candidateFluteCount,\n          candidateHelixAngleDeg: toNullableNumber(candidate.milling && candidate.milling.helixAngleDeg),\n          maxToolDiameterMm: maxToolDiameter,\n          reachRequirementMm: reachRequirement,\n          toolToFeatureWidthRatio: toolToWidthRatio,\n          featureWidthToToolRatio: widthToToolRatio,\n          widthRatioPreferredLimit: widthFit.preferredLimit,\n          widthRatioFitClass: widthFit.className,\n          widthRatioFitScore: widthFit.score,\n          estimatedAePctReq: estimatedAePct,\n          estimatedAeMmReq: estimatedAeMm,\n          apRatio: apRatio,\n          depthRatio: depthRatio,\n          recipeVcMin: toNullableNumber(recipe.vc && recipe.vc.min),\n          recipeVcTyp: toNullableNumber(recipe.vc && recipe.vc.typ),\n          recipeVcMax: toNullableNumber(recipe.vc && recipe.vc.max),\n          recipeFzMin: toNullableNumber(recipe.fz && recipe.fz.min),\n          recipeFzTyp: toNullableNumber(recipe.fz && recipe.fz.typ),\n          recipeFzMax: toNullableNumber(recipe.fz && recipe.fz.max),\n          recipeApMin: axialDepthFit.min,\n          recipeApTyp: axialDepthFit.typ,\n          recipeApMax: axialDepthFit.max,\n          recipeApUpperMm: axialDepthFit.upper,\n          recipeAePctMin: radialFit.min,\n          recipeAePctTyp: radialFit.typ,\n          recipeAePctMax: radialFit.max,\n          recipeApFitClass: axialDepthFit.className,\n          recipeApFitScore: axialDepthFit.score,\n          recipeAeFitClass: radialFit.className,\n          recipeAeFitScore: radialFit.score,\n          reachMarginMm: reachMargin,\n          apmxMarginMm: apmxMargin,\n          reachReserveScore: reachReserveScore,\n          toolConceptGuess: candidateConcept,\n          toolConceptDesired: desiredConcept,\n          toolConceptDesiredLabel: getConceptLabel(desiredConcept),\n          toolConceptExplicit: explicitConcept,\n          toolConceptFitClass: conceptFit.className,\n          toolConceptScore: conceptFit.score,\n          openingStrategyClass: openingStrategyClass,\n          openingStrategyLabel: getOpeningMethodLabel(openingStrategyClass),\n          openingFitClass: openingFit.className,\n          openingFitScore: openingFit.score,\n          coolantSupportClass: coolantFit.className,\n          coolantSupportScore: coolantFit.score,\n          chipEvacuationSeverityClass: chipSeverity.className,\n          chipEvacuationSeverityScore: chipSeverity.score,\n          chatterRiskClass: chatterRisk.className,\n          chatterRiskScore: chatterRisk.score,\n          machineLoadClass: machineLoad.className,\n          machineLoadScore: machineLoad.score,\n          roughingFitClass: roughingFit.className,\n          roughingFitScore: roughingFit.score,\n          trochoidalEligibilityFlag: trochoidalEligibility.className,\n          trochoidalEligibilityLabel: trochoidalEligibility.label,\n          trochoidalEligibilityScore: trochoidalEligibility.score,\n          rowConditionStage: row && row.constraints ? row.constraints.conditionStage : null,\n          rowCoolantMode: row && row.constraints ? row.constraints.coolantMode : null,\n          rowRecipeKind: row && row.familyData ? row.familyData.recipeRowKind : null,\n          rpmTyp: rpmTyp,\n          feedTypMmMin: feedTyp,\n          mrrTyp: mrrTyp,\n        };\n        Object.assign(metrics, recipeResult.debug || {});\n    \n        riskPenalty = clamp(\n          (1 - dynamic.score) * 0.38 +\n          chipSeverity.score * 0.24 +\n          chatterRisk.score * 0.18 +\n          (roughingFit.className === \"final_geometry_not_credible\" ? 0.14 : 0) +\n          (widthFit.className === \"poor\" ? 0.08 : 0),\n          0,\n          1\n        );\n    \n        parts = {\n          material: kernel.materialFit(candidate, ctx) * 1.1,\n          process: kernel.processFit(candidate, ctx) * 1.15,\n          trochoidalCase: trochoidalEligibility.score * 1.45,\n          widthRatio: widthFit.score * 1.4,\n          axialDepth: axialDepthFit.score * 1.6,\n          radialEngagement: radialFit.score * 1.45,\n          reach: reachReserveScore * 1.45,\n          dynamics: dynamic.score * 1.35,\n          chipControl: (1 - chipSeverity.score) * 1.1,\n          stability: (1 - chatterRisk.score) * 1.05,\n          toolConcept: conceptFit.score * 0.95,\n          roughingFit: roughingFit.score * 0.92,\n          opening: openingFit.score * 0.82,\n          coolant: coolantFit.score * 0.55,\n          machine: (1 - machineLoad.score) * 0.6,\n          stage: stageFitScore * 0.45,\n          riskPenalty: -riskPenalty,\n        };\n    \n        total = hardRejectReason ? 0 : sumParts(parts);\n        confidence = recipeResult.source === \"exact\" ? 0.92 : recipeResult.source === \"near\" ? 0.82 : recipeResult.source === \"estimated\" ? 0.68 : 0.48;\n        confidence -= dynamicCapability === \"likely\" ? 0.06 : dynamicCapability === \"unknown\" ? 0.12 : 0;\n        confidence -= roughingFit.className === \"final_geometry_not_credible\" ? 0.1 : roughingFit.className === \"roughing_plus_finish_needed\" ? 0.03 : 0;\n        confidence -= widthFit.className === \"poor\" ? 0.08 : widthFit.className === \"conditional\" ? 0.03 : 0;\n        confidence -= chipSeverity.className === \"critical\" ? 0.08 : chipSeverity.className === \"high\" ? 0.04 : 0;\n        confidence = clamp(confidence, 0, 0.97);\n        if (hardRejectReason) confidence = 0;\n    \n        return createScoredCandidate(candidate, {\n          eligible: !hardRejectReason && total > 0,\n          hardRejectReason: hardRejectReason,\n          total: total,\n          parts: parts,\n          confidence: confidence,\n          recipeConfidence: recipeResult.source,\n          reasons: [\n            widthFit.score >= 0.9\n              ? \"The cutter-to-feature width ratio stays inside a credible trochoidal window.\"\n              : \"The cutter is getting close to the opening limit for a clean trochoidal path.\",\n            dynamic.score >= 0.9\n              ? \"CAM and control capability support a real constant-load trochoidal route.\"\n              : dynamic.score >= 0.7\n                ? \"Trochoidal programming still looks plausible, but the dynamic capability is not fully confirmed.\"\n                : \"Process credibility is limited mainly by uncertain dynamic/CAM capability.\",\n            chipSeverity.className === \"low\" || chipSeverity.className === \"medium\"\n              ? \"Chip evacuation still looks manageable for the stated depth and topology.\"\n              : \"Chip evacuation is one of the main risk drivers in this trochoidal case.\",\n            roughingFit.className === \"roughing_native\"\n              ? \"The stated goal matches trochoidal milling well as a roughing-first strategy.\"\n              : roughingFit.className === \"roughing_plus_finish_needed\"\n                ? \"The geometry is more credible as trochoidal roughing followed by a finish pass.\"\n                : \"The requested final-wall demand is stronger than a pure trochoidal roughing route.\",\n            conceptFit.className === \"strong\"\n              ? \"The tool concept lines up well with the expected trochoidal use case.\"\n              : \"Tool concept remains a trade-off between path confinement, stability and productivity.\",\n          ].slice(0, 5),\n        }, recipeResult.recipe, metrics);\n      }).sort(function byScoreDesc(left, right) {\n        return right.score.total - left.score.total;\n      });\n    }\n    \n    exports.derive = derive;\n    exports.validate = validate;\n    exports.prefilter = prefilter;\n    exports.score = score;\n  },\n  \"shopify/advisor-v1-section.js\": function (exports, module, __bundle) {\n    var { normalizeRuntimeConfig } = __bundle.require(\"shopify/runtime-config.js\");\n    var { createEndpointContracts } = __bundle.require(\"shopify/endpoint-contracts.js\");\n    var { createToolFinderApp } = __bundle.require(\"app/bootstrap.js\");\n    var { createRegistry } = __bundle.require(\"app/registry.js\");\n    var { createPresentationShell } = __bundle.require(\"presentation/shell.js\");\n    var { setRuntimeI18n, t, translateText } = __bundle.require(\"presentation/i18n.js\");\n    var { getMaterialProfileLabel } = __bundle.require(\"materials/iso-subgroup-profiles.js\");\n    var { collectMissingIndexableInsertManifestCandidates, composeIndexableMillingCandidates } = __bundle.require(\"catalog/milling-composites.js\");\n    function uniqueStrings(values) {\n      return Array.from(new Set((values || []).filter(Boolean)));\n    }\n    \n    function replaceNamedPlaceholder(template, token, value) {\n      var text = String(template == null ? \"\" : template);\n      if (!text || text.indexOf(\"{{\") < 0) return text;\n      return text.replace(new RegExp(\"\\\\{\\\\{\\\\s*\" + String(token) + \"\\\\s*\\\\}\\\\}\", \"gi\"), value == null ? \"\" : String(value));\n    }\n    \n    function sortByLabel(items) {\n      return (items || []).slice().sort(function compare(left, right) {\n        return String(left.label || left.code || left.id || \"\").localeCompare(String(right.label || right.code || right.id || \"\"));\n      });\n    }\n    \n    var MATERIAL_FAMILY_ORDER = [\"P\", \"M\", \"K\", \"N\", \"S\", \"H\"];\n    var MATERIAL_FAMILY_META = Object.freeze({\n      P: { rgb: [124, 188, 255], name: \"Steel\" },\n      M: { rgb: [255, 229, 140], name: \"Stainless\" },\n      K: { rgb: [255, 160, 160], name: \"Cast Iron\" },\n      N: { rgb: [140, 235, 190], name: \"Non-ferrous\" },\n      S: { rgb: [255, 196, 130], name: \"Superalloys\" },\n      H: { rgb: [210, 215, 225], name: \"Hardened\" },\n    });\n    var PROCESS_LABELS = Object.freeze({\n      drilling_through: \"Through-hole drilling\",\n      drilling_blind: \"Blind-hole drilling\",\n      deep_hole_drilling: \"Deep-hole drilling\",\n      reaming: \"Reaming\",\n      countersinking: \"Countersinking\",\n      chamfering: \"Chamfering\",\n      tapping_blind: \"Tapping blind hole\",\n      tapping_through: \"Tapping through hole\",\n      forming_blind: \"Thread forming blind hole\",\n      forming_through: \"Thread forming through hole\",\n      thread_milling: \"Thread milling\",\n      profile_turning: \"Profile turning\",\n      boring: \"Boring\",\n      grooving: \"Grooving\",\n      diameter_turning: \"Diameter turning\",\n      face_turning: \"Face turning\",\n      slotting: \"Slotting\",\n      shoulder_milling: \"Shoulder milling\",\n      face_milling: \"Face milling\",\n      pocket_milling: \"Pocket milling\",\n      trochoidal_milling: \"Trochoidal milling\",\n      ramping_helical_interpolation: \"Helical interpolation\",\n      high_feed_milling: \"High-feed milling\",\n      copy_milling: \"Copy milling\",\n      plunging: \"Plunging\",\n    });\n    var PROCESS_ICON_FILES = Object.freeze({\n      drilling_through: \"drilling_through_hole.png\",\n      drilling_blind: \"drilling_blind_hole.png\",\n      deep_hole_drilling: \"drilling_through_hole.png\",\n      reaming: \"drilling_reaming.png\",\n      countersinking: \"drilling_countersink.png\",\n      chamfering: \"drilling_chamfer.png\",\n      tapping_blind: \"drilling_thread_blind.png\",\n      tapping_through: \"drilling_thread_through.png\",\n      forming_blind: \"drilling_thread_blind.png\",\n      forming_through: \"drilling_thread_through.png\",\n      thread_milling: \"Turning_Thread_Cutting.png\",\n      profile_turning: \"Turning_Outer_Diameter.png\",\n      boring: \"Turning_boring.png\",\n      grooving: \"Turning_Grooving.png\",\n      diameter_turning: \"Turning_Outer_Diameter.png\",\n      face_turning: \"Turning_Facing.png\",\n      slotting: \"Milling_Slotting.png\",\n      shoulder_milling: \"Milling_Shoulder.png\",\n      face_milling: \"Milling_Facing.png\",\n      pocket_milling: \"Milling_Pocket.png\",\n      trochoidal_milling: \"Milling_Trochoidal.png\",\n      ramping_helical_interpolation: \"Milling_helical_interpolation.png\",\n      high_feed_milling: \"Milling_Facing.png\",\n      copy_milling: \"Milling_Copying.png\",\n      plunging: \"Milling_Pocket.png\",\n    });\n    var DEV_DEBUG_PRODUCT_LIMIT = 8;\n    var DEV_DEBUG_CANDIDATE_LIMIT = 12;\n    var DEV_DEBUG_SCORE_LIMIT = 6;\n    var LAUNCH_STEP_ORDER = Object.freeze([\"step1\", \"step2\", \"step3\", \"step4\"]);\n    \n    function normalizeMaterialCode(value) {\n      return String(value || \"\").trim().toUpperCase();\n    }\n    \n    function getMaterialFamilyKey(value) {\n      var match = normalizeMaterialCode(value).match(/^([PMKNSH])/);\n      return match ? match[1] : \"\";\n    }\n    \n    function materialNumber(value) {\n      var parsed = parseInt(String(value || \"\").replace(/\\D+/g, \"\"), 10);\n      return Number.isNaN(parsed) ? 999 : parsed;\n    }\n    \n    function isoKeyFromMaterialLabel(label) {\n      var match = String(label || \"\").trim().match(/^([PMKNSH])/i);\n      return match ? match[1].toUpperCase() : \"\";\n    }\n    \n    function updateLaunchStepRail(root, activeStepKey) {\n      var wrapper = root && typeof root.closest === \"function\"\n        ? root.closest(\"[data-ev-tool-finder-v1-wrapper]\")\n        : null;\n      var normalizedStepKey = LAUNCH_STEP_ORDER.indexOf(activeStepKey) >= 0 ? activeStepKey : \"step1\";\n      var activeIndex = LAUNCH_STEP_ORDER.indexOf(normalizedStepKey);\n      var chips;\n    \n      if (!wrapper || typeof wrapper.querySelectorAll !== \"function\") return;\n      wrapper.setAttribute(\"data-ev-tool-finder-v1-active-step\", normalizedStepKey);\n      wrapper.setAttribute(\"data-ev-tool-finder-v1-active-step-index\", String(activeIndex + 1));\n      chips = Array.prototype.slice.call(wrapper.querySelectorAll(\"[data-ev-tool-finder-v1-step-chip]\"));\n      chips.forEach(function eachChip(chip) {\n        var chipStepKey = chip.getAttribute(\"data-ev-tool-finder-v1-step-chip\") || \"\";\n        var chipIndex = LAUNCH_STEP_ORDER.indexOf(chipStepKey);\n        var isActive = chipIndex === activeIndex;\n        var isComplete = chipIndex >= 0 && chipIndex < activeIndex;\n    \n        chip.classList.toggle(\"is-active\", isActive);\n        chip.classList.toggle(\"is-complete\", isComplete);\n        if (isActive) {\n          chip.setAttribute(\"aria-current\", \"step\");\n        } else {\n          chip.removeAttribute(\"aria-current\");\n        }\n      });\n    }\n    \n    function subgroupCodeFromMaterialLabel(label) {\n      var text = String(label || \"\").trim();\n      var exactMatch = text.match(/^([PMKNSH])\\s*(\\d+)/i);\n      if (exactMatch) return (exactMatch[1].toUpperCase() + exactMatch[2]);\n      var compactMatch = text.match(/^([PMKNSH]\\d+)/i);\n      return compactMatch ? compactMatch[1].toUpperCase() : \"\";\n    }\n    \n    function titleFromMaterialLabel(label) {\n      return String(label || \"\")\n        .trim()\n        .replace(/^([PMKNSH]\\s*\\d+|[PMKNSH])\\s*[-\u00E2\u20AC\u201C]\\s*/i, \"\")\n        .trim();\n    }\n    \n    function sortMaterialCodes(left, right) {\n      var leftCode = normalizeMaterialCode(left);\n      var rightCode = normalizeMaterialCode(right);\n      var leftNumber = materialNumber(leftCode);\n      var rightNumber = materialNumber(rightCode);\n      if (leftNumber !== rightNumber) return leftNumber - rightNumber;\n      return leftCode.localeCompare(rightCode);\n    }\n    \n    function getMaterialOptionTitle(code, subgroupTitleMap) {\n      var normalizedCode = normalizeMaterialCode(code);\n      var familyKey = getMaterialFamilyKey(normalizedCode);\n      var profileLabel = getMaterialProfileLabel(normalizedCode);\n      if (subgroupTitleMap && subgroupTitleMap[normalizedCode]) {\n        return subgroupTitleMap[normalizedCode];\n      }\n      if (profileLabel) {\n        return profileLabel;\n      }\n      if (normalizedCode.length === 1) {\n        return MATERIAL_FAMILY_META[familyKey]\n          ? translateText(MATERIAL_FAMILY_META[familyKey].name)\n          : t(\"step1.iso_family\", null, { value: normalizedCode });\n      }\n      return t(\"step1.iso_subgroup\", null, { value: normalizedCode });\n    }\n    \n    function buildIsoSubgroupTitleMap(runtimeConfig) {\n      var map = {};\n    \n      (runtimeConfig && Array.isArray(runtimeConfig.isoSubgroupOptions) ? runtimeConfig.isoSubgroupOptions : []).forEach(function eachOption(option) {\n        var label = option && option.label ? String(option.label).trim() : \"\";\n        var code = subgroupCodeFromMaterialLabel(label) || normalizeMaterialCode(option && option.value);\n        var title = titleFromMaterialLabel(label);\n        if (!code || !title) return;\n        map[code] = title;\n      });\n    \n      return map;\n    }\n    \n    function formatProcessLabel(processId) {\n      if (PROCESS_LABELS[processId]) return PROCESS_LABELS[processId];\n      return String(processId || \"\")\n        .split(\"_\")\n        .filter(Boolean)\n        .map(function mapSegment(segment) {\n          return segment.charAt(0).toUpperCase() + segment.slice(1);\n        })\n        .join(\" \");\n    }\n    \n    function getCatalogMaterialCodes(item) {\n      var classification = item && item.classification ? item.classification : {};\n      var attachments = item && item.attachments && item.attachments.materialContext && item.attachments.materialContext.isoGroups\n        ? item.attachments.materialContext.isoGroups.codes || []\n        : [];\n      return uniqueStrings([])\n        .concat(classification.materialSubgroupCodes || [])\n        .concat(classification.materialGroupCodes || [])\n        .concat(attachments || []);\n    }\n    \n    function materialCodesMatch(selectedCode, candidateCode) {\n      var selected = normalizeMaterialCode(selectedCode);\n      var candidate = normalizeMaterialCode(candidateCode);\n      if (!selected || !candidate) return false;\n      if (selected === candidate) return true;\n      return getMaterialFamilyKey(selected) === getMaterialFamilyKey(candidate) && (selected.length === 1 || candidate.length === 1);\n    }\n    \n    function matchesMaterial(item, materialCode) {\n      var codes = getCatalogMaterialCodes(item);\n      if (!materialCode) return true;\n      if (!codes || codes.length === 0) return true;\n      return codes.some(function someCode(code) {\n        return materialCodesMatch(materialCode, code);\n      });\n    }\n    \n    function matchesProcess(item, processId) {\n      var processIds = item && item.classification ? item.classification.processIds || [] : [];\n      if (!processId) return true;\n      if (!processIds || processIds.length === 0) return true;\n      return processIds.indexOf(processId) >= 0;\n    }\n    \n    function findMaterialOption(materialFamilies, materialCode) {\n      var normalizedCode = normalizeMaterialCode(materialCode);\n      var match = null;\n    \n      (materialFamilies || []).some(function someFamily(family) {\n        match = (family.options || []).find(function findOption(option) {\n          return normalizeMaterialCode(option.code) === normalizedCode;\n        }) || null;\n        return !!match;\n      });\n    \n      return match;\n    }\n    \n    function createInfoDisplay(id, label, helpText) {\n      return {\n        id: id,\n        label: label,\n        type: \"display\",\n        helpText: helpText,\n        visible: true,\n        required: false,\n        issues: [],\n      };\n    }\n    \n    function cloneDebugValue(value) {\n      if (value == null) return value;\n      try {\n        return JSON.parse(JSON.stringify(value));\n      } catch (error) {\n        return String(value);\n      }\n    }\n    \n    function summarizeProductEntry(productEntry) {\n      var ids = productEntry && productEntry.ids ? productEntry.ids : {};\n      var catalog = productEntry && productEntry.catalog ? productEntry.catalog : {};\n      var classification = productEntry && productEntry.classification ? productEntry.classification : {};\n      return {\n        productId: ids.productId || null,\n        handle: ids.handle || null,\n        productTitle: catalog.productTitle || null,\n        processIds: uniqueStrings(classification.processIds || []).slice(0, 8),\n        materialCodes: uniqueStrings(getCatalogMaterialCodes(productEntry)).slice(0, 8),\n      };\n    }\n    \n    function summarizeRowCollection(rows) {\n      var list = Array.isArray(rows) ? rows : [];\n      var holeDepthClasses = uniqueStrings(list.map(function mapDepthClass(row) {\n        return row && row.familyData ? row.familyData.holeDepthClass : null;\n      })).slice(0, 6);\n      return {\n        count: list.length,\n        rowKinds: uniqueStrings(list.map(function mapRow(row) {\n          return row && row.rowKind || null;\n        })).slice(0, 8),\n        processIds: uniqueStrings(list.reduce(function collect(result, row) {\n          return result.concat(row && row.constraints && row.constraints.processIds || []);\n        }, [])).slice(0, 8),\n        materialCodes: uniqueStrings(list.reduce(function collect(result, row) {\n          var constraints = row && row.constraints ? row.constraints : {};\n          return result\n            .concat(constraints.materialCodes || [])\n            .concat(constraints.secondaryMaterialCodes || []);\n        }, [])).slice(0, 8),\n        blindThrough: uniqueStrings(list.map(function mapRow(row) {\n          return row && row.constraints ? row.constraints.blindThrough : null;\n        })).slice(0, 4),\n        coolantModes: uniqueStrings(list.map(function mapRow(row) {\n          return row && row.constraints ? row.constraints.coolantMode : null;\n        })).slice(0, 4),\n        holeDepthClass: holeDepthClasses.length > 0 ? holeDepthClasses[0] : null,\n        holeDepthClasses: holeDepthClasses,\n      };\n    }\n    \n    function summarizeCompositeSelection(systemContext, candidateSummary) {\n      var selectedInsert = systemContext && systemContext.selectedInsert ? systemContext.selectedInsert : null;\n      var toolRole = systemContext && systemContext.toolRole ? systemContext.toolRole : null;\n    \n      return {\n        toolRole: toolRole,\n        selectedBody: toolRole === \"composite\" || toolRole === \"body\" ? {\n          variantId: systemContext && systemContext.bodyVariantId || candidateSummary && candidateSummary.variantId || null,\n          productTitle: systemContext && systemContext.bodyProductTitle || candidateSummary && candidateSummary.productTitle || null,\n          variantTitle: systemContext && systemContext.bodyVariantTitle || candidateSummary && candidateSummary.variantTitle || null,\n          sku: systemContext && systemContext.bodySku || candidateSummary && candidateSummary.sku || null,\n          productUrl: systemContext && systemContext.bodyProductUrl || null,\n          fluteCount: systemContext && systemContext.bodyFluteCount != null ? systemContext.bodyFluteCount : candidateSummary && candidateSummary.fluteCount != null ? candidateSummary.fluteCount : null,\n        } : null,\n        selectedInsert: selectedInsert ? {\n          variantId: selectedInsert.variantId || null,\n          productTitle: selectedInsert.productTitle || null,\n          variantTitle: selectedInsert.variantTitle || null,\n          sku: selectedInsert.sku || null,\n          productUrl: selectedInsert.productUrl || null,\n          gradeCode: selectedInsert.gradeCode || null,\n          sizeCode: selectedInsert.sizeCode || null,\n          chipbreaker: selectedInsert.chipbreaker || null,\n          cornerRadiusMm: selectedInsert.cornerRadiusMm != null ? selectedInsert.cornerRadiusMm : null,\n        } : null,\n      };\n    }\n    \n    function summarizeRecipeSelection(metrics) {\n      var source = metrics && metrics.selectedRecipeSource ? metrics.selectedRecipeSource : null;\n      return {\n        selectedRecipeSource: source,\n        selectedRecipeRow: cloneDebugValue(metrics && metrics.selectedRecipeRow || null),\n        selectedVcRow: cloneDebugValue(metrics && metrics.selectedVcRow || null),\n        selectedFzRow: cloneDebugValue(metrics && metrics.selectedFzRow || null),\n      };\n    }\n    \n    function summarizeCandidate(candidate) {\n      var ids = candidate && candidate.ids ? candidate.ids : {};\n      var catalog = candidate && candidate.catalog ? candidate.catalog : {};\n      var commerce = candidate && candidate.commerce ? candidate.commerce : {};\n      var classification = candidate && candidate.classification ? candidate.classification : {};\n      var common = candidate && candidate.common ? candidate.common : {};\n      var threading = candidate && candidate.threading ? candidate.threading : {};\n      var attachments = candidate && candidate.attachments ? candidate.attachments : {};\n      var systemContext = attachments.systemContext || {};\n      var rows = candidate && candidate.rows ? candidate.rows : {};\n      var compositeSelection;\n    \n      compositeSelection = summarizeCompositeSelection(systemContext, {\n        variantId: ids.variantId || null,\n        productTitle: catalog.productTitle || null,\n        variantTitle: catalog.variantTitle || null,\n        sku: ids.sku || null,\n      });\n    \n      return {\n        variantId: ids.variantId || null,\n        sku: ids.sku || null,\n        handle: ids.handle || null,\n        stage: candidate && candidate.stage || null,\n        productTitle: catalog.productTitle || null,\n        variantTitle: catalog.variantTitle || null,\n        available: Object.prototype.hasOwnProperty.call(commerce, \"available\") ? commerce.available : null,\n        priceCents: commerce.priceCents != null ? commerce.priceCents : null,\n        processIds: uniqueStrings(classification.processIds || []).slice(0, 8),\n        materialCodes: uniqueStrings(classification.materialSubgroupCodes || []).slice(0, 8),\n        diameterMm: common.diameterMm != null ? common.diameterMm : null,\n        fluteCount: common.fluteCount != null ? common.fluteCount : null,\n        usableLengthMm: common.usableLengthMm != null ? common.usableLengthMm : null,\n        coolantTsc: Object.prototype.hasOwnProperty.call(common, \"coolantTsc\") ? common.coolantTsc : null,\n        threading: {\n          threadForm: threading.threadForm || null,\n          threadSize: threading.threadSize || null,\n          tapTolerance: threading.tapTolerance || null,\n          tapChamferForm: threading.tapChamferForm || null,\n          tapHelixDeg: threading.tapHelixDeg != null ? threading.tapHelixDeg : null,\n        },\n        rowSummary: {\n          drilling: summarizeRowCollection(rows.drilling),\n          threading: summarizeRowCollection(rows.threading),\n          milling: summarizeRowCollection(rows.milling),\n          turning: summarizeRowCollection(rows.turning),\n        },\n        toolRole: compositeSelection.toolRole,\n        selectedBody: compositeSelection.selectedBody,\n        selectedInsert: compositeSelection.selectedInsert,\n        catalogDebug: cloneDebugValue(attachments.catalogDebug || null),\n      };\n    }\n    \n    function summarizeScoredCandidate(scoredCandidate) {\n      var candidateSummary = summarizeCandidate(scoredCandidate && scoredCandidate.candidate);\n      var score = scoredCandidate && scoredCandidate.score ? scoredCandidate.score : {};\n      var metrics = scoredCandidate && scoredCandidate.metrics ? scoredCandidate.metrics : {};\n      var recipeSelection = summarizeRecipeSelection(scoredCandidate && scoredCandidate.metrics || {});\n      return {\n        variantId: candidateSummary.variantId,\n        sku: candidateSummary.sku,\n        productTitle: candidateSummary.productTitle,\n        variantTitle: candidateSummary.variantTitle,\n        processIds: candidateSummary.processIds,\n        materialCodes: candidateSummary.materialCodes,\n        fluteCount: candidateSummary.fluteCount,\n        threading: candidateSummary.threading,\n        catalogDebug: candidateSummary.catalogDebug,\n        eligible: score.eligible === false ? false : true,\n        total: score.total != null ? score.total : 0,\n        confidence: score.confidence != null ? score.confidence : 0,\n        recipeConfidence: score.recipeConfidence || \"none\",\n        hardRejectReason: score.hardRejectReason || null,\n        reasons: (score.reasons || []).slice(0, 5),\n        parts: cloneDebugValue(score.parts || {}),\n        toolRole: candidateSummary.toolRole,\n        selectedBody: cloneDebugValue(candidateSummary.selectedBody),\n        selectedInsert: cloneDebugValue(candidateSummary.selectedInsert),\n        candidateFluteCount: metrics.candidateFluteCount != null ? metrics.candidateFluteCount : candidateSummary.fluteCount,\n        selectedRecipeSource: recipeSelection.selectedRecipeSource,\n        selectedRecipeRow: recipeSelection.selectedRecipeRow,\n        selectedVcRow: recipeSelection.selectedVcRow,\n        selectedFzRow: recipeSelection.selectedFzRow,\n      };\n    }\n    \n    function summarizeResultViewModel(resultViewModel) {\n      if (!resultViewModel) return null;\n      return {\n        processId: resultViewModel.processId || null,\n        outcome: resultViewModel.outcome || null,\n        summary: resultViewModel.summary || null,\n        heroVariantId: resultViewModel.heroVariantId || null,\n        blockTypes: (resultViewModel.blocks || []).filter(function keepBlock(block) {\n          return !!block && block.visible !== false;\n        }).map(function mapBlock(block) {\n          return block.blockType;\n        }),\n        actionTypes: (resultViewModel.actions || []).map(function mapAction(action) {\n          return action.type;\n        }),\n      };\n    }\n    \n    function summarizeQuestionViewModelForDebug(viewModel) {\n      if (!viewModel) return null;\n      return {\n        id: viewModel.id || null,\n        type: viewModel.type || null,\n        label: viewModel.label || null,\n        helpText: viewModel.helpText || null,\n        placeholder: viewModel.placeholder || null,\n        unit: viewModel.unit || null,\n        selectedValue: viewModel.value != null ? viewModel.value : null,\n        optionLabels: Array.isArray(viewModel.options)\n          ? viewModel.options.slice(0, 8).map(function mapOption(option) {\n              return {\n                value: option && option.value != null ? option.value : null,\n                label: option && option.label != null ? option.label : null,\n              };\n            })\n          : [],\n        issues: Array.isArray(viewModel.issues)\n          ? viewModel.issues.map(function mapIssue(issue) {\n              return {\n                code: issue && issue.code ? issue.code : null,\n                message: issue && issue.message ? issue.message : null,\n              };\n            })\n          : [],\n      };\n    }\n    \n    function applyRootMetadata(root, runtimeConfig, endpoints) {\n      if (!root) return;\n      root.dataset.tfv1Section = runtimeConfig.sectionKey;\n      root.dataset.tfv1Mode = runtimeConfig.mode;\n      root.dataset.tfv1Shadow = runtimeConfig.shadowModeEnabled ? \"true\" : \"false\";\n      root.dataset.tfv1EndpointSource = endpoints.usesLegacyReadOnlySources() ? \"legacy_read_only\" : \"v1_owned\";\n    }\n    \n    function createWizardController(section) {\n      var app = section.app;\n      var registry = section.registry;\n      var shell = section.shell;\n      var debugReporter = typeof section.onDebugUpdate === \"function\" ? section.onDebugUpdate : null;\n      var processIconUrls = section.runtimeConfig && section.runtimeConfig.processIconUrls\n        ? section.runtimeConfig.processIconUrls\n        : {};\n      var subgroupTitleMap = buildIsoSubgroupTitleMap(section.runtimeConfig);\n      var debugState = {\n        event: \"init\",\n        matchingProductCount: 0,\n        matchingProducts: [],\n        manifestCandidateCount: 0,\n        manifestCandidates: [],\n        detailCandidateCount: 0,\n        detailCandidates: [],\n        scoredCandidateCount: 0,\n        scoredCandidates: [],\n      };\n      var state = {\n        products: null,\n        manifestCandidates: null,\n        materials: [],\n        materialCode: null,\n        processes: [],\n        processId: null,\n        answers: {},\n        questionViewModels: [],\n        validationIssues: [],\n        result: null,\n        loadingMaterials: false,\n        scoring: false,\n        processSearch: \"\",\n        materialError: null,\n        resultError: null,\n      };\n    \n      function resetDebugSelection() {\n        debugState.matchingProductCount = 0;\n        debugState.matchingProducts = [];\n        debugState.manifestCandidateCount = 0;\n        debugState.manifestCandidates = [];\n        debugState.detailCandidateCount = 0;\n        debugState.detailCandidates = [];\n        debugState.scoredCandidateCount = 0;\n        debugState.scoredCandidates = [];\n      }\n    \n      function publishDebug(eventName) {\n        var storeState;\n        if (!debugReporter) return;\n        if (eventName) {\n          debugState.event = eventName;\n        }\n        storeState = app.store.getState();\n        debugReporter({\n          event: debugState.event,\n          loadingMaterials: state.loadingMaterials,\n          scoring: state.scoring,\n          materialCode: state.materialCode,\n          processId: state.processId,\n          processLabel: state.processId ? formatProcessLabel(state.processId) : null,\n          answers: cloneDebugValue(state.answers || {}),\n          validationIssues: cloneDebugValue(state.validationIssues || []),\n          errors: {\n            material: state.materialError,\n            result: state.resultError,\n          },\n          catalog: {\n            productCount: state.products ? state.products.length : 0,\n            manifestPoolCount: state.manifestCandidates ? state.manifestCandidates.length : 0,\n            materialFamilyCount: state.materials.length,\n            availableProcesses: state.processes.filter(function keepProcess(processEntry) {\n              return processEntry && processEntry.available;\n            }).map(function mapProcess(processEntry) {\n              return processEntry.id;\n            }).slice(0, 12),\n          },\n          selection: {\n            matchingProductCount: debugState.matchingProductCount,\n            manifestCandidateCount: debugState.manifestCandidateCount,\n            detailCandidateCount: debugState.detailCandidateCount,\n            matchingProducts: cloneDebugValue(debugState.matchingProducts),\n            manifestCandidates: cloneDebugValue(debugState.manifestCandidates),\n            detailCandidates: cloneDebugValue(debugState.detailCandidates),\n          },\n          scoringSummary: {\n            scoredCandidateCount: debugState.scoredCandidateCount,\n            scoredCandidates: cloneDebugValue(debugState.scoredCandidates),\n          },\n          store: {\n            materialCode: storeState.materialCode || null,\n            processId: storeState.processId || null,\n            derived: cloneDebugValue(storeState.derived || {}),\n            result: summarizeResultViewModel(storeState.result || null),\n          },\n          questions: {\n            count: Array.isArray(state.questionViewModels) ? state.questionViewModels.length : 0,\n            ids: Array.isArray(state.questionViewModels)\n              ? state.questionViewModels.slice(0, 24).map(function mapQuestion(viewModel) {\n                  return viewModel && viewModel.id ? viewModel.id : null;\n                }).filter(Boolean)\n              : [],\n            faceSizeL: summarizeQuestionViewModelForDebug(\n              Array.isArray(state.questionViewModels)\n                ? state.questionViewModels.find(function findQuestion(viewModel) {\n                    return viewModel && viewModel.id === \"face_size_l_mm\";\n                  })\n                : null\n            ),\n            firstVisible: summarizeQuestionViewModelForDebug(\n              Array.isArray(state.questionViewModels) && state.questionViewModels.length\n                ? state.questionViewModels[0]\n                : null\n            ),\n          },\n          result: summarizeResultViewModel(state.result),\n        });\n      }\n    \n      function addMaterialCodeToFamilyMap(familyMap, rawCode) {\n        var code = normalizeMaterialCode(rawCode);\n        var familyKey = getMaterialFamilyKey(code);\n        var familyMeta;\n    \n        if (!familyKey) return;\n        if (!familyMap[familyKey]) {\n          familyMeta = MATERIAL_FAMILY_META[familyKey] || { rgb: [120, 120, 120], name: familyKey };\n          familyMap[familyKey] = {\n            key: familyKey,\n            title: translateText(familyKey + \" - \" + familyMeta.name),\n            rgb: familyMeta.rgb,\n            options: [],\n          };\n        }\n        if (!familyMap[familyKey].options.some(function hasOption(option) { return option.code === code; })) {\n          familyMap[familyKey].options.push({\n            code: code,\n            title: getMaterialOptionTitle(code, subgroupTitleMap),\n            familyKey: familyKey,\n          });\n        }\n      }\n    \n      function finalizeMaterialFamilies(familyMap) {\n        return MATERIAL_FAMILY_ORDER.filter(function filterFamily(key) {\n          return !!familyMap[key];\n        }).map(function mapFamily(key) {\n          var options = familyMap[key].options.slice().sort(function compare(left, right) {\n            return sortMaterialCodes(left.code, right.code);\n          });\n          if (options.some(function hasSubgroup(option) { return normalizeMaterialCode(option.code).length > 1; })) {\n            options = options.filter(function keepOption(option) {\n              return normalizeMaterialCode(option.code).length > 1;\n            });\n          }\n          familyMap[key].options = options;\n          return familyMap[key];\n        });\n      }\n    \n      function deriveMaterialOptions() {\n        var familyMap = {};\n    \n        (state.products || []).forEach(function eachProduct(productEntry) {\n          getCatalogMaterialCodes(productEntry).forEach(function eachCode(code) {\n            addMaterialCodeToFamilyMap(familyMap, code);\n          });\n        });\n    \n        (state.manifestCandidates || []).forEach(function eachCandidate(candidate) {\n          getCatalogMaterialCodes(candidate).forEach(function eachCode(code) {\n            addMaterialCodeToFamilyMap(familyMap, code);\n          });\n        });\n    \n        return finalizeMaterialFamilies(familyMap);\n      }\n    \n      function hasExactSubgroups(materialFamilies) {\n        return (materialFamilies || []).some(function someFamily(family) {\n          return (family.options || []).some(function someOption(option) {\n            return normalizeMaterialCode(option.code).length > 1;\n          });\n        });\n      }\n    \n      function getProcessIconUrl(processId, family) {\n        var fileName = PROCESS_ICON_FILES[processId];\n        var fallbackFamily = family || \"milling\";\n        if (fileName && processIconUrls[fileName]) return processIconUrls[fileName];\n        if (fileName && processIconUrls[processId]) return processIconUrls[processId];\n        if (fallbackFamily === \"turning\" && processIconUrls[\"Turning_Outer_Diameter.png\"]) return processIconUrls[\"Turning_Outer_Diameter.png\"];\n        if (fallbackFamily === \"drilling\" && processIconUrls[\"drilling_through_hole.png\"]) return processIconUrls[\"drilling_through_hole.png\"];\n        if (fallbackFamily === \"threading\" && processIconUrls[\"Turning_Thread_Cutting.png\"]) return processIconUrls[\"Turning_Thread_Cutting.png\"];\n        if (fallbackFamily === \"milling\" && processIconUrls[\"Milling_Facing.png\"]) return processIconUrls[\"Milling_Facing.png\"];\n        return null;\n      }\n    \n      function deriveAvailableProcessIds() {\n        var sources = [];\n        var matchingProducts;\n        var matchingManifests;\n    \n        if (!state.materialCode) return {};\n    \n        matchingProducts = (state.products || []).filter(function keepProduct(productEntry) {\n          return matchesMaterial(productEntry, state.materialCode);\n        });\n        matchingManifests = (state.manifestCandidates || []).filter(function keepCandidate(candidate) {\n          return matchesMaterial(candidate, state.materialCode);\n        });\n        sources = sources.concat(matchingProducts).concat(matchingManifests);\n    \n        return uniqueStrings(sources.reduce(function collect(list, item) {\n          return list.concat(item && item.classification && item.classification.processIds || []);\n        }, [])).reduce(function reduceMap(map, processId) {\n          map[processId] = true;\n          return map;\n        }, {});\n      }\n    \n      function deriveProcessInventory() {\n        var availableProcessIds = deriveAvailableProcessIds();\n        return sortByLabel(registry.list().map(function mapProcess(processModule) {\n          return {\n            id: processModule.id,\n            family: processModule.family,\n            label: formatProcessLabel(processModule.id),\n            available: !!state.materialCode && !!availableProcessIds[processModule.id],\n            iconUrl: getProcessIconUrl(processModule.id, processModule.family),\n          };\n        }));\n      }\n    \n      function rebuildQuestionState() {\n        var runtime;\n        if (!state.processId) return null;\n        app.store.setState({ materialCode: state.materialCode });\n        runtime = app.buildQuestionState(state.processId, state.answers);\n        state.questionViewModels = runtime.viewModels;\n        state.validationIssues = runtime.issues;\n        return runtime;\n      }\n    \n      function render() {\n        var step1Description = state.loadingMaterials\n          ? t(\"controller.step1.loading_description\", null)\n          : state.materialError\n            ? replaceNamedPlaceholder(\n              t(\"controller.step1.catalog_load_failed\", null, { message: state.materialError }),\n              \"message\",\n              state.materialError\n            )\n            : t(\"controller.step1.ready_description\", null);\n        var step2Description = !state.materialCode\n          ? t(\"controller.step2.locked_description\", null)\n          : t(\"controller.step2.ready_description\", null);\n        var step3ViewModels = state.processId\n          ? state.questionViewModels\n          : [createInfoDisplay(\n            \"process_required\",\n            t(\"controller.step3.process_required_label\", null),\n            t(\"controller.step3.process_required_help\", null)\n          )];\n        var resultViewModel = state.result;\n        var storeState = app.store.getState();\n    \n        if (state.resultError) {\n          resultViewModel = {\n            processId: state.processId || null,\n            outcome: \"insufficient_data\",\n            summary: t(\"controller.step4.error_summary\", null),\n            heroVariantId: null,\n            blocks: [{\n              blockType: \"no_match_guidance\",\n              title: t(\"controller.step4.data_path\", null),\n              data: {\n                message: state.resultError,\n                paragraphs: [t(\"controller.step4.error_retry_paragraph\", null)],\n              },\n              visible: true,\n            }],\n            actions: [{ type: \"back_to_step3\", label: t(\"controller.step4.back_to_step3_action\", null) }],\n          };\n        }\n    \n        var selectedMaterial = findMaterialOption(state.materials, state.materialCode);\n        var selectedProcessLabel = state.processId ? translateText(formatProcessLabel(state.processId)) : null;\n        var activeStepKey = resultViewModel\n          ? \"step4\"\n          : state.processId\n            ? \"step3\"\n            : state.materialCode\n              ? \"step2\"\n              : \"step1\";\n    \n        if (typeof shell.renderLoadingOverlay === \"function\") {\n          shell.renderLoadingOverlay({\n            visible: state.loadingMaterials || state.scoring,\n            phase: state.loadingMaterials ? \"catalog\" : state.scoring ? \"scoring\" : null,\n            processLabel: selectedProcessLabel,\n            media: section.runtimeConfig && section.runtimeConfig.advisorMedia,\n          });\n        }\n    \n        shell.renderStep1({\n          description: step1Description,\n          families: state.materials,\n          selectedCode: state.materialCode,\n          onSelect: function onMaterialSelect(material) {\n            resetDebugSelection();\n            debugState.event = \"material_selected\";\n            state.materialCode = material.code;\n            state.processId = null;\n            state.processSearch = \"\";\n            state.answers = {};\n            state.questionViewModels = [];\n            state.validationIssues = [];\n            state.result = null;\n            state.resultError = null;\n            app.store.setState({\n              materialCode: material.code,\n              processId: null,\n              answers: {},\n              derived: {},\n              questionState: [],\n              questionViewModels: [],\n              validationIssues: [],\n              result: null,\n            });\n            state.processes = deriveProcessInventory();\n            render();\n            if (typeof shell.scrollToStep === \"function\") shell.scrollToStep(\"step2\");\n          },\n        });\n    \n        shell.renderStep2({\n          description: step2Description,\n          materialReady: !!state.materialCode,\n          processes: state.processes,\n          searchTerm: state.processSearch,\n          selectedProcessId: state.processId,\n          onSearchChange: function onSearchChange(value) {\n            debugState.event = \"process_search_changed\";\n            state.processSearch = value;\n            render();\n          },\n          onSelect: function onProcessSelect(processModule) {\n            if (!processModule || processModule.available === false) return;\n            resetDebugSelection();\n            debugState.event = \"process_selected\";\n            state.processId = processModule.id;\n            state.answers = {};\n            state.result = null;\n            state.resultError = null;\n            rebuildQuestionState();\n            render();\n            if (typeof shell.scrollToStep === \"function\") shell.scrollToStep(\"step3\");\n          },\n        });\n    \n        shell.renderStep3({\n          materialCode: state.materialCode,\n          materialLabel: selectedMaterial ? selectedMaterial.title : null,\n          processId: state.processId,\n          processLabel: selectedProcessLabel,\n          derived: storeState.derived || {},\n          questionViewModels: step3ViewModels,\n          answers: state.answers,\n          validationIssues: state.validationIssues,\n          step3Sketches: section.runtimeConfig && section.runtimeConfig.step3Sketches || {},\n          submitLabel: state.scoring\n            ? t(\"controller.step3.loading_result\", null)\n            : t(\"common.show_result\", null),\n          onChange: function onAnswerChange(questionId, value) {\n            debugState.event = \"answers_updated\";\n            state.answers[questionId] = value;\n            rebuildQuestionState();\n            render();\n          },\n          onSubmit: function onSubmit() {\n            if (!state.processId || state.scoring) return;\n            runScoring();\n          },\n        });\n    \n        shell.renderStep4({\n          resultViewModel: resultViewModel,\n          runtimeConfig: section.runtimeConfig,\n          materialCode: state.materialCode,\n          materialLabel: selectedMaterial ? selectedMaterial.title : null,\n          processId: state.processId,\n          processLabel: selectedProcessLabel,\n          answers: state.answers,\n          normalizedAnswers: storeState.answers || {},\n          questionViewModels: state.questionViewModels || [],\n          onAction: function onAction(action) {\n            if (action && action.type === \"back_to_step3\") {\n              debugState.event = \"back_to_step3\";\n              state.result = null;\n              state.resultError = null;\n              render();\n              if (typeof shell.scrollToStep === \"function\") shell.scrollToStep(\"step3\");\n            }\n          },\n        });\n        if (typeof shell.setActiveStep === \"function\") {\n          shell.setActiveStep(activeStepKey);\n        }\n        updateLaunchStepRail(section.root, activeStepKey);\n        publishDebug();\n      }\n    \n      async function ensureManifestCandidatesLoaded() {\n        var manifestLists;\n    \n        if (state.manifestCandidates) return state.manifestCandidates;\n        if (!state.products || state.products.length === 0) {\n          state.manifestCandidates = [];\n          return state.manifestCandidates;\n        }\n    \n        manifestLists = await Promise.all(state.products.map(function eachProduct(productEntry) {\n          return app.loadVariantManifestForProduct(productEntry);\n        }));\n        state.manifestCandidates = manifestLists.reduce(function flatten(list, items) {\n          return list.concat(items);\n        }, []);\n        debugState.event = \"manifest_pool_loaded\";\n        state.materials = deriveMaterialOptions();\n        state.processes = deriveProcessInventory();\n        return state.manifestCandidates;\n      }\n    \n      async function ensureProductsLoaded() {\n        if (state.products) return state.products;\n        debugState.event = \"catalog_loading\";\n        state.loadingMaterials = true;\n        state.materialError = null;\n        render();\n        try {\n          state.products = await app.loadProductIndex();\n          debugState.event = \"catalog_loaded\";\n          state.materials = deriveMaterialOptions();\n          state.processes = deriveProcessInventory();\n          if (!hasExactSubgroups(state.materials)) {\n            await ensureManifestCandidatesLoaded();\n          }\n          return state.products;\n        } catch (error) {\n          debugState.event = \"catalog_error\";\n          state.products = [];\n          state.manifestCandidates = [];\n          state.materials = [];\n          state.processes = [];\n          state.materialError = error && error.message ? error.message : String(error);\n          throw error;\n        } finally {\n          state.loadingMaterials = false;\n          render();\n        }\n      }\n    \n      async function loadCandidatesForSelection() {\n        var productEntries;\n        var manifestLists;\n        var manifestCandidates;\n        var detailCandidates;\n        var missingInsertManifests;\n        var extraInsertDetails;\n    \n        await ensureProductsLoaded();\n        productEntries = state.products.filter(function keepProduct(productEntry) {\n          return matchesMaterial(productEntry, state.materialCode) && matchesProcess(productEntry, state.processId);\n        });\n        debugState.matchingProductCount = productEntries.length;\n        debugState.matchingProducts = productEntries.map(summarizeProductEntry).slice(0, DEV_DEBUG_PRODUCT_LIMIT);\n        manifestLists = await Promise.all(productEntries.map(function eachProduct(productEntry) {\n          return app.loadVariantManifestForProduct(productEntry);\n        }));\n        manifestCandidates = manifestLists.reduce(function flatten(list, items) {\n          return list.concat(items);\n        }, []).filter(function keepCandidate(candidate) {\n          return matchesMaterial(candidate, state.materialCode) && matchesProcess(candidate, state.processId);\n        });\n        debugState.manifestCandidateCount = manifestCandidates.length;\n        debugState.manifestCandidates = manifestCandidates.map(summarizeCandidate).slice(0, DEV_DEBUG_CANDIDATE_LIMIT);\n        detailCandidates = await Promise.all(manifestCandidates.map(function eachCandidate(candidate) {\n          return app.loadCandidateDetail(candidate);\n        }));\n        missingInsertManifests = collectMissingIndexableInsertManifestCandidates(detailCandidates);\n        if (missingInsertManifests.length > 0) {\n          extraInsertDetails = await Promise.all(missingInsertManifests.map(function eachInsertCandidate(candidate) {\n            return app.loadCandidateDetail(candidate).catch(function ignoreInsertLoadError() {\n              return null;\n            });\n          }));\n          detailCandidates = detailCandidates.concat(extraInsertDetails.filter(Boolean));\n        }\n        detailCandidates = composeIndexableMillingCandidates(detailCandidates);\n        debugState.detailCandidateCount = detailCandidates.length;\n        debugState.detailCandidates = detailCandidates.map(summarizeCandidate).slice(0, DEV_DEBUG_CANDIDATE_LIMIT);\n        publishDebug(\"candidates_loaded\");\n        return detailCandidates;\n      }\n    \n      async function runScoring() {\n        var candidates;\n        var storeState;\n        debugState.event = \"scoring_started\";\n        debugState.scoredCandidates = [];\n        state.scoring = true;\n        state.resultError = null;\n        render();\n        try {\n          rebuildQuestionState();\n          candidates = await loadCandidatesForSelection();\n          state.result = app.scoreCandidates(candidates);\n          storeState = app.store.getState();\n          debugState.scoredCandidateCount = (storeState.scored || []).length;\n          debugState.scoredCandidates = (storeState.scored || []).map(summarizeScoredCandidate).slice(0, DEV_DEBUG_SCORE_LIMIT);\n          debugState.event = \"scoring_complete\";\n        } catch (error) {\n          debugState.event = \"scoring_error\";\n          state.result = null;\n          state.resultError = error && error.message ? error.message : String(error);\n        } finally {\n          state.scoring = false;\n          render();\n          if (typeof shell.scrollToStep === \"function\") shell.scrollToStep(\"step4\");\n        }\n      }\n    \n      return {\n        state: state,\n        ensureProductsLoaded: ensureProductsLoaded,\n        render: render,\n        start: async function start() {\n          state.loadingMaterials = !state.products;\n          render();\n          try {\n            await ensureProductsLoaded();\n          } catch (error) {\n            return false;\n          }\n          return true;\n        },\n      };\n    }\n    \n    function mountAdvisorV1Section(options) {\n      var source = options || {};\n      var runtimeConfig = normalizeRuntimeConfig(source.runtimeConfig || {});\n      var endpoints = createEndpointContracts(runtimeConfig);\n      var registry = source.registry || createRegistry();\n      var shell = source.root ? createPresentationShell({ root: source.root }) : null;\n      var app;\n      var controller = null;\n      var ready = Promise.resolve(true);\n    \n      endpoints.validate();\n      setRuntimeI18n(Object.assign({}, runtimeConfig.i18n || {}, {\n        __locale: runtimeConfig.locale || \"en\",\n        __sourceLocale: \"en\",\n      }));\n      applyRootMetadata(source.root, runtimeConfig, endpoints);\n    \n      app = createToolFinderApp({\n        fetchImpl: source.fetchImpl || (typeof window !== \"undefined\" && window.fetch ? window.fetch.bind(window) : null),\n        registry: registry,\n        runtimeConfig: runtimeConfig,\n        endpoints: endpoints,\n      });\n    \n      if (shell) {\n        controller = createWizardController({\n          app: app,\n          registry: registry,\n          root: source.root,\n          shell: shell,\n          runtimeConfig: runtimeConfig,\n          onDebugUpdate: source.onDebugUpdate,\n        });\n        ready = controller.start();\n      }\n    \n      return {\n        app: app,\n        registry: registry,\n        runtimeConfig: runtimeConfig,\n        endpoints: endpoints,\n        shell: shell,\n        controller: controller,\n        ready: ready,\n        validateIntegration: function validateIntegration() {\n          return endpoints.validate();\n        },\n        describeIntegration: function describeIntegration() {\n          return {\n            sectionKey: runtimeConfig.sectionKey,\n            shadowModeEnabled: runtimeConfig.shadowModeEnabled,\n            usesLegacyReadOnlySources: endpoints.usesLegacyReadOnlySources(),\n            endpoints: endpoints.describe(),\n          };\n        },\n      };\n    }\n    \n    exports.summarizeCandidate = summarizeCandidate;\n    exports.summarizeScoredCandidate = summarizeScoredCandidate;\n    exports.mountAdvisorV1Section = mountAdvisorV1Section;\n  },\n  \"shopify/dev-theme/dev-theme-manifest.js\": function (exports, module, __bundle) {\n    var DEV_THEME_SECTION_HANDLES = Object.freeze({\n      v1: \"ev-tf-pro\",\n    });\n    \n    var DEV_THEME_ASSET_NAMES = Object.freeze({\n      stylesheet: \"ev-tf-pro.css\",\n      entry: \"ev-tf-pro.js\",\n    });\n    \n    var DEV_THEME_BUILD_ARTIFACTS = Object.freeze({\n      manifest: \"build-manifest.json\",\n      report: \"build-report.txt\",\n    });\n    \n    var DEV_THEME_SELECTORS = Object.freeze({\n      v1Root: \"[data-ev-tool-finder-v1-root]\",\n      shadowRoot: \"[data-ev-tool-shadow-v1-root]\",\n      diagnostics: \"[data-ev-tool-finder-v1-diagnostics]\",\n      configScript: \"script[data-ev-tool-finder-v1-config]\",\n    });\n    \n    var DEV_THEME_READ_ONLY_SOURCE_HINTS = Object.freeze([\n      {\n        id: \"productIndex\",\n        label: \"Legacy product index\",\n        pathTemplate: \"/sections/product-index\",\n        ownership: \"legacy_read_only\",\n      },\n      {\n        id: \"variantManifest\",\n        label: \"Legacy variant manifest\",\n        pathTemplate: \"/sections/variant-manifest/:handle\",\n        ownership: \"legacy_read_only\",\n      },\n      {\n        id: \"productDetail\",\n        label: \"Legacy product detail\",\n        pathTemplate: \"/sections/product-detail/:handle/:variantId\",\n        ownership: \"legacy_read_only\",\n      },\n      {\n        id: \"processMetadata\",\n        label: \"Legacy process metadata\",\n        pathTemplate: \"/sections/process-metadata\",\n        ownership: \"legacy_read_only\",\n      },\n    ]);\n    \n    function getDevThemeSourceMap() {\n      return {\n        sourceRoot: \"shopify/dev-theme/source\",\n        themeRoot: \"shopify/dev-theme/theme\",\n        sections: [\n          {\n            id: DEV_THEME_SECTION_HANDLES.v1,\n            target: \"sections/\" + DEV_THEME_SECTION_HANDLES.v1 + \".liquid\",\n            entryAsset: DEV_THEME_ASSET_NAMES.entry,\n            stylesheetAsset: DEV_THEME_ASSET_NAMES.stylesheet,\n          },\n        ],\n        assetEntries: [\n          {\n            id: \"finder_bundle\",\n            source: \"shopify/dev-theme/source/ev-tool-finder-v1-entry.js\",\n            target: \"assets/\" + DEV_THEME_ASSET_NAMES.entry,\n          },\n          {\n            id: \"stylesheet\",\n            source: \"shopify/dev-theme/source/\" + DEV_THEME_ASSET_NAMES.stylesheet,\n            target: \"assets/\" + DEV_THEME_ASSET_NAMES.stylesheet,\n          },\n        ],\n        buildArtifacts: [\n          {\n            id: \"manifest\",\n            target: DEV_THEME_BUILD_ARTIFACTS.manifest,\n          },\n          {\n            id: \"report\",\n            target: DEV_THEME_BUILD_ARTIFACTS.report,\n          },\n        ],\n        readOnlySourceHints: DEV_THEME_READ_ONLY_SOURCE_HINTS.slice(),\n      };\n    }\n    \n    exports.getDevThemeSourceMap = getDevThemeSourceMap;\n    exports.DEV_THEME_SECTION_HANDLES = DEV_THEME_SECTION_HANDLES;\n    exports.DEV_THEME_ASSET_NAMES = DEV_THEME_ASSET_NAMES;\n    exports.DEV_THEME_BUILD_ARTIFACTS = DEV_THEME_BUILD_ARTIFACTS;\n    exports.DEV_THEME_SELECTORS = DEV_THEME_SELECTORS;\n    exports.DEV_THEME_READ_ONLY_SOURCE_HINTS = DEV_THEME_READ_ONLY_SOURCE_HINTS;\n  },\n  \"shopify/dev-theme/source/dom-mount.js\": function (exports, module, __bundle) {\n    var { ensure } = __bundle.require(\"catalog/contracts.js\");\n    var { DEV_THEME_SELECTORS } = __bundle.require(\"shopify/dev-theme/dev-theme-manifest.js\");\n    function getWindowObject() {\n      return typeof window !== \"undefined\" ? window : null;\n    }\n    \n    function getDocumentObject(scope) {\n      if (scope && scope.ownerDocument) return scope.ownerDocument;\n      if (typeof document !== \"undefined\") return document;\n      return null;\n    }\n    \n    function normalizeContainer(scope) {\n      return scope || getDocumentObject(null);\n    }\n    \n    function whenDomReady(callback) {\n      var doc = getDocumentObject(null);\n      if (!doc) return;\n      if (doc.readyState === \"interactive\" || doc.readyState === \"complete\") {\n        callback();\n        return;\n      }\n      doc.addEventListener(\"DOMContentLoaded\", callback, { once: true });\n    }\n    \n    function parseJsonText(text, label, fallbackValue) {\n      var raw = typeof text === \"string\" ? text.trim() : \"\";\n      if (!raw) return fallbackValue;\n      try {\n        return JSON.parse(raw);\n      } catch (error) {\n        throw new Error(label + \" must contain valid JSON.\");\n      }\n    }\n    \n    function collectRoots(scope, selector) {\n      var container = normalizeContainer(scope);\n      var results = [];\n      if (!container || typeof container.querySelectorAll !== \"function\") {\n        return results;\n      }\n      if (container.nodeType === 1 && typeof container.matches === \"function\" && container.matches(selector)) {\n        results.push(container);\n      }\n      return results.concat(Array.prototype.slice.call(container.querySelectorAll(selector)));\n    }\n    \n    function readConfigPayload(root, attributeName) {\n      var attrName = attributeName || \"data-ev-tool-finder-v1-config-id\";\n      var doc = getDocumentObject(root);\n      var scriptId = root && typeof root.getAttribute === \"function\" ? root.getAttribute(attrName) : null;\n      var scriptNode;\n      ensure(!!doc, \"A document is required to resolve the section config payload.\");\n      ensure(!!scriptId, \"The V1 section root is missing its config script id.\");\n      scriptNode = doc.getElementById(scriptId);\n      ensure(!!scriptNode, \"The V1 section config script could not be found: \" + scriptId);\n      return parseJsonText(scriptNode.textContent || \"\", \"Embedded Shopify V1 section config\", {});\n    }\n    \n    function readShadowPayload(root) {\n      return readConfigPayload(root, \"data-ev-tool-shadow-v1-config-id\");\n    }\n    \n    function findDiagnosticsNode(root) {\n      var wrapper = root && typeof root.closest === \"function\" ? root.closest(\"[data-ev-tool-finder-v1-wrapper]\") : null;\n      if (!wrapper || typeof wrapper.querySelector !== \"function\") return null;\n      return wrapper.querySelector(DEV_THEME_SELECTORS.diagnostics);\n    }\n    \n    function renderDiagnostics(node, title, payload) {\n      var heading;\n      var pre;\n      if (!node) return;\n      node.replaceChildren();\n      heading = node.ownerDocument.createElement(\"div\");\n      heading.className = \"ev-tool-finder-v1-dev-diagnostics-title\";\n      heading.textContent = title;\n      pre = node.ownerDocument.createElement(\"pre\");\n      pre.className = \"ev-tool-finder-v1-dev-diagnostics-json\";\n      pre.textContent = JSON.stringify(payload || {}, null, 2);\n      node.appendChild(heading);\n      node.appendChild(pre);\n    }\n    \n    function markMounted(root, key) {\n      var datasetKey = key || \"tfv1DevMounted\";\n      if (!root || !root.dataset) return false;\n      if (root.dataset[datasetKey] === \"true\") return false;\n      root.dataset[datasetKey] = \"true\";\n      return true;\n    }\n    \n    function registerMountedSection(channel, sectionId, record) {\n      var win = getWindowObject();\n      var registry;\n      var bucket;\n      if (!win) return;\n      registry = win.EdgeVendToolFinderV1Dev || (win.EdgeVendToolFinderV1Dev = {\n        v1: {},\n        shadow: {},\n      });\n      bucket = registry[channel] || (registry[channel] = {});\n      bucket[sectionId] = record;\n    }\n    \n    async function loadCandidatesFromProductRefs(app, productRefs) {\n      var refs = productRefs || {};\n      var handle = refs.handle || null;\n      var variantId = refs.variantId || null;\n      var products;\n      var productEntry;\n      var manifestCandidates;\n      var manifestCandidate;\n    \n      ensure(!!handle, \"Shadow comparison requires a product handle when embedded candidates are not supplied.\");\n      products = await app.loadProductIndex();\n      productEntry = products.find(function findEntry(item) {\n        return item && item.ids && item.ids.handle === handle;\n      });\n      ensure(!!productEntry, \"No product entry matched the supplied product handle: \" + handle);\n      manifestCandidates = await app.loadVariantManifestForProduct(productEntry);\n      manifestCandidate = variantId\n        ? manifestCandidates.find(function findVariant(item) {\n            return item && item.ids && item.ids.variantId === variantId;\n          })\n        : manifestCandidates[0];\n      ensure(!!manifestCandidate, \"No manifest candidate matched the supplied variantId: \" + variantId);\n      return [await app.loadCandidateDetail(manifestCandidate)];\n    }\n    \n    exports.whenDomReady = whenDomReady;\n    exports.parseJsonText = parseJsonText;\n    exports.collectRoots = collectRoots;\n    exports.readConfigPayload = readConfigPayload;\n    exports.readShadowPayload = readShadowPayload;\n    exports.findDiagnosticsNode = findDiagnosticsNode;\n    exports.renderDiagnostics = renderDiagnostics;\n    exports.markMounted = markMounted;\n    exports.registerMountedSection = registerMountedSection;\n    exports.loadCandidatesFromProductRefs = loadCandidatesFromProductRefs;\n  },\n  \"shopify/dev-theme/source/ev-tool-finder-v1-entry.js\": function (exports, module, __bundle) {\n    var { mountAdvisorV1Section } = __bundle.require(\"shopify/advisor-v1-section.js\");\n    var { DEV_THEME_ASSET_NAMES, DEV_THEME_SELECTORS } = __bundle.require(\"shopify/dev-theme/dev-theme-manifest.js\");\n    var { createLoadingOverlayContent } = __bundle.require(\"presentation/shell.js\");\n    var { clearNode, createElement } = __bundle.require(\"presentation/shared-components.js\");\n    var { setRuntimeI18n } = __bundle.require(\"presentation/i18n.js\");\n    var { collectRoots, markMounted, readConfigPayload, registerMountedSection } = __bundle.require(\"shopify/dev-theme/source/dom-mount.js\");\n    function applyEarlyRuntimeI18n(payload) {\n      var runtimeConfig = payload && payload.runtimeConfig ? payload.runtimeConfig : {};\n      var baseI18n = runtimeConfig && runtimeConfig.i18n && typeof runtimeConfig.i18n === \"object\"\n        ? runtimeConfig.i18n\n        : {};\n    \n      setRuntimeI18n(Object.assign({}, baseI18n, {\n        __locale: runtimeConfig && runtimeConfig.locale ? runtimeConfig.locale : \"en\",\n        __sourceLocale: \"en\",\n      }));\n    }\n    \n    function renderPreMountLoadingOverlay(root, payload) {\n      var runtimeConfig = payload && payload.runtimeConfig ? payload.runtimeConfig : {};\n      var shellWrap;\n      var overlayNode;\n    \n      if (!root) {\n        return function noop() {\n          return;\n        };\n      }\n    \n      applyEarlyRuntimeI18n(payload);\n      clearNode(root);\n      shellWrap = createElement(\"div\", {\n        className: \"tfv1-shell-wrap\",\n        style: \"min-height: 420px;\",\n      });\n      overlayNode = createElement(\"div\", {\n        className: \"tfv1-loading-overlay\",\n        \"aria-hidden\": \"false\",\n      }, [\n        createLoadingOverlayContent({\n          visible: true,\n          phase: \"catalog\",\n          media: runtimeConfig && runtimeConfig.advisorMedia ? runtimeConfig.advisorMedia : null,\n        }),\n      ]);\n      shellWrap.appendChild(overlayNode);\n      root.appendChild(shellWrap);\n    \n      return function clearPreMountLoadingOverlay() {\n        if (root && root.firstChild === shellWrap) {\n          clearNode(root);\n        }\n      };\n    }\n    \n    function getMetaobjectEntriesScriptNode(root) {\n      var doc = root && root.ownerDocument ? root.ownerDocument : (typeof document !== \"undefined\" ? document : null);\n      var configId = root && typeof root.getAttribute === \"function\"\n        ? root.getAttribute(\"data-ev-tool-finder-v1-config-id\")\n        : null;\n      var scriptId = configId ? configId.replace(\"Config-\", \"QuestionEntries-\") : null;\n    \n      if (!doc || !scriptId || typeof doc.getElementById !== \"function\") return null;\n      return doc.getElementById(scriptId);\n    }\n    \n    function parseJsonScriptText(text) {\n      var raw = typeof text === \"string\" ? text.trim() : \"\";\n      if (!raw) return null;\n      try {\n        return JSON.parse(raw);\n      } catch (error) {\n        return null;\n      }\n    }\n    \n    function parseOptionalJsonScript(root, getter) {\n      var scriptNode = getter(root);\n      return scriptNode && typeof scriptNode.textContent === \"string\"\n        ? parseJsonScriptText(scriptNode.textContent)\n        : null;\n    }\n    \n    function parseMetaobjectEntriesPageFromHtml(html, sectionId) {\n      var parser;\n      var doc;\n      var node;\n    \n      if (!html || !sectionId || typeof DOMParser === \"undefined\") return null;\n      parser = new DOMParser();\n      doc = parser.parseFromString(html, \"text/html\");\n      node = doc.getElementById(\"EdgeVendToolFinderV1QuestionEntries-\" + sectionId);\n      return node && typeof node.textContent === \"string\" ? parseJsonScriptText(node.textContent) : null;\n    }\n    \n    function buildSectionRenderUrl(sectionId, pageParam, pageNumber) {\n      var loc;\n      var url;\n    \n      if (!sectionId || !pageParam || !pageNumber || typeof window === \"undefined\" || typeof URL === \"undefined\") {\n        return null;\n      }\n      loc = window.location;\n      if (!loc || !loc.href) return null;\n      url = new URL(loc.href);\n      url.searchParams.set(\"section_id\", sectionId);\n      url.searchParams.set(pageParam, String(pageNumber));\n      return url.toString();\n    }\n    \n    function ensureObjectBranch(target, key) {\n      var current = target && Object.prototype.hasOwnProperty.call(target, key) ? target[key] : null;\n      if (!current || typeof current !== \"object\") {\n        target[key] = {};\n        return target[key];\n      }\n      return current;\n    }\n    \n    function setPathValue(target, path, value) {\n      var segments = Array.isArray(path) ? path : String(path || \"\").split(\".\").filter(Boolean);\n      var current = target;\n      var index;\n      var key;\n    \n      if (!target || !segments.length || value == null || value === \"\") return;\n      for (index = 0; index < segments.length - 1; index += 1) {\n        current = ensureObjectBranch(current, segments[index]);\n      }\n      key = segments[segments.length - 1];\n      current[key] = String(value);\n    }\n    \n    function mergeMetaobjectEntries(targetEntries, entries) {\n      var target = targetEntries && typeof targetEntries === \"object\" ? targetEntries : {};\n    \n      (Array.isArray(entries) ? entries : []).forEach(function eachEntry(entry) {\n        var keyPath = entry && typeof entry.keyPath === \"string\" ? entry.keyPath.trim() : \"\";\n        var value = entry && typeof entry.value === \"string\" ? entry.value : \"\";\n    \n        if (!keyPath || !value) return;\n        target[keyPath] = value;\n      });\n    \n      return target;\n    }\n    \n    function cloneRuntimeConfig(payload) {\n      var runtimeConfig = payload && payload.runtimeConfig && typeof payload.runtimeConfig === \"object\"\n        ? JSON.parse(JSON.stringify(payload.runtimeConfig))\n        : {};\n    \n      if (!runtimeConfig.i18n || typeof runtimeConfig.i18n !== \"object\") {\n        runtimeConfig.i18n = {};\n      }\n      if (!runtimeConfig.i18n.metaobject || typeof runtimeConfig.i18n.metaobject !== \"object\") {\n        runtimeConfig.i18n.metaobject = {};\n      }\n      if (!runtimeConfig.i18n.metaobject.paths || typeof runtimeConfig.i18n.metaobject.paths !== \"object\") {\n        runtimeConfig.i18n.metaobject.paths = {};\n      }\n    \n      return runtimeConfig;\n    }\n    \n    function applyMetaobjectEntries(runtimeConfig, entries) {\n      var metaobjectPaths = runtimeConfig && runtimeConfig.i18n && runtimeConfig.i18n.metaobject\n        ? runtimeConfig.i18n.metaobject.paths\n        : null;\n    \n      if (!metaobjectPaths || typeof metaobjectPaths !== \"object\") return runtimeConfig;\n    \n      Object.keys(entries || {}).forEach(function eachLogicalPath(logicalPath) {\n        metaobjectPaths[logicalPath] = entries[logicalPath];\n      });\n    \n      return runtimeConfig;\n    }\n    \n    async function loadMetaobjectEntries(root, payload, fetchImpl) {\n      var sectionId = payload && payload.sectionId ? String(payload.sectionId) : \"\";\n      var currentPagePayload = parseOptionalJsonScript(root, getMetaobjectEntriesScriptNode);\n      var mergedEntries = {};\n      var totalPages;\n      var currentPage;\n      var pageParam;\n      var page;\n      var url;\n      var response;\n      var html;\n      var pagePayload;\n    \n      if (!currentPagePayload || !Array.isArray(currentPagePayload.entries)) {\n        return mergedEntries;\n      }\n    \n      mergeMetaobjectEntries(mergedEntries, currentPagePayload.entries);\n    \n      totalPages = Number(currentPagePayload.pages) || 0;\n      currentPage = Number(currentPagePayload.currentPage) || 1;\n      pageParam = currentPagePayload.pageParam ? String(currentPagePayload.pageParam) : \"\";\n    \n      if (!fetchImpl || !sectionId || !pageParam || totalPages <= 1) {\n        return mergedEntries;\n      }\n    \n      for (page = 1; page <= totalPages; page += 1) {\n        if (page === currentPage) continue;\n        url = buildSectionRenderUrl(sectionId, pageParam, page);\n        if (!url) break;\n    \n        try {\n          response = await fetchImpl(url, { credentials: \"same-origin\" });\n          if (!response || !response.ok) continue;\n          html = await response.text();\n          pagePayload = parseMetaobjectEntriesPageFromHtml(html, sectionId);\n          if (!pagePayload || !Array.isArray(pagePayload.entries)) continue;\n          mergeMetaobjectEntries(mergedEntries, pagePayload.entries);\n        } catch (error) {\n          continue;\n        }\n      }\n    \n      return mergedEntries;\n    }\n    \n    async function mountSingleRoot(root, options) {\n      var source = options || {};\n      var payload = readConfigPayload(root);\n      var sectionId = payload.sectionId || root.id || \"v1-section\";\n      var fetchImpl = source.fetchImpl || (typeof window !== \"undefined\" && window.fetch ? window.fetch.bind(window) : null);\n      var runtimeConfig = cloneRuntimeConfig(payload);\n      var metaobjectEntries;\n      var section;\n      var clearPreMountOverlay;\n    \n      if (!markMounted(root, \"tfv1DevMounted\")) {\n        return {\n          sectionId: sectionId,\n          status: \"skipped\",\n          reason: \"already_mounted\",\n        };\n      }\n    \n      root.dataset.tfv1DevEntry = DEV_THEME_ASSET_NAMES.entry;\n      clearPreMountOverlay = renderPreMountLoadingOverlay(root, payload);\n    \n      metaobjectEntries = await loadMetaobjectEntries(root, payload, fetchImpl);\n      applyMetaobjectEntries(runtimeConfig, metaobjectEntries);\n    \n      section = mountAdvisorV1Section({\n        root: root,\n        fetchImpl: fetchImpl,\n        runtimeConfig: runtimeConfig,\n      });\n    \n      if (section && section.ready && typeof section.ready.then === \"function\") {\n        await section.ready;\n      }\n    \n      if (typeof clearPreMountOverlay === \"function\") {\n        clearPreMountOverlay();\n      }\n    \n      registerMountedSection(\"v1\", sectionId, {\n        payload: payload,\n        runtimeConfig: runtimeConfig,\n        section: section,\n      });\n    \n      return {\n        sectionId: sectionId,\n        status: \"mounted\",\n        section: section,\n      };\n    }\n    \n    async function mountV1DevSections(options) {\n      var source = options || {};\n      var roots = collectRoots(source.root || document, DEV_THEME_SELECTORS.v1Root);\n      var results = [];\n      var index;\n    \n      for (index = 0; index < roots.length; index += 1) {\n        results.push(await mountSingleRoot(roots[index], source));\n      }\n    \n      return results;\n    }\n    \n    exports.mountV1DevSections = mountV1DevSections;\n  },\n  \"shopify/endpoint-contracts.js\": function (exports, module, __bundle) {\n    var { ensure, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    function clone(value) {\n      return value == null ? value : JSON.parse(JSON.stringify(value));\n    }\n    \n    function replaceToken(template, token, value) {\n      ensure(String(template).indexOf(\":\" + token) >= 0, \"Endpoint template is missing :\" + token + \" token.\");\n      return String(template).replace(\":\" + token, encodeURIComponent(String(value)));\n    }\n    \n    function validateResolvedUrl(url, label, required) {\n      if (!url && required) {\n        ensure(false, label + \" is required in the Shopify V1 runtime config.\");\n      }\n      if (!url) return null;\n      ensure(\n        url.indexOf(\"/\") === 0 || /^https?:\\/\\//i.test(url) || /^file:\\/\\//i.test(url),\n        label + \" must be an absolute path or absolute URL.\"\n      );\n      return url;\n    }\n    \n    function isPlaceholderUrl(url, placeholder) {\n      return !!url && String(url).trim() === placeholder;\n    }\n    \n    function getHttpPathname() {\n      if (\n        typeof window !== \"undefined\" &&\n        window.location &&\n        /^https?:$/i.test(String(window.location.protocol || \"\"))\n      ) {\n        return window.location.pathname || \"/\";\n      }\n      return \"/\";\n    }\n    \n    function withQueryParams(pathname, params) {\n      var url = new URL(pathname || \"/\", \"https://edgevend.local\");\n      Object.keys(params || {}).forEach(function eachKey(key) {\n        var value = params[key];\n        if (value == null || value === \"\") return;\n        url.searchParams.set(key, String(value));\n      });\n      return (url.pathname + url.search).replace(/%3A/g, \":\");\n    }\n    \n    function resolveLegacyResource(runtimeConfig, descriptorId) {\n      var legacyIds = runtimeConfig && runtimeConfig.legacySectionIds ? runtimeConfig.legacySectionIds : {};\n      if (descriptorId === \"productIndex\") {\n        return withQueryParams(getHttpPathname(), {\n          section_id: legacyIds.productIndex || \"ev-tool-product-index\",\n          page: 1,\n        });\n      }\n      if (descriptorId === \"processMetadata\") {\n        if (!legacyIds.processMetadata) return null;\n        return withQueryParams(getHttpPathname(), {\n          section_id: legacyIds.processMetadata,\n        });\n      }\n      return null;\n    }\n    \n    function resolveLegacyTemplate(runtimeConfig, descriptorId) {\n      var legacyIds = runtimeConfig && runtimeConfig.legacySectionIds ? runtimeConfig.legacySectionIds : {};\n      if (descriptorId === \"variantManifest\") {\n        return withQueryParams(\"/products/:handle\", {\n          section_id: legacyIds.variantManifest || \"ev-tool-product-variants\",\n        });\n      }\n      if (descriptorId === \"productDetail\") {\n        return withQueryParams(\"/products/:handle\", {\n          variant: \":variantId\",\n          section_id: legacyIds.productDetail || \"ev-tool-detail-json\",\n        });\n      }\n      return null;\n    }\n    \n    function resolveDescriptorValue(runtimeConfig, descriptorId, explicitValue) {\n      var ownership = runtimeConfig && runtimeConfig.endpointOwnership ? runtimeConfig.endpointOwnership[descriptorId] : \"missing\";\n      var value = toNullableString(explicitValue);\n    \n      if (ownership !== \"legacy_read_only\") {\n        return value;\n      }\n    \n      if (\n        descriptorId === \"productIndex\" &&\n        (!value || isPlaceholderUrl(value, \"/sections/product-index\"))\n      ) {\n        return resolveLegacyResource(runtimeConfig, descriptorId);\n      }\n      if (\n        descriptorId === \"variantManifest\" &&\n        (!value || isPlaceholderUrl(value, \"/sections/variant-manifest/:handle\"))\n      ) {\n        return resolveLegacyTemplate(runtimeConfig, descriptorId);\n      }\n      if (\n        descriptorId === \"productDetail\" &&\n        (!value || isPlaceholderUrl(value, \"/sections/product-detail/:handle/:variantId\"))\n      ) {\n        return resolveLegacyTemplate(runtimeConfig, descriptorId);\n      }\n      if (\n        descriptorId === \"processMetadata\" &&\n        (!value || isPlaceholderUrl(value, \"/sections/process-metadata\"))\n      ) {\n        return resolveLegacyResource(runtimeConfig, descriptorId);\n      }\n    \n      return value;\n    }\n    \n    function createDescriptor(id, label, kind, options) {\n      var source = options || {};\n      return {\n        id: id,\n        label: label,\n        kind: kind,\n        required: source.required !== false,\n        value: source.value || null,\n        ownership: source.ownership || \"missing\",\n        sourceKey: source.sourceKey || null,\n      };\n    }\n    \n    function createEndpointContracts(runtimeConfig) {\n      var productIndexDescriptor = createDescriptor(\"productIndex\", \"Product index endpoint\", \"resource\", {\n        value: validateResolvedUrl(resolveDescriptorValue(runtimeConfig, \"productIndex\", runtimeConfig && runtimeConfig.productIndexUrl), \"productIndexUrl\", true),\n        ownership: runtimeConfig && runtimeConfig.endpointOwnership && runtimeConfig.endpointOwnership.productIndex,\n        sourceKey: runtimeConfig && runtimeConfig.endpointSourceKeys && runtimeConfig.endpointSourceKeys.productIndex,\n      });\n      var variantManifestDescriptor = createDescriptor(\"variantManifest\", \"Variant manifest endpoint\", \"template\", {\n        value: validateResolvedUrl(resolveDescriptorValue(runtimeConfig, \"variantManifest\", runtimeConfig && runtimeConfig.variantManifestUrlTemplate), \"variantManifestUrlTemplate\", true),\n        ownership: runtimeConfig && runtimeConfig.endpointOwnership && runtimeConfig.endpointOwnership.variantManifest,\n        sourceKey: runtimeConfig && runtimeConfig.endpointSourceKeys && runtimeConfig.endpointSourceKeys.variantManifest,\n      });\n      var productDetailDescriptor = createDescriptor(\"productDetail\", \"Product detail endpoint\", \"template\", {\n        value: validateResolvedUrl(resolveDescriptorValue(runtimeConfig, \"productDetail\", runtimeConfig && runtimeConfig.productDetailUrlTemplate), \"productDetailUrlTemplate\", true),\n        ownership: runtimeConfig && runtimeConfig.endpointOwnership && runtimeConfig.endpointOwnership.productDetail,\n        sourceKey: runtimeConfig && runtimeConfig.endpointSourceKeys && runtimeConfig.endpointSourceKeys.productDetail,\n      });\n      var processMetadataDescriptor = createDescriptor(\"processMetadata\", \"Process metadata endpoint\", \"resource\", {\n        value: validateResolvedUrl(resolveDescriptorValue(runtimeConfig, \"processMetadata\", runtimeConfig && runtimeConfig.processMetadataUrl), \"processMetadataUrl\", false),\n        ownership: runtimeConfig && runtimeConfig.endpointOwnership && runtimeConfig.endpointOwnership.processMetadata,\n        sourceKey: runtimeConfig && runtimeConfig.endpointSourceKeys && runtimeConfig.endpointSourceKeys.processMetadata,\n        required: false,\n      });\n      var descriptors = {\n        productIndex: productIndexDescriptor,\n        variantManifest: variantManifestDescriptor,\n        productDetail: productDetailDescriptor,\n        processMetadata: processMetadataDescriptor,\n      };\n    \n      function getDescriptor(name) {\n        ensure(!!descriptors[name], \"Unknown endpoint descriptor requested: \" + name);\n        return clone(descriptors[name]);\n      }\n    \n      function describe() {\n        return [\n          getDescriptor(\"productIndex\"),\n          getDescriptor(\"variantManifest\"),\n          getDescriptor(\"productDetail\"),\n          getDescriptor(\"processMetadata\"),\n        ];\n      }\n    \n      function validate() {\n        validateResolvedUrl(productIndexDescriptor.value, \"productIndexUrl\", true);\n        validateResolvedUrl(variantManifestDescriptor.value, \"variantManifestUrlTemplate\", true);\n        validateResolvedUrl(productDetailDescriptor.value, \"productDetailUrlTemplate\", true);\n        if (variantManifestDescriptor.value) {\n          ensure(variantManifestDescriptor.value.indexOf(\":handle\") >= 0, \"variantManifestUrlTemplate must contain :handle.\");\n        }\n        if (productDetailDescriptor.value) {\n          ensure(productDetailDescriptor.value.indexOf(\":handle\") >= 0, \"productDetailUrlTemplate must contain :handle.\");\n          ensure(productDetailDescriptor.value.indexOf(\":variantId\") >= 0, \"productDetailUrlTemplate must contain :variantId.\");\n        }\n        return describe();\n      }\n    \n      return {\n        productIndex: function productIndex() {\n          return productIndexDescriptor.value;\n        },\n        productPool: function productPool() {\n          return productIndexDescriptor.value;\n        },\n        variantManifest: function variantManifest(handle) {\n          var resolvedHandle = toNullableString(handle);\n          ensure(!!resolvedHandle, \"variantManifest(handle) requires a product handle.\");\n          return replaceToken(variantManifestDescriptor.value, \"handle\", resolvedHandle);\n        },\n        productDetail: function productDetail(handle, variantId) {\n          var resolvedHandle = toNullableString(handle);\n          var resolvedVariantId = toNullableString(variantId);\n          ensure(!!resolvedHandle, \"productDetail(handle, variantId) requires a product handle.\");\n          ensure(!!resolvedVariantId, \"productDetail(handle, variantId) requires a variantId.\");\n          return replaceToken(replaceToken(productDetailDescriptor.value, \"handle\", resolvedHandle), \"variantId\", resolvedVariantId);\n        },\n        processMetadata: function processMetadata() {\n          return processMetadataDescriptor.value;\n        },\n        hasProcessMetadata: function hasProcessMetadata() {\n          return !!processMetadataDescriptor.value;\n        },\n        describe: describe,\n        getDescriptor: getDescriptor,\n        validate: validate,\n        usesLegacyReadOnlySources: function usesLegacyReadOnlySources() {\n          return describe().some(function hasLegacyOwnership(item) {\n            return item.ownership === \"legacy_read_only\";\n          });\n        },\n      };\n    }\n    \n    exports.createEndpointContracts = createEndpointContracts;\n  },\n  \"shopify/runtime-config.js\": function (exports, module, __bundle) {\n    var { toNullableBoolean, toNullableString } = __bundle.require(\"catalog/contracts.js\");\n    var DEFAULT_ENDPOINTS = Object.freeze({\n      productIndex: \"/sections/product-index\",\n      variantManifest: \"/sections/variant-manifest/:handle\",\n      productDetail: \"/sections/product-detail/:handle/:variantId\",\n      processMetadata: \"/sections/process-metadata\",\n    });\n    \n    var DEFAULT_ENDPOINT_OWNERSHIP = Object.freeze({\n      productIndex: \"legacy_read_only\",\n      variantManifest: \"legacy_read_only\",\n      productDetail: \"legacy_read_only\",\n      processMetadata: \"legacy_read_only\",\n    });\n    \n    var DEFAULT_ADVISOR_MEDIA = Object.freeze({\n      advisorName: null,\n      advisorRole: null,\n      avatarUrl: null,\n      avatarAlt: null,\n      loadingTitle: null,\n      loadingSubtitle: null,\n      loadingVideoPosterUrl: null,\n      loadingVideoSources: [],\n    });\n    \n    function pickFirst(source, keys) {\n      var resolvedKey = null;\n      var resolvedValue = null;\n      var index;\n      var key;\n      for (index = 0; index < keys.length; index += 1) {\n        key = keys[index];\n        resolvedValue = toNullableString(source[key]);\n        if (resolvedValue) {\n          resolvedKey = key;\n          break;\n        }\n      }\n      return {\n        key: resolvedKey,\n        value: resolvedValue,\n      };\n    }\n    \n    function inferOwnership(explicitOwnership, sourceKey, value, fallbackOwnership) {\n      var normalized = toNullableString(explicitOwnership);\n      if (normalized) return normalized;\n      if (!value) return \"missing\";\n      if (!sourceKey) return fallbackOwnership || \"missing\";\n      if (sourceKey === \"productPoolUrl\") return \"legacy_read_only\";\n      return \"v1_owned\";\n    }\n    \n    function normalizeVideoSources(value) {\n      if (!Array.isArray(value)) return [];\n      return value.map(function mapSource(entry) {\n        var source = entry && typeof entry === \"object\" ? entry : {};\n        var url = toNullableString(source.url || source.src);\n        if (!url) return null;\n        return {\n          url: url,\n          mimeType: toNullableString(source.mimeType || source.mime_type || source.type),\n          format: toNullableString(source.format),\n        };\n      }).filter(Boolean);\n    }\n    \n    function normalizeAdvisorMedia(source) {\n      var media = source && typeof source.advisorMedia === \"object\" ? source.advisorMedia : {};\n      var advisorName = toNullableString(source.advisorName || media.advisorName) || DEFAULT_ADVISOR_MEDIA.advisorName;\n      var avatarAlt = toNullableString(source.advisorAvatarAlt || media.avatarAlt) || advisorName || DEFAULT_ADVISOR_MEDIA.avatarAlt;\n      return {\n        advisorName: advisorName,\n        advisorRole: toNullableString(source.advisorRole || media.advisorRole) || DEFAULT_ADVISOR_MEDIA.advisorRole,\n        avatarUrl: toNullableString(source.advisorAvatarUrl || media.avatarUrl) || DEFAULT_ADVISOR_MEDIA.avatarUrl,\n        avatarAlt: avatarAlt,\n        loadingTitle: toNullableString(source.loadingTitle || media.loadingTitle) || DEFAULT_ADVISOR_MEDIA.loadingTitle,\n        loadingSubtitle: toNullableString(source.loadingSubtitle || media.loadingSubtitle) || DEFAULT_ADVISOR_MEDIA.loadingSubtitle,\n        loadingVideoPosterUrl: toNullableString(source.loadingVideoPosterUrl || media.loadingVideoPosterUrl) || DEFAULT_ADVISOR_MEDIA.loadingVideoPosterUrl,\n        loadingVideoSources: normalizeVideoSources(source.loadingVideoSources || media.loadingVideoSources),\n      };\n    }\n    \n    function normalizeStep3Sketches(value) {\n      var source = value && typeof value === \"object\" ? value : {};\n      var output = {};\n    \n      Object.keys(source).forEach(function eachSketch(questionId) {\n        var entry = source[questionId];\n        var objectEntry = entry && typeof entry === \"object\" ? entry : {};\n        var url = toNullableString(typeof entry === \"string\" ? entry : objectEntry.url || objectEntry.imageUrl || objectEntry.src);\n    \n        if (!questionId || !url) return;\n        output[questionId] = {\n          url: url,\n          alt: toNullableString(objectEntry.alt || objectEntry.label),\n          blockId: toNullableString(objectEntry.blockId),\n        };\n      });\n    \n      return output;\n    }\n    \n    function normalizeRuntimeConfig(config) {\n      var source = config || {};\n      var productIndex = pickFirst(source, [\"v1ProductIndexUrl\", \"productIndexUrl\", \"productPoolUrl\"]);\n      var variantManifest = pickFirst(source, [\"v1VariantManifestUrlTemplate\", \"variantManifestUrlTemplate\"]);\n      var productDetail = pickFirst(source, [\"v1ProductDetailUrlTemplate\", \"productDetailUrlTemplate\"]);\n      var processMetadata = pickFirst(source, [\"v1ProcessMetadataUrl\", \"processMetadataUrl\"]);\n      var productIndexValue = productIndex.value || DEFAULT_ENDPOINTS.productIndex;\n      var variantManifestValue = variantManifest.value || DEFAULT_ENDPOINTS.variantManifest;\n      var productDetailValue = productDetail.value || DEFAULT_ENDPOINTS.productDetail;\n      var processMetadataValue = processMetadata.value || DEFAULT_ENDPOINTS.processMetadata;\n      var endpointOwnership = {\n        productIndex: inferOwnership(source.v1ProductIndexOwnership || source.productIndexOwnership || source.productPoolOwnership, productIndex.key, productIndexValue, DEFAULT_ENDPOINT_OWNERSHIP.productIndex),\n        variantManifest: inferOwnership(source.v1VariantManifestOwnership || source.variantManifestOwnership, variantManifest.key, variantManifestValue, DEFAULT_ENDPOINT_OWNERSHIP.variantManifest),\n        productDetail: inferOwnership(source.v1ProductDetailOwnership || source.productDetailOwnership, productDetail.key, productDetailValue, DEFAULT_ENDPOINT_OWNERSHIP.productDetail),\n        processMetadata: inferOwnership(source.v1ProcessMetadataOwnership || source.processMetadataOwnership, processMetadata.key, processMetadataValue, DEFAULT_ENDPOINT_OWNERSHIP.processMetadata),\n      };\n    \n      return {\n        mode: toNullableString(source.mode) || \"v1\",\n        sectionKey: toNullableString(source.sectionKey || source.v1SectionKey) || \"advisor-v1\",\n        shadowSectionKey: toNullableString(source.shadowSectionKey || source.v1ShadowSectionKey) || null,\n        shadowModeEnabled: toNullableBoolean(source.shadowModeEnabled != null ? source.shadowModeEnabled : source.shadowMode) === true,\n        productIndexUrl: productIndexValue,\n        productPoolUrl: productIndexValue,\n        variantManifestUrlTemplate: variantManifestValue,\n        productDetailUrlTemplate: productDetailValue,\n        processMetadataUrl: processMetadataValue,\n        locale: toNullableString(source.locale) || \"en\",\n        currency: toNullableString(source.currency) || \"EUR\",\n        legacySectionIds: {\n          productIndex: toNullableString(source.legacyProductIndexSectionId || source.productIndexSectionId) || \"ev-tool-product-index\",\n          variantManifest: toNullableString(source.legacyVariantManifestSectionId || source.variantManifestSectionId) || \"ev-tool-product-variants\",\n          productDetail: toNullableString(source.legacyProductDetailSectionId || source.productDetailSectionId) || \"ev-tool-detail-json\",\n          processMetadata: toNullableString(source.legacyProcessMetadataSectionId || source.processMetadataSectionId),\n        },\n        endpointOwnership: endpointOwnership,\n        endpointSourceKeys: {\n          productIndex: productIndex.key,\n          variantManifest: variantManifest.key,\n          productDetail: productDetail.key,\n          processMetadata: processMetadata.key,\n        },\n        processIconUrls: source.processIconUrls && typeof source.processIconUrls === \"object\"\n          ? Object.assign({}, source.processIconUrls)\n          : {},\n        advisorMedia: normalizeAdvisorMedia(source),\n        step3Sketches: normalizeStep3Sketches(source.step3Sketches || source.step3SketchOverrides),\n        i18n: source.i18n && typeof source.i18n === \"object\"\n          ? JSON.parse(JSON.stringify(source.i18n))\n          : {},\n        isoSubgroupOptions: Array.isArray(source.isoSubgroupOptions)\n          ? source.isoSubgroupOptions\n            .map(function mapOption(option) {\n              return option && typeof option === \"object\"\n                ? {\n                  value: toNullableString(option.value),\n                  label: toNullableString(option.label),\n                }\n                : null;\n            })\n            .filter(Boolean)\n          : [],\n        usesLegacyReadOnlySources: Object.keys(endpointOwnership).some(function hasLegacyOwnership(key) {\n          return endpointOwnership[key] === \"legacy_read_only\";\n        }),\n      };\n    }\n    \n    exports.normalizeRuntimeConfig = normalizeRuntimeConfig;\n  }\n  };\n  var __cache = {};\n  var __bundle = {\n    require: function require(moduleId) {\n      var cached = __cache[moduleId];\n      var moduleFactory;\n      var module;\n      if (cached) {\n        return cached.exports;\n      }\n      moduleFactory = __modules[moduleId];\n      if (!moduleFactory) {\n        throw new Error(\"Unknown bundled module: \" + moduleId);\n      }\n      module = { exports: {} };\n      __cache[moduleId] = module;\n      moduleFactory(module.exports, module, __bundle);\n      return module.exports;\n    }\n  };\n  var __entryExports = __bundle.require(\"shopify/dev-theme/source/ev-tool-finder-v1-entry.js\");\n  if (typeof window !== \"undefined\") {\n    var __registry = window.EdgeVendToolFinderV1Bundles || (window.EdgeVendToolFinderV1Bundles = {});\n    __registry[\"finder\"] = __entryExports;\n  }\n  if (typeof document !== \"undefined\" && typeof document.dispatchEvent === \"function\" && typeof CustomEvent === \"function\") {\n    document.dispatchEvent(new CustomEvent(\"ev-tool-finder-v1:bundle-ready\", {\n      detail: {\n        channel: \"finder\",\n        entry: \"shopify/dev-theme/source/ev-tool-finder-v1-entry.js\",\n        output: \"assets/ev-tf-pro.js\"\n      }\n    }));\n  }\n}());\n"],
  "mappings": "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",
  "names": ["__bundle", "risk", "window", "entry", "troubleshootingCards", "score"]
}
