{"record":{"id":"7c779b937619bdcb","repo":"GoogleChrome/lighthouse","slug":"responsiveness-currently-unsupported-by-simulated","errorCode":null,"errorMessage":"Responsiveness currently unsupported by simulated throttling","messagePattern":"Responsiveness currently unsupported by simulated throttling","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"core/computed/metrics/responsiveness.js","lineNumber":140,"sourceCode":"      throw new Error(`no interaction event found for responsiveness type '${interactionType}'`);\n    }\n    // TODO: seems to regularly happen up to 3ms and as high as 4. Allow for up to 5ms to be sure.\n    if (minDurationDiff > 5) {\n      throw new Error(`no interaction event found within 5ms of responsiveness maxDuration (max: ${maxDuration}, closest ${bestMatchEvent.args.data.duration})`); // eslint-disable-line max-len\n    }\n\n    return bestMatchEvent;\n  }\n\n  /**\n   * @param {{trace: LH.Trace, settings: LH.Audit.Context['settings']}} data\n   * @param {LH.Artifacts.ComputedContext} context\n   * @return {Promise<EventTimingEvent|null>}\n   */\n  static async compute_(data, context) {\n    const {settings, trace} = data;\n    if (settings.throttlingMethod === 'simulate') {\n      throw new Error('Responsiveness currently unsupported by simulated throttling');\n    }\n\n    const processedTrace = await ProcessedTrace.request(trace, context);\n    const responsivenessEvent = Responsiveness.getHighPercentileResponsiveness(processedTrace);\n    if (!responsivenessEvent) return null;\n\n    const interactionEvent = Responsiveness.findInteractionEvent(responsivenessEvent, trace);\n    return JSON.parse(JSON.stringify(interactionEvent));\n  }\n}\n\nconst ResponsivenessComputed = makeComputedArtifact(Responsiveness, [\n  'trace',\n  'settings',\n]);\nexport {ResponsivenessComputed as Responsiveness};\n","sourceCodeStart":122,"sourceCodeEnd":157,"githubUrl":"https://github.com/GoogleChrome/lighthouse/blob/9515cd4e58ebed69f78742d932b501c2cab8ad8f/core/computed/metrics/responsiveness.js#L122-L157","documentation":"Thrown as a plain Error from Responsiveness.compute_() when settings.throttlingMethod is 'simulate'. The Responsiveness metric (a proxy for INP) measures real user interaction latency from trace events, which is inherently an observed-only metric — there is no Lantern simulation model for it. The error is thrown immediately before any trace processing begins.","triggerScenarios":"Calling Responsiveness.request() with a settings object where throttlingMethod === 'simulate'. The check at line 139 fires the throw before the method does any work. This is an intentional guard, not a bug — simulation-based INP is not supported.","commonSituations":"Using Lighthouse's default or custom config with simulated throttling and attempting to compute the Responsiveness metric. Programmatically requesting the Responsiveness computed artifact without checking the throttling method. A pipeline that iterates all metrics regardless of throttling mode.","solutions":["Use throttlingMethod: 'devtools' or 'provided' (observed mode) when the Responsiveness metric is needed","If you must use simulation mode, exclude Responsiveness from your metric list and handle its absence","Wrap the request in a try-catch and treat the throw as 'metric not applicable' rather than a failure"],"exampleFix":"// before\nconst settings = { throttlingMethod: 'simulate' };\nconst responsiveness = await Responsiveness.request({trace, settings}, context);\n\n// after\nconst settings = { throttlingMethod: 'devtools' };\nconst responsiveness = await Responsiveness.request({trace, settings}, context);","handlingStrategy":"validation","validationCode":"// Guard against simulation mode before requesting Responsiveness\nif (data.settings.throttlingMethod === 'simulate') {\n  // Responsiveness is observe-only — skip or switch mode\n  return null;\n}\nconst responsiveness = await Responsiveness.request(data, context);","typeGuard":null,"tryCatchPattern":"try {\n  const responsiveness = await Responsiveness.request(data, context);\n} catch (e) {\n  if (e.message === 'Responsiveness currently unsupported by simulated throttling') {\n    // Simulation mode — metric not available\n    return null;\n  }\n  throw e;\n}","preventionTips":["Never request Responsiveness under simulated throttling — it will always throw","Gate Responsiveness requests on throttlingMethod !== 'simulate'","Use 'devtools' or 'provided' throttling for interaction metrics","Document in your config which metrics are observe-only"],"tags":["responsiveness","inp","throttling","not-implemented","metrics"],"backgroundTag":null,"analyzedSha":"9515cd4e58ebed69f78742d932b501c2cab8ad8f","analyzedAt":"2026-08-13T06:28:10.346Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}