{"record":{"id":"7fb94d75c660b10e","repo":"paperclipai/paperclip","slug":"evalbook-requires-the-chat-viewer-run-pnpm-filt","errorCode":null,"errorMessage":"Evalbook requires the chat viewer. Run pnpm --filter @paperclipai/paperclip-runner build:issue-thread first.","messagePattern":"Evalbook requires the chat viewer\\. Run pnpm --filter @paperclipai/paperclip-runner build:issue-thread first\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/paperclip-runner/scripts/render-runner-workflow-evalbook.mjs","lineNumber":317,"sourceCode":"        );\n    });\n  });\n}\n\nexport async function renderRunnerWorkflowWithCanonicalEvalbook({\n  packageRoot,\n  outputDirectory,\n  report,\n  caseForId,\n  environment = process.env,\n}) {\n  const program = await resolveCanonicalEvalProgram(packageRoot, environment);\n  const viewerRoot = resolve(\n    environment.PAPERCLIP_EVAL_VIEWER_ROOT ??\n      resolve(packageRoot, \"dist-issue-thread\"),\n  );\n  await access(resolve(viewerRoot, \"index.html\")).catch(() => {\n    throw new Error(\n      \"Evalbook requires the chat viewer. Run pnpm --filter @paperclipai/paperclip-runner build:issue-thread first.\",\n    );\n  });\n  const runsRoot = resolve(outputDirectory, \"evalbook-runs\");\n  await rm(runsRoot, { recursive: true, force: true });\n  const attempts = await writeRunnerWorkflowEvalbookAttempts({\n    report,\n    runsRoot,\n    caseForId,\n  });\n  await Promise.all([\n    rm(resolve(outputDirectory, \"attempts\"), { recursive: true, force: true }),\n    rm(resolve(outputDirectory, \"tests\"), { recursive: true, force: true }),\n    rm(resolve(outputDirectory, \"index.html\"), { force: true }),\n    rm(resolve(outputDirectory, \"latest.html\"), { force: true }),\n    rm(resolve(outputDirectory, \"live-report.html\"), { force: true }),\n    rm(resolve(outputDirectory, \"deterministic-report.html\"), { force: true }),\n  ]);","sourceCodeStart":299,"sourceCodeEnd":335,"githubUrl":"https://github.com/paperclipai/paperclip/blob/01ad8584922b5d85292b1723cae71fa0d9b07a19/packages/paperclip-runner/scripts/render-runner-workflow-evalbook.mjs#L299-L335","documentation":"renderRunnerWorkflowWithCanonicalEvalbook requires the built chat viewer (dist-issue-thread/index.html) to bundle into the Evalbook, and throws this error when the viewer build output is absent. The script tells you the exact pnpm build command to produce it.","triggerScenarios":"Running the renderer before building @paperclipai/paperclip-runner's issue-thread viewer; a clean CI workspace where only `pnpm install` ran; PAPERCLIP_EVAL_VIEWER_ROOT pointing at a directory without index.html.","commonSituations":"Fresh clone followed directly by the evalbook script; switching branches where dist-issue-thread was gitignored and never rebuilt; a typo'd PAPERCLIP_EVAL_VIEWER_ROOT.","solutions":["Run `pnpm --filter @paperclipai/paperclip-runner build:issue-thread` and retry","If using a custom viewer location, ensure PAPERCLIP_EVAL_VIEWER_ROOT points at a build output containing index.html","Verify dist-issue-thread/index.html exists after the build (ls dist-issue-thread)","In CI, add the viewer build step before the evalbook render step"],"exampleFix":"// before\nnode scripts/render-runner-workflow-evalbook.mjs ...\n// after\npnpm --filter @paperclipai/paperclip-runner build:issue-thread && \\\n  node scripts/render-runner-workflow-evalbook.mjs ...","handlingStrategy":"fallback","validationCode":"await access(join(viewerRoot,'index.html')).catch(() => { throw new Error('Viewer missing; run pnpm --filter @paperclipai/paperclip-runner build:issue-thread'); });","typeGuard":"null","tryCatchPattern":"try { await renderRunnerWorkflowEvalbook(...); } catch (e) { if (e.message.includes('chat viewer')) { execSync('pnpm --filter @paperclipai/paperclip-runner build:issue-thread', { stdio: 'inherit' }); return renderRunnerWorkflowEvalbook(...); } throw e; }","preventionTips":["Add build:issue-thread to the evalbook pipeline/CI before rendering","Never point PAPERCLIP_EVAL_VIEWER_ROOT at a source dir instead of a build output","Verify index.html exists after builds in setup checks"],"tags":["build","missing-artifact","evalbook"],"backgroundTag":"file-not-found","analyzedSha":"01ad8584922b5d85292b1723cae71fa0d9b07a19","analyzedAt":"2026-09-10T03:14:50.855Z","contentChangedAt":"2026-09-10T03:14:50.855Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}