GoogleChrome/lighthouse · error · LighthouseError

NO_DCL

NO_DCL

Error message

Something went wrong with recording the trace over your page load. Please run Lighthouse again. ({errorCode})

What it means

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.

Source

Thrown at core/computed/metrics/interactive.js:159

  /**
   * @param {LH.Artifacts.NavigationMetricComputationData} data
   * @param {LH.Artifacts.ComputedContext} context
   * @return {Promise<LH.Artifacts.LanternMetric>}
   */
  static computeSimulatedMetric(data, context) {
    const metricData = NavigationMetric.getMetricComputationInput(data);
    return LanternInteractive.request(metricData, context);
  }

  /**
   * @param {LH.Artifacts.NavigationMetricComputationData} data
   * @return {Promise<LH.Artifacts.Metric>}
   */
  static computeObservedMetric(data) {
    const {processedTrace, processedNavigation, networkRecords} = data;

    if (!processedNavigation.timestamps.domContentLoaded) {
      throw new LighthouseError(LighthouseError.errors.NO_DCL);
    }

    const longTasks = TraceProcessor.getMainThreadTopLevelEvents(processedTrace)
        .filter(event => event.duration >= 50);
    const quietPeriodInfo = Interactive.findOverlappingQuietPeriods(
      longTasks,
      networkRecords,
      processedNavigation
    );

    const cpuQuietPeriod = quietPeriodInfo.cpuQuietPeriod;

    const timestamp = Math.max(
      cpuQuietPeriod.start,
      processedNavigation.timestamps.firstContentfulPaint / 1000,
      processedNavigation.timestamps.domContentLoaded / 1000
    ) * 1000;
    const timing = (timestamp - processedNavigation.timestamps.timeOrigin) / 1000;

View on GitHub (pinned to 9515cd4e58)

Solutions

  1. Re-run Lighthouse — transient recording issues are the most common cause
  2. If collecting traces manually, ensure the 'devtools.timeline' and 'loading' trace categories are included
  3. Verify the target page actually completes a full navigation (check the Network panel for the document request completing)
  4. Check that the page isn't redirecting in a loop or failing to load the HTML document
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-check for DCL timestamp before TTI computation
const processedNavigation = await ProcessedNavigation.request(trace, context);
if (!processedNavigation.timestamps.domContentLoaded) {
  throw new Error('Trace missing domContentLoaded — re-capture the trace');
}

Type guard

/** @type {(nav: LH.Artifacts.ProcessedNavigation) => boolean} */
function hasDCL(nav) {
  return Boolean(nav.timestamps.domContentLoaded);
}

Try / catch

try {
  const tti = await Interactive.request(metricData, context);
} catch (e) {
  if (e instanceof LighthouseError && e.code === 'NO_DCL') {
    // Trace is incomplete — re-run the audit
    return { error: 'Trace missing DCL event, re-run Lighthouse' };
  }
  throw e;
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of GoogleChrome/lighthouse@9515cd4e58 (2026-08-13). Data as JSON: /api/errors/7031e0d735524014. Report an issue: GitHub.