{"record":{"id":"a93ffe99476b043c","repo":"GoogleChrome/lighthouse","slug":"step-name-did-not-return-a-result","errorCode":null,"errorMessage":"Step \"${name}\" did not return a result","messagePattern":"Step \"(.+?)\" did not return a result","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"core/user-flow.js","lineNumber":340,"sourceCode":"    const {artifacts, flags} = gatherStep;\n    const name = getStepName(flags, artifacts);\n\n    let runnerOptions = options.gatherStepRunnerOptions?.get(gatherStep);\n\n    // If the gather step is not active, we must recreate the runner options.\n    if (!runnerOptions) {\n      // Step specific configs take precedence over a config for the entire flow.\n      const config = options.config;\n      const {gatherMode} = artifacts.GatherContext;\n      const {resolvedConfig} = await initializeConfig(gatherMode, config, flags);\n      runnerOptions = {\n        resolvedConfig,\n        computedCache: new Map(),\n      };\n    }\n\n    const result = await Runner.audit(artifacts, runnerOptions);\n    if (!result) throw new Error(`Step \"${name}\" did not return a result`);\n    steps.push({lhr: result.lhr, name});\n  }\n\n  return {steps, name: getFlowName(options.name, gatherSteps)};\n}\n\n\nexport {\n  UserFlow,\n  auditGatherSteps,\n  getStepName,\n  getFlowName,\n  UIStrings,\n};\n","sourceCodeStart":322,"sourceCodeEnd":355,"githubUrl":"https://github.com/GoogleChrome/lighthouse/blob/9515cd4e58ebed69f78742d932b501c2cab8ad8f/core/user-flow.js#L322-L355","documentation":"Thrown by auditGatherSteps() when Runner.audit() returns a falsy value (null or undefined) for a specific gather step. Runner.audit processes the step's artifacts through all configured audits. A null return indicates the audit was programmatically skipped or failed internally without throwing. This is an internal failure in the auditing pipeline, not a user API misuse.","triggerScenarios":"Called from auditGatherSteps (user-flow.js:339). Fires when Runner.audit(artifacts, runnerOptions) returns null/undefined. This happens when the Runner encounters a condition that causes it to return null — typically an internal error path, a configuration that disables all audits, or a corrupted artifacts object that fails validation silently.","commonSituations":"Internal Lighthouse bug in Runner.audit for a specific artifacts shape. Corrupted or incomplete artifacts from a failed gather step. A custom config that removes all audits. Version mismatch between the gather and audit phases. Artifacts loaded from a saved flow that are missing required fields.","solutions":["Check the Lighthouse version — ensure gather and audit use the same version","Inspect the specific step's artifacts for completeness — verify GatherContext, URL, and settings are populated","Enable debug logging to see Runner.audit internal behavior before the null return","If using a custom config, verify it includes audits and doesn't filter them all out","Try re-running the gather step — transient failures can produce incomplete artifacts"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"for (const gatherStep of gatherSteps) {\n  const result = await Runner.audit(artifacts, runnerOptions);\n  if (!result) {\n    console.warn(`Step produced no result — check artifacts and config compatibility`);\n    continue; // or collect failures and report at end\n  }\n  steps.push({lhr: result.lhr, name});\n}","preventionTips":["Use the same Lighthouse version for gather and audit phases","Inspect artifacts for completeness (GatherContext, URL, settings) before auditing","If loading saved artifacts, validate them against the expected schema","Enable Lighthouse debug logging to diagnose Runner.audit internal failures"],"tags":["user-flow","audit","runner","internal-error"],"backgroundTag":null,"analyzedSha":"9515cd4e58ebed69f78742d932b501c2cab8ad8f","analyzedAt":"2026-08-13T06:28:10.346Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}