{"record":{"id":"7031e0d735524014","repo":"GoogleChrome/lighthouse","slug":"no-dcl","errorCode":"NO_DCL","errorMessage":"Something went wrong with recording the trace over your page load. Please run Lighthouse again. ({errorCode})","messagePattern":"Something went wrong with recording the trace over your page load\\. Please run Lighthouse again\\. \\((.+?)\\)","errorType":"exception","errorClass":"LighthouseError","httpStatus":null,"severity":"error","filePath":"core/computed/metrics/interactive.js","lineNumber":159,"sourceCode":"  /**\n   * @param {LH.Artifacts.NavigationMetricComputationData} data\n   * @param {LH.Artifacts.ComputedContext} context\n   * @return {Promise<LH.Artifacts.LanternMetric>}\n   */\n  static computeSimulatedMetric(data, context) {\n    const metricData = NavigationMetric.getMetricComputationInput(data);\n    return LanternInteractive.request(metricData, context);\n  }\n\n  /**\n   * @param {LH.Artifacts.NavigationMetricComputationData} data\n   * @return {Promise<LH.Artifacts.Metric>}\n   */\n  static computeObservedMetric(data) {\n    const {processedTrace, processedNavigation, networkRecords} = data;\n\n    if (!processedNavigation.timestamps.domContentLoaded) {\n      throw new LighthouseError(LighthouseError.errors.NO_DCL);\n    }\n\n    const longTasks = TraceProcessor.getMainThreadTopLevelEvents(processedTrace)\n        .filter(event => event.duration >= 50);\n    const quietPeriodInfo = Interactive.findOverlappingQuietPeriods(\n      longTasks,\n      networkRecords,\n      processedNavigation\n    );\n\n    const cpuQuietPeriod = quietPeriodInfo.cpuQuietPeriod;\n\n    const timestamp = Math.max(\n      cpuQuietPeriod.start,\n      processedNavigation.timestamps.firstContentfulPaint / 1000,\n      processedNavigation.timestamps.domContentLoaded / 1000\n    ) * 1000;\n    const timing = (timestamp - processedNavigation.timestamps.timeOrigin) / 1000;","sourceCodeStart":141,"sourceCodeEnd":177,"githubUrl":"https://github.com/GoogleChrome/lighthouse/blob/9515cd4e58ebed69f78742d932b501c2cab8ad8f/core/computed/metrics/interactive.js#L141-L177","documentation":"Thrown as a LighthouseError with code NO_DCL when computeObservedMetric() for the Interactive (TTI) metric finds that processedNavigation.timestamps.domContentLoaded is falsy. The domContentLoaded (DCL) event timestamp is a prerequisite anchor for computing TTI; without it, the metric computation cannot proceed. This typically indicates a broken or incomplete trace recording rather than a slow page.","triggerScenarios":"Interactive.computeObservedMetric() checks `if (!processedNavigation.timestamps.domContentLoaded)` and throws. This happens when the trace was captured from a page load where the DCL event was never recorded — e.g., the trace started after DCL fired, the page navigated away before DCL, or the trace categories were incomplete.","commonSituations":"Trace recorded with custom/insufficient trace categories that omit PageLoadEvents. A navigation that was interrupted or redirected before domContentLoaded. A trace from a page that never fully loaded (server hung, connection dropped). Running Lighthouse against a non-standard protocol or a page served by a service worker that bypassed the normal load lifecycle.","solutions":["Re-run Lighthouse — transient recording issues are the most common cause","If collecting traces manually, ensure the 'devtools.timeline' and 'loading' trace categories are included","Verify the target page actually completes a full navigation (check the Network panel for the document request completing)","Check that the page isn't redirecting in a loop or failing to load the HTML document"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Pre-check for DCL timestamp before TTI computation\nconst processedNavigation = await ProcessedNavigation.request(trace, context);\nif (!processedNavigation.timestamps.domContentLoaded) {\n  throw new Error('Trace missing domContentLoaded — re-capture the trace');\n}","typeGuard":"/** @type {(nav: LH.Artifacts.ProcessedNavigation) => boolean} */\nfunction hasDCL(nav) {\n  return Boolean(nav.timestamps.domContentLoaded);\n}","tryCatchPattern":"try {\n  const tti = await Interactive.request(metricData, context);\n} catch (e) {\n  if (e instanceof LighthouseError && e.code === 'NO_DCL') {\n    // Trace is incomplete — re-run the audit\n    return { error: 'Trace missing DCL event, re-run Lighthouse' };\n  }\n  throw e;\n}","preventionTips":["Ensure traces capture the full page lifecycle from navigation start through domContentLoaded","Include the 'devtools.timeline' and 'loading' trace categories","Verify the target page completes its HTML document load","Re-run Lighthouse on transient trace failures before investigating further"],"tags":["tti","trace","navigation","performance","metrics"],"backgroundTag":null,"analyzedSha":"9515cd4e58ebed69f78742d932b501c2cab8ad8f","analyzedAt":"2026-08-13T06:28:10.346Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}